misra c让嵌入式系统更加安全可靠的一些关键规则_第1页
misra c让嵌入式系统更加安全可靠的一些关键规则_第2页
misra c让嵌入式系统更加安全可靠的一些关键规则_第3页
misra c让嵌入式系统更加安全可靠的一些关键规则_第4页
misra c让嵌入式系统更加安全可靠的一些关键规则_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MISRA_C让嵌入式系统更加安全可靠的一些关键规则作者: Anders Lindgren, 高级研发工程师 , 瑞典 IAR 公司没人能否认嵌入式应用正变得越来越普遍。但是,当系统越来越复杂,而我们赋予系统越来越多的责任的时候,我们将必须面对一些重要问题。其中最重要的问题是:我们如何才能确保嵌入式系统是安全可靠的?C 编程语言为用户提供了许多强大的功能,几乎与汇编语言一样强大。此外, C 语言还包含了一些在标准中未明确定义的区域和不用定义就能实现的条款。用 C 来编写一个安全可靠的程序并不仅仅意味着该程序能完全按照编程者的预期来运行。它被移植到一个不同的环境下也需要正确运行。更重要的是,当其

2、他人员阅读这些源代码时,它们必须像水晶一样清晰明了:一方面简化了不必要的猜测和诠释,另一方面当基于这些代码来做进一步开发时,能规避诱发新错误的风险。汽车工业软件可靠性协会 (MISRA) 采取的措施是定义一套 C 编程语言的子集。如果在应用开发中仅使用这个子集,那么许多 C 编程语言中存在的缺陷就能被规避了。这个子集名称为 MISRA C ,在一本名为“ Guides For The Use Of The C Language In Vehicle Based Software ”的手册中有具体定义。该指南共包括 127 条规则,分为“必选”和“建议”两类。 IAR Embedded Work

3、bench 中几款产品(参见以下列表),内建了一个能检查绝大多数 MISRA C 规则的检查器,但是某些规则是无法被自动检测的。 如果在编写应用时忘了使用这些规则,以后再去修改应用以符合这些规范将非常困难。比如, MISRA C 第 118 条规则禁止使用动态分配内存,第 101 条规则规定禁止使用 指针运算 ,第 102 条规则表示不可以使用 超过两级的间接指针 。 另一方面,有几条规则是非常简单明了和成熟,即使你没有想过让你的应用做到 100% 的 MISRA C 兼容,如果能支持其中几条也至少能让应用更可靠一些。 在这篇文章里,我将推荐一些应该适用于所有项目的规则,即便你没想做到 100

4、% 的 MISRA C 兼容。这些被挑选出来的规则通常是编译器不会去检查的。 在 IAR Embedded Workbench 中使用 MISRA C 在 IAR Embedded Workbench 中, MISRA C 的界面非常简单易用,你可以直接选择你所希望检查的规则,也可以在 MISRA C 标签下的 通用选项 部分的 Options 菜单列表中进行选择 。如果你使用命令行方式,你可以使用 -misrac 和 -misrac_verbose 命令选项。 大多数规则都由编译器自身来检查。然而,一些规则考察进入到整个应用才能检查,在这种情况下,链接器将执行检查。你可以分别通过列表文件和映

5、射文件来察看被允许使用的规则和检查过的规则列表。请注意,有些规则是不能被自动检查到的。 规则 13 ( 建议使用 ) 该条规则声明: 应用程序不应直接使用 char,int,float, 等基本数据类型,而应在特定的编译器中专门 typedef 自己定义特定长度的类型名称,并将 typedef 所定义的类型使 用到代码当中去。 原因是不同的编译器对基本类型会使用不同的底层表达方式。最常见的例子是 int 类型在某个编译器中被当作 16 位处理,而在另一个编译器中被当作 32 位处理。 根据个人经验,我一般会仔细选择定长类型的大小和符号。当我需要表示一个不可能为负数的东西时,我会选择使用 uin

6、t16_t ,而不是简单的用 int 表示。这样写代码的好处之一是代码很容易被读懂和理解,读者无须考虑该表达式为负数的情况。 1999 年版本的 C 标准包含的头文件 stdint.h 中,提供了 int8_t 和 uint32_t 形式的类型名称。 IAR Embedded Workbench 在 DLib 标准库中支持这一头文件。 规则 23 ( 建议使用 ): 具有文件范围作用域的所有对象声明都尽量定义成静态的。 正如你可能知道的那样,在应用程序中定义的静态变量和函数是无法被其他模块直接使用的。 该规则: 防止你无意间误用内部帮助函数和文件内部的变量 促使你认真设计新模块之间的接口 使程

7、序接口更加清晰明了是一件很重要的事情,因为当时间久了之后,当初写代码的人未必能够继续留在那里维护应用程序。 使用 IAR Embedded Workbench 时,链接器会在整个应用范围内检测这条规则。 规则 33 ( 必需使用 ): 操作符 & 和 | 的右侧表达式不得包含副作用 你可以用 C 语言写出如下代码: if (x = y) | (*p+ = z) /* do something */ 在这个例子中,仅当 | 操作符左边的表达式为假 - 即 x 和 y 不相等时,才对右边的表达式进行求值(副作用就此产生)。在上述例子中,所谓的副作用就是增加了指针 p 的值。 虽然在标准中已经详细说

8、明了该种行为,但在写代码的过程中还是容易犯下这种错误。即使写代码的人设法正确了解了这种行为,然而每个试图阅读代码或维护代码的人员也仍必须理解这些规则和程序员的意图。 以上代码可以按照另一种更为简洁明了的顺序重新编写: int doSomething = 0; if (x = y) doSomething = 1; else if (*p+ = z) doSomething = 1; if (doSomething) /* do something */ 规则 59 ( 必需使用 ): if, else if, else, while, do . while 和 for 语句块必须用 括起来 基

9、本上来说,你必须整理好思路,不要随便的写出如下例中所示的 else 子句。 if (x = 0) y = 10; z = 0; else y = 20; 这条规则意在避免一个经典错误。在下面的例子中,另外增加了一行“ z = 1 ; ”。这行语句看上去是属于 else 子句的一部分,但其实并不是这样。事实上,这句语句紧接在全部的 if 语句块之后,这意味着该赋值将总是发生。 如果一开始就能够将 else 子句用大括号括起来,就不会产生这样的问题了。 if (x = 0) y = 10; z = 0; else y = 20; z = 1; 产品支持 IAR 在以下的编译器产品中已经支持了 MI

10、SRA C 的兼容性检查。请注意只有在标准版本中(而不是评估版或代码限制版)该功能才能启用。 IAR Embedded Workbench for 78K0 IAR Embedded Workbench for 8051 IAR Embedded Workbench for ARM IAR Embedded Workbench for AVR IAR Embedded Workbench for AVR32 IAR Embedded Workbench for CR16C IAR Embedded Workbench for H8 IAR Embedded Workbench for M16C

11、 IAR Embedded Workbench for M32C IAR Embedded Workbench for MAXQ IAR Embedded Workbench for MSP430 IAR Embedded Workbench for PIC18 IAR Embedded Workbench for R8C IAR Embedded Workbench for S12 IAR Embedded Workbench for V850 参考文档 Guides For The Use Of The C Language In Vehicle Based Software 汽车工业软件

12、可靠性协会, 1998 年 4 月 集成 Misra C 的 IAR Embedded Workbench IAR Embedded Workbench是一套用于编译和调试嵌入式系统应用程序的开发工具,支持汇编、C和C+语言。它提供完整的集成开发环境,包括编译器、汇编器、工程管理器、编辑器、编译链接工具和C-SPY调试器。 广泛的芯片内核支持 - HCS12, M16C, M32C , R32C , V850, 78K, S08 - ARM, AVR32 , ColdFire - 8051, AVR, PIC, SAM8, R8C , MSP430 等 编译产生的代码尺寸小、实时性强 IAR

13、Systems 是全球第一家做 C 编译器的公司,先进的技术保证了编译器能产生可靠、紧凑的代码 集成多种内核识别调试插件,包括 OSEK Run-Time Interface (ORTI) 通过它可以在调试器中显示 RTOS 内部数据结构窗口,从而了解每一个项目应用中运行任务的信息,每一个信号灯、互斥量、邮箱、队列、事件标志信息,以及等待上述内核对象的所有任务列表信息 集成 MISRA C 校验模块, 对代码进行可靠性检验 支持多种仿真器,如 IAR J-Link/J-Trace、ROM-Monitor、MK-II、E8、Minicube2、P&E等; 状态机建模工具:设计阶段可靠性保证 vi

14、sualSTATE 是一套精致、易用的开发工具, 包含图形设计器、测试工具包,代码生成器和文档生成器, 用于设计、测试和实现基于状态图设计的嵌入式应用。该款工具提供了先进的验证和测试模块,可以产生 100% 与 您系统设计一致的紧凑 C/C+ 代码 ,并 可以在任何 8 位、 16 位、 32 位架构上运行。此外,它革命性地与 IAR Embedded Workbench C/C+ 编译调试环境无缝集成 ,能够真正做到基于硬件去调试状态机模型,并以直观的图形方式反馈出各个设计层面的详细信息 基于统一建模语言 (UML) 状态机理论的图形化模型设计; 对设计模型进行规范性验证,检查系统的逻辑一致

15、性,鉴别出系统设计漏洞或错误; 设计过程的早期阶段,甚至在硬件设计尚未完成之前,就可以使用测试工具来确保应用能按照预想方式运行; 自动代码生成功能可以生成极为紧凑的 C/C+ 代码, 100% 与设计保持一致; 自动文档生成功能提供了详尽的信息; 与 IAR Embedded Workbench 无缝集成,提供多种微控制器和评估板的现成示例代码; 通过 CSPYLink 或 RealLink 对目标器件进行综合的图形化状态机调试; 支持多种硬件调试接口,例如 J-Link 、 通用 JTAG 仿真器 、 NEXUS 仿真器等 更多信息,请查阅 。 下面是三个励志小故事,

16、不需要的朋友可以下载后编辑删除!谢谢!你可以哭泣,但不要忘了奔跑2012年,我背着大包小包踏上了去往北京的火车,开启了北漂生涯。彼时,天气阴沉,不知何时会掉下雨滴,就像我未知的前方一样,让人担忧。去北京的决定是突然而果决的,我在宿舍纠结了一天,然后在太阳逃离窗口的时候打电话告诉父母,我要到首都闯一闯。消息发出去之后,并没有预料之中的强烈反对,父亲只给我回了一个字:好。就这样看似毫无忧虑的我,欣喜地踏上了北上的路。有些事情只有真正迈出第一步的时候,才会迎来恐惧。当我踏上北上的列车时,才惊觉对于北京,除了天安门、央视大楼这些着名建筑,我知之甚少。俗话说无知者无畏,可于我而言,这句话并不适用,因为在

17、坐上火车那一刻,我就开始对未来胆战心惊,毫无底气。火车开动之后,我的心情变得更加复杂而紧张,甚至一度心生退意。人类果然是一个无解的方程式,看似无畏的勇气背后不知藏下了多少怯懦和犹豫。旁座的姐姐见我一人,开始和我有一搭没一搭地聊起了天。几分钟后,我们竟如同许久未见的好友一般,开始聊起了各自的生活。我说出了自己的恐惧与未见,期冀从她那里得到些许安慰和鼓励。出乎意料地,她并没有说一些心灵鸡汤般的哲理语句,反而给我讲了一个故事,一个让我在很长一段时间都印象深刻,每次想起便会荷尔蒙再度升高的故事,一个她自己的故事。那是一段并不愉快的经历,整段经历是蜿蜒前行的。高考中,她因为做错了三道大题,成为家里的罪人

18、。朋友极尽嘲笑,亲戚们也开始暴露自己毒舌的属性,父母当时并没有过多指责,因为他们正在跟自己的兄弟姐妹们为了祖母的遗产争得死去活来。那被人类歌颂的血缘、亲情,在所有的利益面前瞬间分崩离析。那时的她,像极了一个被遗弃的孩子。或是为了远离当时一片狼藉的场面,家境拮据的她,怀着可能被众叛亲离的勇气,报考了一个三本院校。当她怀揣着自己暑假赚的6000块钱踏进学校的时候,她以为一切喧闹终将与自己隔绝。但是事实上,天真的想法只维系了几天,便不攻自破。专业老师并不看好这个寡言少语的孩子,因为在她看来,法律专业除了要掌握专业知识之外,利索的嘴皮子也是一名律师出人头地不可缺少的法宝,而这个孩子,显然并没有这方面的

19、天赋。糟糕的情况在不断地蔓延,那段时期,她如同造物者手中的失败品,什么都做不好,注意力像手中的沙子一般怎么握都握不住。课文理解不了,丧失阅读能力,法律条款、单词统统在跟她作对,连最简单的问题都会堵住她的嘴。考试更不用提了,考前总是睡不好觉,刚迈进考场全身就开始发抖,像个从来没有上过战场的士兵一样。她一直溺在泪水中,从未上岸,深度抑郁,一度心生退学的想法。她深夜给母亲打去电话,想要获取安慰,家人说当初你自己做的决定,于是她只好自己硬撑着。为了防止自己再胡思乱想,她报了八门选修课,把自己的时间填得满满的。为了应付每科超过6000字的论文,她总是第一个跑到食堂去打饭,背日语,背法语,做英语听力,背法

20、律常识虽不至于像匡衡一样凿壁偷光,但是只要有光的地方,她都待过。一个追着阳光跑的人,是永远不会输在路上的。在不停歇的灌输之下,大脑勉强接受了来自外界的压迫。虽不能到达天才的地步,但是起码恢复了正常的记忆功能。四年的大学生涯也在马不停蹄中准备落下帷幕,为了能够拿到好的工作机会,她到处参加比赛,只是为了让自己在与聘用单位较量时能够多一点筹码。与此同时,她还要忙毕业论文。在有限的时间内打一场不能失败的战争,是那时她的唯一目标。上天果然不会亏待努力的人,她的毕业论文很惊艳,老师甚至生出了让她留校任教的打算,不过还是被她拒绝了,因为她已经进入了当地最着名的一家律师事务所。在刚进入事务所的时候,她过去光鲜

21、的外衣再次黯然失色。为了能够追赶同事的步伐,她过上了每天哒哒哒飞速敲打键盘的生活。为了跟进一个案子,她常常整夜都在做准备,等到一切就绪时,晨光也恰好如期而至。如今,她已经成为北京最着名的律师事务所的招牌律师之一。这次她本可坐飞机回京,只是因为贪恋沿途的风景才会与我相遇。在最难熬的时光要学会一路狂奔,不要多想,也不要把希望寄托在别人身上,人生来便是要努力的,你可以哭泣,但是不要忘了奔跑。她拍着我的肩膀,身上散发着莲花的香味,清新而让人愉悦。终点站很快到达,天空依然阴沉着,不知下一秒云上染墨,雨滴降落,还是阳光冲破云雾,普照大地。当我与她告别,重新背着沉重的行李,阔步向前,我知道等待我的不一定是美

22、好的未来,但是只有拼一拼,才足够对得起自己。每个人都有一个蜕变的过程,这个过程只能自己咬着牙度过,熬过了便化茧成蝶,熬不过,便像蒲公英一样,被生活的风吹着走。一辈子走好一条路有两个西班牙人,一个叫布兰科,一个叫奥特加。虽然他们同龄,又是邻居,但家境却相差很远。布兰科的父亲是一个富商,住别墅,开豪车。而奥特加的父亲却是一个摆地摊的,住棚屋,靠步行。从小,布兰科的父亲就这样对儿子说:“孩子,长大后你想干什么都行,如果你想当律师,我就让我的私人律师教你当一名好律师,他可是出名的大律师;你如果想当医生,我就让我的私人医生教你医术,他可是我们这里医术最高的医生;如果你想当演员,我就将你送去最好的艺术学校

23、学习,找最好的编剧和导演来给你量身定做角色,永远让你当主角;如果你想当商人,那么我就教你怎样做生意,要知道,你老爸可不是一个小商人,而是一个大商人,只要你肯学,我会将我的经商经验全都传授给你!”奥特加的父亲则总是这样对儿子说:“孩子,由于爸爸的能力有限,家境不好,给不了你太多的帮助,所以我除了能教你怎样摆地摊外,再也教不了你任何东西了。你除了跟我去学摆地摊,其他的就是想也是白想啊!”两个孩子都牢牢地记住了自己父亲的话。布兰科首先报考了律师,还没学几天,他就觉得律师的工作太单调,根本就不适合他的性格。他想,反正还有其他事情可以干,于是,他又转去学习医术。因为每天都要跟那些病人打交道,最需要的就是

24、耐心,还没干多久,他又觉得医生这个职业似乎也不太适合他。于是,他想,当演员肯定最好玩,可是不久后,他才知道,当演员真的是太辛苦了。最后,他只得跟父亲学习经商,可是,这时,他父亲的公司因为遭遇金融危机而破产了。最终,布兰科一事无成。奥特加跟父亲摆了几天地摊后,就哭着不肯去了,因为摆地摊日晒雨淋不说,还常遭人白眼。可是,一想到除了摆地摊,再也没别的事可干,他又硬着头皮跟父亲出发了。可是,还没干几天,他又受不了了,又吵着闹着不肯去了。因为没事可干,不久,他又跟着父亲出发了。慢慢地,他竟然从摆地摊中发现,要想永远摆脱摆地摊的工作,就得认真地将地摊摆好。结果,几年后,他终于拥有了自己的专卖店。30年后,

25、他拥有了属于自己的服装集团。如今天,该集团在世界68个国家中总计拥有3691家品牌店,一跃成为世界第二大成衣零售商。奥特加(AmancioOrtega)以250亿美元个人资产,位列福布斯2010年世界富豪榜第9位。人并不是选择越多越好,因为多了反而拿不定主意,无法坚持到底。反而是那些没有选择的人,最终获得了成功。把理想推远一点比尔拉福是美国当代的著名企业家。比尔从商的志向来自他的父亲,他的父亲在商界滚打多年却始终没有取得什么骄人的成绩。受父亲影响,比尔从小就立志要做一位成功的商人,更何况他的父亲也认为他做事机敏果断,敢于创新,非常具有商业天赋,所以一直鼓励比尔去读经济或者商贸类大学。让父亲没有

26、想到的是,比尔在高中毕业后,却来到麻省理工学院学习工科中最基础最普通的机械制造专业。比尔的父亲生气地指责比尔说:“你一定是忘记了自己的理想,要知道,你并不是要做一位出色的工人,而是做一位成功的商人,你为什么不读商业贸易,反而要来学机械制造呢?你这不是拉近理想,分明是把理想推得更远了!”比尔不赞同父亲的观点,他觉得适当把理想推远一点是正确的,因为工业商品在商贸中占了绝对的大多数,如果不具备工科知识,就不能了解产品的性能、生产制造等各方面的情况,将来很难保证能在经商中占到优势,更何况工科学习不仅是增强工业技能,还能帮助一个人建立严谨求实的思维能力,培养一种脚踏实地的工作态度,这些素质都是经商所不能缺少的。听了比尔的解释,他的父亲终于明白了比尔的想法,比尔也得以留在麻省理工学院继续读书,四年的大学,比尔没有拘泥于本专业,他同时还学习了许多化工、建筑、电子等方面的基

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论