当前位置:首页 > 单片机 > 单片机
[导读] 如果我们自己编写了一个程序,程序能正常编译,运行起来也实现了我们期望的输出,那是不是这个程序就很完善了呢?对于工业产品来说,“好”、“能用”和“完善”,或者说“标准&

 如果我们自己编写了一个程序,程序能正常编译,运行起来也实现了我们期望的输出,那是不是这个程序就很完善了呢?对于工业产品来说,“好”、“能用”和“完善”,或者说“标准”,甚至是代码的“安全”,显然不是一个层面的东西。因为C语言虽然是我们开发嵌入式应用的最主要工具之一,然而C语言并非是专门为嵌入式系统设计,相当多的嵌入式系统较一般计算机系统对软件安全性有更苛刻的要求;例如在那些对安全性要求很高的系统中,如飞行器、汽车和工业控制中,只要代码的工作稍有偏差,就有可能造成重大的财产损失或者人员伤亡。

那么如何衡量我们的代码是否满足某些标准,是“安全的”、“健壮的”呢?此时我们就可以根据具体的应用来查找相关的行业标准。举个例子,在工业领域中,MISRA-C就是在的某些行业中要求遵守的行业标准。MISRA C是由汽车产业软件可靠性协会(MISRA,motor industry software reliability association)提出的C语言开发标准。其目的是在增进嵌入式系统的安全性及可移植性。针对C++语言也有对应的标准MISRA C++。MISRA C一开始主要是针对汽车产业:如果我们去参加近几年的有关汽车行业的基于自动代码生成技术和基于模型的设计技术的讲座、研讨会等等,无一例外都会听到有关MISRA-C 2004,甚至是MISRA-C 2008、MISRA-C 2012等更新版本的介绍。此外,其他产业也已经逐渐开始使用MISRA C:包括航空航天、电信、国防、医疗设备、铁路等领域中都已有厂商使用MISRA C:这些领域无一不对代码的规范,特别是代码的安全有非常高的要求。MISRA C的第一版《Guidelines for the use of the C language in vehicle based software》是在1998年发行,一般称为MISRA-C:1998.。MISRA-C:1998有127项规则,规则从1号编号到127号,其中有93项是强制要求,其余的34项是推荐使用的规则。在2004年时发行了第二版的MISRA C的第一版《Guidelines for the use of the C language in critical systems》(或称作MISRA-C:2004),其中有许多重要建议事项的变更,其规则也重新编号。MISRA-C:2004有141项规则,其中121项是强制要求,其余的20项是推荐使用的规则。规则分为21类,从“开发环境”到“运行期错误”。通常认为,如果能够完全遵守这些标准,则你的C代码是易读、可靠、可移植和易于维护的。最近很多嵌入式开发者都以MISRA C来衡量自己的编码风格,比如著名的uC/OS-II就得意地宣称自己99%遵守MISRA标准。目前有许多工具声称可以检查代码和MISRA规则相容性,不过MISRA没有相关认证的程序。相关工具可以帮助使用者评估和比较检查的结果,也会提供一些可符合MISRA-C规定的指南,但是目前大部分的工具对静态代码分析的工具检查基本能实现,对动态代码分析则还不能完美实现。

考虑到MISRA-C:2004有141项规则,其中仅强制要求就有121项,其余的20项是推荐使用的规则,显然让我们仅仅是把这么多规则浏览一遍就需要花费大量的时间,更不用提手工对照规则来检查我们的软件了。幸好我们使用的DSP编程环境CCS提供了相应的选项,使得编译器可以自动检查我们的代码是否违反了MISRA-C的相关规则,并提供给我们详细的诊断与警告信息。

在C语言的标准ANSI C 和 ISO C之后,又产生了更新的C99以及最新的C11 (ISO/IEC 9899:2011),但是因为最新版本的规范从推出到各大编译器厂家支持以及开发者的适应都需要一定的时间,所以目前最常用的仍然是ANSI C或者C99。与此类似, 虽然MISRA-C的标准最弱已经有最新的2012,但是人们谈论和使用最多的仍然是2004版本,所以在CCS的编译器选项里仍以MISRC-C:2004的规则为准。

启用了--check_misra={all|required|advisory|none|rulespec}的选项使能MISRC-C:2004规则检查之后,还可以在代码中可以配合相关的预处理指令使能某些代码的检查/停止检查功能,包括:

#pragma CHECK_MISRA ("{all|required|advisory|none|rulespec}");

#pragma RESET_MISRA ("{all|required|advisory|rulespec}");

其中,CHECK_MISRA用来使能或者禁止对MISRC-C:2004规则的检查,它的作用与--check_misra是一致的。RESET_MISRA则用来复位MISRC-C:2004规则检查的状态。

rulespec参数则可以用来指定我们使用哪些MISRC-C:2004中的哪些规则来进行特点的检查,包括:

[-]X 使能 (或者禁止) X主题下各个规则的检查。(主题包括变量、字符、初始化等)

[-]X-Z 使能 (或者禁止) 从X到Z主题下各个规则的检查

[-]X.A 使能 (或者禁止) X主题下规则A的检查。

[-]X.A-C 使能 (或者禁止) X主题下从规则A到规则C的检查。

举例说明:--check_misra=1-5,-1.1,8.2-4的含义是:

检查从主题1到主题5的规则。(不清楚的网友可以去搜索MISRA规范,1.环境;2.语言扩展;3.文档;4.字符集;5.标识符)

禁止规则1中1.1条目的规则(规则1.1(强制): 所有代码都必须遵照ISO 9899:1990 “Programming languages - C”,由ISO/IEC 9899/COR1:1995,ISO/IEC 9899/AMD1:1995,和ISO/IEC9899/COR2:1996 修订),规则1中的其它规则保持有效。

检查主题8中的规则2到4.为了方便,我们可以列出这几条规则的定义(其内容较长,有兴趣的网页请在搜索引擎中检索):

主题8: 声明与定义

规则8.2(强制): 不论何时声明或定义了一个对象或函数,它的类型都应显式声明。

规则8.3(强制): 函数的每个参数类型在声明和定义中必须是等同的,函数的返回类型也该是等同的。

规则8.4(强制): 如果对象或函数被声明了多次,那么它们的类型应该是兼容的。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭