应用编码标准和自动化工具,提高代码质量

发布者:EE小广播最新更新时间:2023-04-25 来源: EEWORLD作者: IAR关键字:IAR  编码  自动化工具  代码 手机看文章 扫描二维码
随时随地手机看文章

嵌入式系统在我们的日常生活中广泛存在,从消费类电子、医疗设备,到汽车,工业控制,航空航天等,它们的存在已经成为我们生活中不可分割的一部分。随着技术的不断进步和客户需求的增加,嵌入式系统和软件变得越来越复杂,同时产品的开发周期变得越来越短。如何在短时间内开发出高质量的软件对产品的成功起着决定性的作用。


本文将介绍如何应用编码标准和自动化工具,提高代码质量。


关于代码质量


代码质量总体上是指为软件编写的代码的整体优良水平,一般可以通过下面一些指标来评价代码质量:


可读性:代码应该易于阅读和理解,即使是不熟悉项目的人也是如此。

可维护性:代码应该有条理和模块化,可以方便地修改和更新。

可移植性:代码应该被设计易于在不同的平台上使用。

可重用性:代码应该是可重用的,可以在应用程序的其他部分使用。

可测试性:代码应该是易于进行单元测试和集成测试的。

安全性:代码应该是安全的,保护敏感数据并防止恶意攻击。

性能:代码应该是高效的,专注于优化性能,以最大限度地减少资源使用。


对于嵌入式系统,代码质量更加的重要。嵌入式系统经常是处理执行关键任务功能的设备。


如果嵌入式软件存在代码质量问题,可能会导致硬件设备的故障或安全漏洞,严重影响系统的正常运行。


编码标准是提高代码质量的最佳实践


基于历史原因,目前在嵌入式开发中,主要还是使用C/C++高级编程语言,而C/C++是一种不安全的语言,包含大量未定义的行为,对于这些行为的不同解释,可能会导致未知或不确定的副作用,其中一部分将会转化为我们俗称的“Bug”。比如C语言标准库中的一些输入输出函数,字符串函数导致的缓冲区溢出的问题,指针未初始化风险,重复释放内存等等。


同时,软件开发执行和实施的核心是“人”,也就是开发人员,在实践过程中,开发人员可能会一次又一次无意地将相同类型的错误写入到他们的源代码中。这一结论来自各种权威机构,如NASA、贝尔实验室和MITRE,它们进行了多项调查和研究。这些研究的结果是给出了最佳编程实践或推荐的编程实践,它们可以有效识别有风险和不良的编码行为。


有许多指南和编码实践可用于检查常见错误以及如何避免这些错误来提高代码质量,其中一些技术和实践在实施过程中,成为众所周知的编码标准。编码标准是编码规则、指导方针和最佳实践的集合,它可以识别语言中容易引起Bug的行为,防止你在源代码中做可疑的事情,消除容易出现缺陷的代码结构,帮助你快速提高代码质量。


在嵌入式系统中,MISRA-C/C++,CERT-C/C++,CWE等已经成为事实标准。特别是在汽车、医疗和铁路等安全关键型应用中,被IEC 61508、EN 50128和ISO 26262 等功能安全标准所要求。


很多大公司都有相应的代码编程规范,尤其是针对C语言,但这些编程规范往往与业界的编程标准(比如MISRA C)的侧重点不同。一般公司的编程规范更加注重代码风格,比如命名,缩进,括号的使用等,来提高可读性,而业界的编程标准更偏重于代码的可维护性,可移植性,可靠性和安全性。在具体实践中,往往是需要这二者结合使用。


MISRA

 

image.png


MISRA C由汽车工业软件可靠性协会开发。它的目的是提高嵌入式系统环境中的代码安全性、可移植性和可靠性,特别是那些用 ISO C 编程的系统。


MISRA C标准的第一版“Guidelines for the use of the C language in vehicle based software”于1998年制定,正式名称为MISRA-C:1998。2004年进行了一次更新“Guidelines for the use of the C language in critical systems”,正式名称为 MISRA-C:2004。从1998年的vehicle based software到2004年的critical systems,因为MISRA协会发现MISRA C不仅汽车行业需要,其他一些安全相关的行业也需要。最新的MISAR C标准是MISRA-C:2012。


关于MISRA C,很多开发者都有一个误解:MISRA C只适用于汽车电子嵌入式软件开发。对此,MISRA C的轮值主席Andrew Banks特意做了解释说明:虽然MISRA最开始推出的时候主要是针对汽车行业的,但由于它本身其实是在C/C++语言的基础上,加上了一些约束,去掉了一些让人容易出错的编程方法,保留了常用的写法,尽可能让开发者保持一致,提高可维护性和可移植性,从而提高安全性和可靠性,因此 MISRA 在飞机、机器人、无人机、医疗等其它的嵌入式行业也开始流行起来,成为了全球公认的嵌入式 C 编程标准。


CERT

 

image.png


CERT C/C++由卡内基梅隆大学软件工程研究所(SEI)的计算机紧急响应小组 (CERT)部门创建和发布,为C/C++编程语言的安全编码提供规则和建议,这些规则和建议的目标是开发安全、稳定和可靠的系统。


CWE

 

image.png


CWE是基于社区开发的一组影响信息安全的软件和硬件缺陷列表。它用通用语言描述和讨论软件和硬件的缺陷,可以作为缺陷识别、缓解和预防工作的公共基线标准。因此,CWE可以帮助开发人员和安全从业者检查现有软件和硬件产品的缺陷,评估针对这些缺陷的工具的覆盖率等。


编码标准的应用对提高代码质量有立竿见影的作用。在Dr. Dobbs所做的一项研究中(Code Quality Improvement | Dr Dobb's),引入编码标准进行符合性检查后,缺陷注入率降低了41%,这节省了大量测试时间,既提高了代码质量,又缩短了工程时间,从而加速了产品上市。在这项研究中,每个月的缺陷注入率是相当稳定的,直到该组织引入编码标准,然后缺陷率急速下降(见下图)。


随着对标准遵从度的提高,质量也随之提高,偏差越来越少,缺陷率直线下降。

 

image.png


自动化工具是实施编码标准的最佳路径


有了编码标准后,应用标准意味着代码除了需要遵守语言本身的规则外,还需要遵守成百上千条编码标准所包含的规则和要求。理论上,我们可以通过人工来检查每条编码规则的实施情况,但对于日益复杂的软件显然是力不从心的。大量的实践表明,应用自动化工具是实施编码标准,提高代码质量的最佳路径。


自动化工具中我们最熟悉的就是编译器和链接器。高质量的编译器和链接器应支持现代编程语言,如最新的C和C++规范,报告每个构建步骤中可能出现的问题,以便它生成怀疑的警告,例如易失性变量或内存访问,其评估顺序可能会影响应用程序的逻辑。警告是第一道静态分析检查,绝不能忽视,尤其是在功能安全设置中。最好的建议是通过更改编译器设置将所有警告都视为错误来将警告转化为错误。这将迫使开发人员修复代码中的所有歧义,因为所有的警告都将作为真正的问题处理。


专用的静态分析工具基于源代码分析,可以在不执行程序的情况下发现潜在的问题,比如 IAR 提供了与 IAR Embedded Workbench 无缝集成的静态分析工具 C-STAT。这种类型的工具可以帮助你找到代码中最常见的缺陷来源,也可以帮助你找到开发人员在试图编写代码时往往不会考虑的问题,特别是当他们为了让某些功能运行而加入支撑代码时。静态分析工具确实能帮助你开发出更好的代码,因为它们强制执行编码标准。事实上,如果正在创建一个功能安全认证的应用,你可能会被建议,甚至强制要求使用静态分析工具。


此外,嵌入式软件在运行时仍然容易受到算术问题、缓冲区溢出、边界问题、堆完整性和内存泄漏的影响。一个可行的方法是在可能发生潜在错误的所有地方插入特定的检测代码或断言来检测此类错误。但是,手动添加指令来检测并以某种方式在运行时报告问题是一项非常耗时的任务。因此,使用动态或运行时分析工具来捕获和触发仅在运行时的缺陷和错误,是一个可以极大提高效率和生产力的方法。例如,在 IAR Embedded Workbench 中,开发人员可以使用运行时分析工具插件 C-RUN。


综上所述,编译器和链接器可以报告在构建中可能出现的问题,静态分析工具擅长发现一些未定义行为的缺陷,检查编码标准的符合性,而运行时分析工具擅长发现只有在执行时才会触发的缺陷。这些缺陷有时会有重叠,但有时只能在一个域或另一个域中检测到。为了尽可能提高代码质量,以及发现问题的效率,需要将几者结合使用并尽可能与开发和构建工具集成。下图矩阵代表组合不同工具时的完整缺陷覆盖率。

 

image.png


总结


随着嵌入式系统的复杂性提高,对于嵌入式软件的要求也越来越高,其中最核心最根本的是代码质量,而编码标准是提高代码质量的最佳实践。遵循编码标准的最有效的方式是应用自动化工具,包括静态分析工具,运行时分析工具,这样可以有效地在开发过程中提高代码质量,既减少了项目的开发时间和成本,又提高了产品的质量和竞争力。


关键字:IAR  编码  自动化工具  代码 引用地址:应用编码标准和自动化工具,提高代码质量

上一篇:什么是嵌入式核心板、一体板?米尔核心板有什么优势?
下一篇:人工智能在汽车仿真系统中发挥巨大作用

推荐阅读最新更新时间:2024-11-01 12:26

S3C2440平台下调试u-boot的方法——代码加载
本人曾经在csdn上发布了一篇 调试u-boot的方法 ,该文章具有局限性,因为它把代码加载(代码从nand flash到SDRAM的搬移)部分代码注释掉了。这篇文章就是要讨论在 调试u-boot的方法 基础上,加入代码加载的调试,所以在阅读本文前,先要读懂 调试u-boot的方法 。 一.代码加载源码: //下面添加2440中u-boot从Nand Flash启动 #ifdef CONFIG_S3C2440_NAND_BOOT mov r1, #NAND_CTL_BASE //复位Nand Flash ldr r2, =( (7 12)|(7 8)|(7 4)|(0 0) ) str r2,
[单片机]
ARMv7汇编代码分析
为了分析ARMv7架构寄存器的使用,利用C程序生成ARMv7汇编,并分析之。 1、C源程序代码如下(为了简化,函数功能很简单): # cat callfunc.c #include stdio.h #include stdlib.h #include math.h int main() { int input=10; int tmp,result; tmp = func1(input); result = func2(tmp); printf( result = %d n , result); return 0; } int func1(int a) { a++; return a; } in
[单片机]
空心轴不带内置轴承的角度编码
数控或电子同步轴越来越普遍地使用无框架电机或密封式空心轴电机,尤其在 机床 行业,印刷机械和纺织机械。这对消除如同步齿型带等带来的机械传动误差,提高传动的位置精度,减少速度波动和提高传动的动态特性显得非常重要。也容比较易设计象附加轴,夹紧轴或材料处理轴的信号线和 电源 线。 这些电机的位置编码器相应地也许要单独的设计。编码器的空心轴内径相应需要50mm。对于带摆动轴的机床旋转工作台轴,其轴径由0.5 米到几米。 如望远镜电机的方位和提升轴要求的直径在5 米以上。 设计人员希望将编码器内置于电机或轴承中从而模块化。如果电机轴承和测量轴达到一定的精度,编码器可以不用内置轴承。本文主要介绍用于带空心轴的驱动电机的模块式编码器
[传感器]
空心轴不带内置轴承的角度<font color='red'>编码</font>器
IAR 硬件仿真查看运行时间
最近做STM8的项目,IDE从Keil变成IAR非常不习惯,就像用惯VS用回VC一样。调试软件延时函数,想看一下运行效果,竟然无从下手(Keil有一个查看运行时间的窗口),网上都是用Simulator软仿真的查看,换成STLINK硬仿真之后那个窗口就没有了。 无奈,只能一个一个选项的看,直到看到一个Sampled Graph,有点像那种查看运行时间的窗口,遂上网一搜,发现了这篇文章:Watch and graph variables over time with Sampled graphs,大致就是采样变量的变化过程。一想,搞个变量变化作为观测点就可以看到一个函数的运行时间了,就试了一下,下面是买家秀: 用起来倒是方便,
[单片机]
<font color='red'>IAR</font> 硬件仿真查看运行时间
IAR开发STM8字体异常问题解决
在使用IAR开发STM8时发现,在设置完字体后,有的文件的字体的正常的,而有的文件的字体则是异常的,为此,一直感觉不爽,最近终于通过网络,参考网友的设置修正了这一问题: 字体异常 字体正常 解决问题很简单,通过对IAR进行重新设置,并重启IAR即可解决,Tools- Options...进入菜单设置,具体的设置如下图所示: 记住,先要设置字体,字体设置完后,在设置上图,设置完后需要重启IAR,即可正常。
[单片机]
<font color='red'>IAR</font>开发STM8字体异常问题解决
基于DSP的数字语音压缩系统
语音的数字通信无论在可靠性、抗干扰能力、保密性还是价格方面都远优于模拟语音信号,但这是以信道占用宽频带宽为代价的。因此为了减少语音信号所占用的带宽或存储空间,就必须对数字语音信号进行压缩编码。 一个优秀的语音压缩系统要求能够在软硬件资源占用比例低和压缩编解码时间短的同时可以实现多通道语音实时压缩。目前,G.729A算法多是在TI的5000系列DSP上实现单通道或双通道语音压缩,而本设计在现有的TMS320C6711系列DSP平台上使用最少的硬件资源和软件开销,压缩编码解码时间,实现了多通道语音实时压缩解压。 选择语音压缩编码方案 在评价一个语音压缩编码方案时,一般从四个方面考虑:质量、速率、复杂度和延时。目前 ITU-U已制
[嵌入式]
传苹果将抛弃英特尔拥抱ARM处理器:代码为证
    日前有消息传出,苹果将在10月举办Mac电脑的发布会,据称这将是一次大调整。现在外媒TechTastic报道,苹果Mac产品线的调整升级真的很大,因为最新macOS系统的源代码的中出现对ARM处理器支持的信息。 传苹果将抛弃英特尔拥抱ARM(图片来自新浪)   新 CPU的代码是ARM Hurricane(飓风),而苹果手机上的ARM处理器内部代号正是“龙卷风”的类型。如A7 = Cyclone(旋 风);A8 = Typhoon (台风);A9 = Twister (龙卷风)。又比如iPhone 7 采用的处理器A10 Fusion,是苹果 首次采用四核心设计。     对此,TechTastic认为Hurri
[手机便携]
FH8735在多路H.264高清视频编码系统中的应用
摘 要:高清视频应用已成为市场热点,为满足越来越多的高清视频采集和编码的实际需求,富瀚微电子发布了FH8735和FH8736高性能视频编码芯片和一系列最具竞争力的高清视频编码解决方案。这些方案支持1路1080p30格式或2路720p60格式的高清视频实时编码,支持HDMI、DVI、YPbPr、VGA、SDI等多种高清视频接收器的视频输入。目前该方案已在视频安防监控、视频会议、高清视频游戏、远程机房控制、远程教育和远程医疗等得到广泛应用。 1 前言 视频监控产品经历了模拟时代、数字时代、网络时代的发展后,现在已经逐步走入了高清时代。高清视频和传统标清视频相比在视频质量上有了质的飞跃。以往由于芯片编码能力、网络带宽和存
[安防电子]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved