1 C++在嵌入式应用中的机遇与挑战
C++作为一门高级语言,人们在提及它时,总难免会谈到C语言。直至今天,很多人对于C++语言的认识依然是“C语言的超集”。这是因为C++的起源与C语言有着千丝万缕的联系。
1978年,美国贝尔实验室的Dennis Ritchie和BrianKernighan在BCPL以及其简化版本B语言的基础之上开发了C语言,并合作出版了《The C Programming Lan-guage》。C语言迅速得到了大家的认可,并广为流传。1989年,ANSI推出了第一个C语言的标准——X3.159-1989,并被ISO采纳,随之发布。ISO/IEC 9899-1990。早在C语言标准发布之前,贝尔实验室的Bjarne Stroustrup就致力于在C语言里增加类、函数类型检查以及其他的一些优秀特征,于1980年发布“C with Classes”。经过持续的努力,他最终完成了对C语言的改造,由此创生出一门新语言——C++,并出版了《The C++ ProgrammingLanguage》一书。由于它带来了持续的影响,ISO于1998年发布ISO/IEC 14882:1998;几乎同一时间,ANSI也发布了类似标准,这标志着C++作为一门独立语言的标准化得到了官方的认可。
统计数据表明,日常生活中一个美国人平均占用8个微控制器,这些都离不开嵌入式系统的应用。然而嵌入式系统软件技术似乎落后于当前的软件发展形势,近年来才逐渐由汇编语言过渡到面向过程的C语言。但对于面向对象语言的应用还很有限。
这一方面是由于嵌入式开发人员多年来应付有限资源的经验而养成的保守态度,另一方面也是由于长久以来,嵌入式系统应用设计中,人们要花费许多精力在底层硬件的驱动上,功能实现也主要局限在实时操作系统和相关支撑软件的层次,并不涉及过多的应用软件开发。这种在严苛条件下追求效率与实时性的任务,其他的高级语言并没有特别的优势。
最近几年,嵌入式系统领域又有了新的发展。首先,随着手机、PDA等消费性电子产品的飞速增长,嵌入式系统的市场规模在迅速扩大,同时越来越多的智能嵌入式应用场合需要互联网的支持,这要求嵌入式系统的软件具有更好的应用性和更高的复杂性;其次,随着芯片等相关领域的技术进步,嵌入式系统工程师们不再需要时时刻刻去考虑资源是否够用了。当面向对象的高级语言参与到嵌入式系统设计中去不再遥不可及时,语言的效率则成为突出的问题。根据《Thinking in C++》一书的总结,C++与C的效率差别往往在±5%,这使得C++在新一轮的嵌入式应用发展浪潮中占得先机。
值得注意的是,尽管自1998年发布最初的C++标准——ISO/IEC 14882:1998以来,每5年都会对此标准进行一次更新,但是由于C++语言过于复杂,以及它经历了长年的演变,直到2004年,没有任何一款编译器完全支持ISO C++。这对于时常要面对各种严苛条件的嵌入式系统应用工程师们来说,是难以忍受的。同时,即使是符合ISO C++标准的语句或者格式,对于实际的应用场合来说,也存在着重大隐患,而不应当被直接采用。因此,人们迫切需要一个正式的基于安全角度考虑的C++语言使用规范。
2 关于MISRA
MISRA(the Motor Industry Software Reliability As-sociation),即汽车工业软件可靠性协会,于1994.年在英国成立,以“协助汽车工业提供安全、可靠的软件”为使命,期望通过“规范指南”的形式来约束人们在汽车电子以及其他嵌入式系统开发领域或涉及安全与可靠性的领域中对于程序语言的使用。由于这些“规范指南”都是从大量工程实践中总结的第一手经验,因而具有极高的指导意义。
经过4年准备,它在1998年发布了一个针对汽车工业的《Guidelines for the Use of the C Langtlage in VehicleBased Software》,简称“MISRA C:1998'’,针对那些满足C语言标准,却存在安全隐患的语言使用习惯,提出了127条规则。由于它很好地解决了C语言国际标准的冗繁性,以及其中对于安全性考虑的不足性,从而得到了广泛的好评。MISRA-C不仅成为众多汽车厂商推崇的行业标准,其影响力更是远远超出了汽车工业,得到铁路、航空航天、国防、医疗等众多领域的认可,成为“最佳实践”解决方案。2004年,MISRA对于已有的规则进行改编与扩充,推出了“MISRA C 2004”,首次将该规范指南的对象从汽车工业推广到所有具有安全性要求的系统应用中去,包含了强制规则121条,推荐规则20条,并删除了15条旧规则,共计含有141条规则。
时至今日,MISRA组织不仅是汽车工业软件规范的权威,其制定的规范指南更得到了嵌入式系统应用领域的广泛认可。考虑到近年来,C++语言在嵌入式系统中的应用越来越多,2005年MISRA C++委员会成立,并于2008年推出针对C++语言的《MISRA C++:2008——Guidelines for the USe of the C++ language in critical sys-tems>>,以下简称“MISRA C++:2008”。有兴趣的读者可以联系相关网站:http://www.misra-cpp.com/,购买详细的文档。
MISRA C++:2008同样从推出之日起,就得到了业内外广泛关注。例如:LDRA软件公司一直跟踪着MIS-RA C++:2008的制定进展,在MISRA C++:2008发布时同步宣称已经完成了对工具套件产品的相应改进,使其符合MISRA C++:2008标准。(LDRA的Testbed产品曾成功用于“神舟”飞船项目的软件测试)
3 MISRA C++概述
作为规范指南,MISRA C++:2008基于ISO/IEC 14882:2003的C++语言国际标准,以规则(rule)的形式,给出了相关的建议。它的规则又细分为以下3种类型:
①强制型(required),必须符合、允许例外;
②推荐型(advisory),推荐符合;
③不容讨论型(document),必须符合、不许例外。
MISRA C++:2008中共给出了20个大类的规则(编号并不连续),细分为228条。详细情况如表1所列。