资料介绍
1、前言
设备的可靠性涉及多个方面:稳定的硬件、优秀的软件架构、严格的测试以及市场和时间的检验等等。这里着重谈一下作者自己对嵌入式软件可靠性设计的一些理解,通过一定的技巧和方法提高软件可靠性。这里所说的嵌入式设备,是指使用单片机、ARM7、Cortex-M0,M3之类为核心的测控或工控系统。
嵌入式软件可靠性设计应该从防错、判错和容错三方面进行考虑。 此外,还需理解自己所使用的编译器特性。
2、防错
良好的软件架构、清晰的代码结构、掌握硬件、深入理解C语言是防错的要点,这里只谈一下C语言。
“人的思维和经验积累对软件可靠性有很大影响"。C语言诡异且有种种陷阱和缺陷,需要程序员多年历练才能达到较为完善的地步。“软件的质量是由程序员的质量以及他们相互之间的协作决定的”。因此,作者认为防错的重点是要考虑人的因素。
“深入一门语言编程,不要浮于表面”。软件的可靠性,与你理解的语言深度密切相关,嵌入式C更是如此。除了语言,作者认为嵌入式开发还必须深入理解编译器。
本节将对C语言的陷阱和缺陷做初步探讨。
2.1 处处皆陷阱
最初开始编程时,除了英文标点被误写成中文标点外,可能被大家普遍遇到的是将比较运算符==误写成赋值运算符=,代码如下所示:
if(x=5) { … }
这里本意是比较变量x是否等于常量5,但是误将’==’写成了’=’,if语句恒为真。如果在逻辑判断表达式中出现赋值运算符,现在的大多数编译器会给出警告信息。并非所有程序员都会注意到这类警告,因此有经验的程序员使用下面的代码来避免此类错误:
if(5==x) { … }
将常量放在变量x的左边,即使程序员误将’==’写成了’=’,编译器会产生一个任谁也不能无视的语法错误信息:不可给常量赋值!
+=与=+、-=与=-也是容易写混的。复合赋值运算符(+=、*=等等)虽然可以使表达式更加简洁并有可能产生更高效的机器代码,但某些复合赋值运算符也会给程序带来隐含Bug,如下所示代码:
tmp=+1;
该代码本意是想表达tmp=tmp+1,但是将复合赋值运算符+=误写成=+:将正整数常量1赋值给变量tmp。编译器会欣然接受这类代码,连警告都不会产生。
如果你能在调试阶段就发现这个Bug,你真应该庆祝一下,否则这很可能会成为一个重大隐含Bug,且不易被察觉。
-=与=-也是同样道理。与之类似的还有逻辑与&&和位与&、逻辑或||和位或|、逻辑非!和位取反~。此外字母l和数字1、字母O和数字0也易混淆,这种情况可借助编译器来纠正。
很多的软件BUG自于输入错误。在Google上搜索的时候,有些结果列表项中带有一条警告,表明Google认为它带有恶意代码。如果你在2009年1月31日一大早使用Google搜索的话,你就会看到,在那天早晨55分钟的时间内,Google的搜索结果标明每个站点对你的PC都是有害的。这涉及到整个Internet上的所有站点,包括Google自己的所有站点和服务。Google的恶意软件检测功能通过在一个已知攻击者的列表上查找站点,从而识别出危险站点。在1月31日早晨,对这个列表的更新意外地包含了一条斜杠(“/”)。所有的URL都包含一条斜杠,并且,反恶意软件功能把这条斜杠理解为所有的URL都是可疑的,因此,它愉快地对搜索结果中的每个站点都添加一条警告。很少见到如此简单的一个输入错误带来的结果如此奇怪且影响如此广泛,但程序就是这样,容不得一丝疏忽。
数组常常也是引起程序不稳定的重要因素,C语言数组的迷惑性与数组下标从0开始密不可分,你可以定义int a[30],但是你绝不可以使用数组元素a[30],除非你自己明确知道在做什么。
switch…case语句可以很方便的实现多分支结构,但要注意在合适的位置添加break关键字。程序员往往容易漏加break从而引起顺序执行多个case语句,这也许是C的一个缺陷之处。对于switch…case语句,从概率论上说,绝大多数程序一次只需执行一个匹配的case语句,而每一个这样的case语句后都必须跟一个break。去复杂化大概率事件,这多少有些不合常情。
break关键字用于跳出最近的那层循环语句或者switch语句,但程序员往往不够重视这一点。
1990年1月15日,AT&T电话网络位于纽约的一台交换机当机并且重启,引起它邻近交换机瘫痪,由此及彼,一个连着一个,很快,114台交换机每六秒当机重启一次,六万人九小时内不能打长途电话。当时的解决方式:工程师重装了以前的软件版本。事后的事故调查发现,这是break关键字误用造成的。《C专家编程》提供了一个简化版的问题源码:
network code()
{
switch(line) {
case THING1:
doit1();
break;
case THING2:
if(x==STUFF) {
do_first_stuff();
if(y==OTHER_STUFF)
break;
do_later_stuff();
} /*代码的意图是跳转到这里… …*/
initialize_modes_pointer();
break;
default:
processing();
}/*… …但事实上跳到了这里。*/
use_modes_pointer();/*致使modes_pointer未初始化*/
}
那个程序员希望从if语句跳出,但他却忘记了break关键字实际上跳出最近的那层循环语句或者switch语句。现在它跳出了switch语句,执行了use_modes_pointer()函数。但必要的初始化工作并未完成,为将来程序的失败埋下了伏笔。
将一个整形常量赋值给变量,代码如下所示:
int a=34, b=034;
变量a和b相等吗?答案是不相等的。我们知道,16进制常量以’0x’为前缀,10进制常量不需要前缀,那么8进制呢?它与10进制和16进制表示方法都不相通,它以数字’0’为前缀,这多少有点奇葩:三种进制的表示方法完全不相通。如果8进制也像16进制那样以数字和字母表示前缀的话,或许更有利于减少软件Bug,毕竟你使用8进制的次数可能都不会有误使用的次数多!下面展示一个误用8进制的例子,最后一个数组元素赋值错误:
a[0]=106; /*十进制数106*/
a[1]=112; /*十进制数112*/
a[2]=052; /*实际为十进制数42,本意为十进制52*/
指针的加减运算是特殊的。下面的代码运行在32位ARM架构上,执行之后,a和p的值分别是多少?
int a=1;
int *p=(int*)0x00001000;
a=a+1;
p=p+1;
对于a的值很容判断出结果为2,但是p的结果却是0x00001004。指针p加1后,p的值增加了4,这是为什么呢?原因是指针做加减运算时是以指针的数据类型为单位。p+1实际上是p+1*sizeof(int)。不理解这一点,在使用指针直接操作数据时极易犯错。比如下面对连续RAM初始化零操作代码:
unsigned int *pRAMaddr; //定义地址指针变量
for(pRAMaddr=StartAddr;pRAMaddr{
*pRAMaddr=0x00000000; //指定RAM地址清零
}
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 嵌入式软件怎样测试,如何对嵌入式软件进行可靠性测试
- 深度:嵌入式系统的软件架构设计!资料下载
- 7个技巧开发更高可靠性的嵌入式系统资料下载
- 嵌入式GIS软件低功耗措施资料下载
- 选型必读:正确理解电阻在电路中的作用资料下载
- 正确理解电路保护设计及器件选择资料下载
- 嵌入式教程之高可靠嵌入式系统设计的详细资料说明 11次下载
- 嵌入式系统硬件可靠性分析 1次下载
- 嵌入式软件设计确保可靠性的技巧 0次下载
- 基于CodeTEST的嵌入式软件测试技术
- 嵌入式系统软件可靠性设计
- EPC2000系列嵌入式工控主板硬件可靠性应用设计
- 嵌入式系统的系统测试和可靠性评估
- 嵌入式软件的安全可靠性控制
- 嵌入式系统的系统测试和可靠性评估
- 详细的理解可靠性分配 1595次阅读
- 嵌入式软件的可靠性设计 702次阅读
- 嵌入式常用的软件框架介绍与选择 2097次阅读
- 应用笔记:正确理解驱动电流与驱动速度 3976次阅读
- 基于嵌入式软件的JNI技术应用解析 1020次阅读
- 怎样开发高可靠性嵌入式系统? 491次阅读
- 嵌入式软件可靠性设计需注意以下四个方面的问题! 2440次阅读
- 嵌入式系统的设计原则技术设计实例 5605次阅读
- 关于军用嵌入式系统的可靠性,你知道多少呢? 2362次阅读
- 嵌入式软件可靠性设计三方面的考虑:防错,判错,容错的详细概述 5970次阅读
- 一文知道嵌入式存储交换技术的可靠性如何增加 1905次阅读
- 大神教你:嵌入式系统C++代码的变成技巧 3543次阅读
- 基于软件的空间辐照下FPGA可靠性设计方法 2442次阅读
- 嵌入式系统开发的流程和提升可靠性的七大技巧 1004次阅读
- 正确理解时钟器件的抖动性能 1.4w次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多