原创 MISRA:2004 嵌入式软件可靠性设计规范(1)

2011-11-16 15:45 3804 9 16 分类: 消费电子

声明如下:

1、最近频繁出差和几个项目的攻关,实在未能抽出时间写文章贡献,愧对大家,正努力改进中;

2、嵌入式软件可靠性之于系统的重要性,如女主人之于家庭的重要性,须谨慎对待之。若欲做好,可研究下军工嵌入式软件设计规范、汽车控制电子MISRA设计规范、医疗电子报警和可使用性设计规范、GJB5000军工软件能力成熟度模型四个方面的内容。如下文章是MISRA的原版翻译稿,先供参考。后续相关不少内容持续写作中......

开发环境

规则 1.1 所有代码应该遵循ISO 9899:1990 C语言编程规范,该规范根据如下标准修订: ISO/IEC 9899/COR1:1995, ISO/IEC 9899/AMD1:1995, 和 ISO/IEC 9899/COR2: 1996

规则 1.2 不应该依赖于没有定义或不明确的行为.

规则 1.3只有当目标代码的语言/编译器/汇编器符合统一定义的接口标准的时候,才能使用多个编译器或多种语言。

规则 1.4应该检查编译器/链接器,确保外部标识符能够支持31个区分大小写有效字符。

规则 1.5浮点实现应该遵守定义的浮点标准

语言扩展

规则 2.1汇编语句应该被封装并且隔离。

规则 2.2源代码只能使用C风格的注释。

规则 2.3字符串 /* 不应该在注释中出现。

规则 2.4代码段不应该被注释掉。

文档化

规则 3.1所有使用已定义实现行为的地方都应该文档化。

规则 3.2所使用的字符集和相应的编码应该文档化。

规则 3.3在所选编译器中实现的整除运算,应该具有确定性,并记录下来予以考虑。

规则 3.4所有使用的 #pragma 命令都应该文档化并做出解释。

规则 3.5如果被依赖,应该对已定义实现的行为和位域封装在文档中进行记录。

规则 3.6所有产品代码中使用的库都应该与遵守本文的规定,并经过适当的验证。

字符集

规则 4.1只能够使用在ISO C标准中定义的换码符。

规则 4.2不允许使用三元符。

标识符

规则 5.1标识符(内部或外部)不应该依赖于超过31个字符表示的意义

规则 5.2内部标识符不应该与外部标示符重名,否则应隐藏该标识符。

规则 5.3 一个typedef的名称应该具有唯一的标识符。

规则 5.4标签名应该具有唯一的标识符。

规则 5.5静态存储的对象或函数的标识符不应该被重用。

规则 5.6一个命名空间中的标识符不能与其它命名空间中的标识符重名,结构和联合体成员的名称除外。

规则 5.7不应该重用标识符名称。

数据类型

规则 6.1 (普通)Char类型只能用来存储使用字符

规则 6.2 Signed和unsigned char只能用于存储和使用数值。

规则 6.3 应使用显示大小和符号的typedef来代替基本数据类型。

规则 6.4 位域只能用于所定义的 unsigned int 或 signed int 类型。

规则 6.5 signed int的位域至少为2个位长度

常量

规则 7.1 不应使用八进制常数(0除外)或八进制转义字符。

声明和定义

规则 8.1 函数应有原型声明,且该原型应在函数定义和调用处出现。

规则 8.2任何时候定义或声明的对象或函数应显示说明其类型。

规则 8.3每个函数中输入和返回参数的定义和声明的类型应该一致。

规则 8.4多次声明的对象或函数,其类型应相互兼容。

规则 8.5头文件中不应出现对象或函数的定义。

规则 8.6函数应定义在文件范围内。

规则 8.7仅在单个函数内访问的对象应定义在块范围内。

规则 8.8一个外部对象或函数应该在一个并且只有一个文件中声明。

规则 8.9具有外部链接的标识符应有唯一的外部定义。

规则 8.10文件范围内函数或对象的所有声明和定义应该具有内部链接,否则应具有外部链接。

规则 8.11静态存储类关键字应在有内部链接的对象和函数的定义和声明中使用。

规则 8.12声明为外部链接的数组,应显示说明其大小或在初始化时清楚的定义.

初始化

规则 9.1 所有自动变量应该使用前应该赋值。

规则 9.2括号应该用于指示和匹配非零初始化的数组和结构体的结构。

规则 9.3在枚举列表中,除非同时显式初始化所有成员,不应使用'='构造单独对第一个之外的个别成员显式初始化。

算术类型转换

规则 10.1 以下情况下,整型表达式中不允许出现隐式数据类型转换:

a)整型操作数不是被扩充为更多位数的同符号整数;

b)表达式是复杂表达式;

c)表达式不是常数表达式,且是函数的参数;

d)表达式不是常数表达式,且是函数的返回表达式。

规则 10.2以下情况下,浮点数表达式中不允许出现隐式数据类型转换:

a)浮点型操作数不是被扩充为更多位数的同符号浮点数;

b)表达式是复杂表达式;

c)表达式是函数的参数;

d)表达式是函数的返回表达式。

规则 10.3复杂的整型变量转化为窄整型变量时必须按照如下的方式使用强制转换。

规则 10.4复杂浮点类型的变量可以转换成窄浮点类型变量。

规则 10.5当位操作符~和移位操作符<<(或>>)的操作对象为unsigned char或者unsigned short类型时,其运算结果必须先显式转换为对应的数据类型。

规则 10.6所有无符号常数应加 “U”后缀。

指针类型转换

规则 11.1 指向函数的指针不能转化为除整型以外的其它任何类型。

规则 11.2指向对象的指针只能转换为整型,或者指向同类型对象的其他指针,或者是void类型。

规则 11.3指针和整型类型之间不应该做类型转换.

规则 11.4不同数据类型指针之间不应该做类型转换.

规则 11.5对指针进行类型转换时不允许将限定词const和volatile删除。

表达式

规则 12.1表达式中有限制的依赖应建立在C语言的优先级规则之上。

规则 12.2表达式的结果在标准允许的任何顺序的计算情况下都应该是一样的。

规则 12.3 sizeof操作符不能用在包含副作用的表达式上。

规则 12.4逻辑操作符&& 或 || 的右侧操作数不应带有副作用。

规则 12.5逻辑操作符&& 或 || 的操作数应作为主要表达式。

规则 12.6逻辑操作符(&&, || , !) 的操作对数应该是有效布尔型。有效布尔型表达式不应该与除逻辑操作符(&&, || ,!)之外的其他的操作符一起运算。

规则 12.7位操作符的操作数的潜在数据类型不应为有符号数。

规则 12.8移位操作时,操作符右侧的操作数的数值应大于于0,且小于左侧操作潜在数据类型的位长度。

规则 12.9一元负号操作符不应在潜在无符号数据类型的表达式中出现。

规则 12.10不应使用逗号操作符。

规则 12.11赋值表达式中使用无符号整形操作数时不应导致循环溢出。

规则 12.12不得使用任何形式的潜在位来表示浮点。

规则 12.13位操作符的操作数的潜在数据类型不应为有符号数。

控制语句表达式

规则 13.1在返回布尔值的表达式中不应使用赋值操作符。

规则 13.2判断一个值是否为0 应该是显式的,除非该操作数是一个布尔值。

规则 13.3不允许对浮点数进行相等或者不相等的比较,即使是非直接的比较也是不允许的。

规则 13.4浮点变量不应作为循环计数器使用。

规则 13.5只有与循环控制相关的表达式才会出现在for语句中。

规则 13.6在一个循环中用于迭代计算的数字变量不得在循环体内修改变量值。

规则 13.7布尔表达式的值必须是可以改变的。

控制流

规则 14.1不应有不可达代码。

规则 14.2非空语句应产生副作用,或者使控制流改变。

规则 14.3一行中如果有空语句,那么该行只能有这条空语句,不能有别的语句,并且在这条空语句前不能有注释,注释必须在其后,用空格隔开。

规则 14.4不应使用goto语句。

规则 14.5不应使用continue 语句。

规则 14.6循环体中最多只能出现一个break 语句用于结束循环。

规则 14.7函数只应有一个出口,这个出口必须在函数末尾。

规则 14.8 switch , while, do… while 和for 语句的主体应是复合语句,即使该主体只包含一条语句。

规则 14.9 if 结构后面应是一个复合语句(即用大括号包含) ,else 后面必须是一个复合语句(即用大括号包含) 或者另一个if 语句。

规则 14.10 if …else if 结构应由一个else子句结束。(未完待续)



MISRA:2004 嵌入式软件可靠性设计规范(2)

PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

wuyeqing_363494696 2011-12-1 17:54

没有耶

用户1326533 2011-12-1 13:54

医疗电子报警和可使用性设计规范 有没有自动检测的软件可以用的

用户1366145 2011-11-25 13:15

没有规矩不成方圆。顶一个。

用户1114337 2011-11-17 11:19

感谢您!

用户1039176 2011-11-17 08:32

受教,谢谢!

用户1631043 2011-11-17 07:59

谢谢

用户1602177 2011-11-16 15:22

很珍贵的读书笔记,感谢武老师的分享,辛苦了~~

fallrain116 2010-10-23 00:11

多核DSP的处境还是比多核通用处理器要好很多。因为DSP本来就定位于数据平面,设计可以更清晰地分割到多个内核。如果硬要把DSP扯到通用处理器市场和ARM来比的话,那也没办法了。

fallrain116 2010-10-22 22:25

6474裁剪自6487,6472裁剪自更老的6486/TNETV3020……Freescale也将自己的基站DSP MSC815x裁剪成MSC825x,呵呵呵,能购重复利用,赚取额外收入,何乐而不为?

fallrain116 2010-10-22 22:08

XScale以及更早的StrongARM是Intel收购DEC得来的,Intel不可能帮助自己最大的对手ARM挣钱的,所以买掉XScale是必然。但是统一x86架构的ATOM可谓是一个失败之作。
相关推荐阅读
武晔卿 2017-05-13 06:38
接地线缆的选型错误
无论是Ⅰ类设备(有PE保护接地Earth),还是Ⅱ类设备(浮地或整机浮地但有内部的金属板充作保护公共地使用的),常见一些与EMC与可靠性的接地线错误应用,因此导致EMI干扰,该泄放的高频干扰泄放不掉而...
武晔卿 2017-03-17 07:43
电磁兼容设计整改三要素分析:电压容限、高频特性、回流路径
深入浅出抓本质 电磁兼容公益讲座 讲解内容: l 打静电时会复位重启,复位端、地线端、电源端发生了什么?——电压容限 l 浪涌发生时,有防雷防护,为什么后面电路仍然坏?为什么有起火? ——失效机理 l...
武晔卿 2017-02-23 14:11
一个工程师风花雪月的事
一位新毕业研究生电子工程师A的故事。 研究生三年,小A一直暗恋本校另外系的一个女生,但又怯怯地不敢表白。做毕业论文的时候,在实验室里,心绪烦乱,幻想着她羞涩一笑中牵她手的样子,不由得偷笑出来。但一想到...
武晔卿 2016-06-29 10:42
对开关管损坏做失效分析的一种方法
        电路板工作中不可能不发生芯片或半导体器件的损坏,损坏后,要想从器件的尸体上发现其死因,并能知晓导致其死伤的应力和作用路径,自然就可以很容易的...
武晔卿 2016-06-29 10:31
电路及元器件故障探查及原因分析方法
        电路板上器件故障之后,哪里坏掉了?坏到了什么程度?怎么坏的?会因其隐蔽性而难以查找具体故障点,也因为对故障原因故障机理不清楚而导致无从下手,或者只能用倒推法,用逐个实验的方式,将各...
武晔卿 2016-05-03 07:51
如何排查电子产品在用户现场偶发的故障?
工作中,不少朋友,几乎每位工程师,都遇到过电子产品在用户现场偶尔发生故障,如死机、复位、数据传输错误等。维修工程师在现场跟踪排查时,故障又不会再现,拿回实验室,怎么试验又都是好的。使人陷入一种无从...
EE直播间
更多
我要评论
7
9
关闭 站长推荐上一条 /3 下一条