虽然许多嵌入式工程师充满了期望和愿望,但高牢靠性的代码不是一蹴即至的。它是一个艰苦的进程,需求开发人员保护和办理体系的每个比特和字节。当一个应用程序被确以为“成功”的那一刻,一般会有一种如释重负的感觉,但只是因为软件在受控条件下的那一刻运转正常并不意味着明日或一年后还会运转正常。
从标准完善的开发周期到严格履行和体系查看,开发高牢靠性嵌入式体系的技能有许多种。本文介绍了7个易操作且能够持久运用的技巧,它们关于保证体系愈加牢靠地运转并捕获反常行为大有帮忙。
技巧#1——用已知值填充ROM
软件开发人员往往都是十分达观的一群人,只要让他们的代码忠实地长期地运转就能够了,仅此而已。微操控器跳出应用程序空间并在非料想的代码空间中履行这种状况似乎是适当罕见的。但是,这种状况产生的时机并不比缓存溢出或过错指针失掉引证少。它的确会产生!产生这种状况后的体系行为将是不确认的,因为默许状况下内存空间都是0xFF,或许因为内存区一般没有写过,其间的值或许只要天主才知道。
不过有适当齐备的linker或IDE技巧能够用来帮忙辨认这样的作业并从中康复体系。技巧便是运用FILL指令对未用ROM填充已知的位形式。要填充未运用的内存,有许多不同的或许组合能够运用,但假如是想树立愈加牢靠的体系,最显着的挑选是在这些方位放置ISR fault handler。假如体系出了某些过失,处理器开端履行程序空间以外的代码,就会触发ISR,并在决议校对举动之前供给贮存处理器、寄存器和体系状况的时机。
关于怎么运用FILL指令以及关于其用处的代替性战略等额定信息能够在“运用FILL指令进步代码完整性”中找到(http://www.beningo.com/improving-code-integrity-using-fill/)。
技巧#2——查看应用程序的CRC
对嵌入式工程师来说一个很大的优点是,咱们的IDE和东西链能够主动产生应用程序或内存空间校验和(Checksum),然后依据这个校验和验证应用程序是否无缺。风趣的是,在许多这些事例中,只要在将程序代码加载到设备时,才会用到校验和。
但是,假如CRC或校验和坚持在内存中,那么验证应用程序在启动时(或乃至对长期运转的体系定时验证)是否依然无缺是保证意外之事不会产生的极好途径。现在一个编程过的应用程序产生改动的概率是很小的,但考虑每年交给的数十亿个微操控器以及或许恶劣的作业环境,应用程序溃散的时机并不是零。更有或许的是,体系中的一个缺点或许导致某一扇区产生闪存写入或闪存擦除,然后损坏应用程序的完整性。
技巧#3——在启动时履行RAM查看
为了树立一个愈加牢靠和厚实的体系,保证体系硬件正常作业十分重要。究竟硬件会产生毛病。(走运的是软件永久不会产生毛病,软件只会做代码要它做的事,不管是正确的仍是过错的)。在启动时验证RAM的内部或外部没有问题,是保证硬件能够如预期般运作的一个好办法。
有许多不同的办法可用于履行RAM查看,但常用的办法是写入一个已知的形式,然后等上一小段时刻再回读。成果应该是所读便是所写。本相是,在大多数状况下RAM查看是经过的,这也是咱们想要的成果。但也有极小的或许性查看不经过,这时就为体系标示出硬件问题供给了极好的时机。
这里有一个memtest C模块,是Michael Barr在 2000年就写好了的,它能够节约工程师考虑RAM测验所需的时刻。
技巧#4——运用仓库监督器
对许多的嵌入式开发者而言,仓库似乎是一股适当奥秘的力气。当古怪的作业开端产生,工程师总算被难倒了,他们开端考虑,或许仓库中产生了什么事。成果是盲目地调整仓库的巨细和方位等等。但该过错往往是与仓库无关的,但怎能如此确认?究竟,有多少工程师真的实践履行过最坏状况下的仓库巨细剖析?
仓库巨细是在编译时就静态分配好的,但仓库是以动态的办法运用的。跟着代码的履行,应用程序需求的变量、回来的地址和其它信息被不断存储在仓库中。这种机制导致仓库在其分配的内存中不断增加。但是,这种增加有时会超出编译时确认的容量极限,导致仓库损坏相邻内存区域的数据。
肯定保证仓库正常作业的一种办法是完成仓库监督器,将它作为体系“保健”代码的一部分(有多少工程师会这样做?)。仓库监督器会在仓库和“其它”内存区域之间创立一个缓冲区域,并填充已知的位形式。然后监督器会不断的监督图画是否有任何改动。假如该位形式产生了改动,那就意味着仓库增加得太大了,行将要把体系面向漆黑阴间!此刻监督器能够记载作业的产生、体系状况以及任何其它有用的数据,供日后用于问题的确诊。
大多数实时操作体系(RTOS)或完成了内存保护单元 (MPU)的微操控器体系中都供给有仓库监督器。可怕的是,这些功用默许都是封闭状况,或许常常被开发人员有意封闭。在网络上快速搜索一下能够发现,许多人主张封闭实时操作体系中的仓库监督器以节约56字节的闪存空间。等等,这但是因小失大的做法!
技巧#5 – 运用MPU
在曩昔,是很难在一个小而廉价的微操控器中找到内存保护单元(MPU)的,但这种状况现已开端改动。现在从高端到低端的微操控器都现已有MPU,而这些MPU为嵌入式软件开发人员供给了一个能够大幅进步其固件(firmware)鲁棒性(robustness)的时机。
MPU 已逐步与操作体系耦合,以便树立内存空间,其间的处理都分隔,或使命可履行其代码,而不必忧虑被stomped on。假使真有作业产生,不受操控的处理会被撤销,也会履行其他的保护措施。请留心带有这种组件的微操控器,假如有,请多加利用它的这种特性。
技巧#6 – 树立一个强壮的看门狗体系
你常常会发现的一种总是最受喜欢的看门狗(watchdog)完成是,在看门狗被启用之处(这是一个很好的开端),但也是能够用周期性定时器将该看门狗清零之处;定时器的启用是彻底与程序中呈现的任何状况阻隔的。运用看门狗的意图是帮忙保证假如呈现过错,看门狗不会被清零,即当作业暂停,体系会被逼去履行硬件重设定(hardware reset),以便康复。运用与体系活动独立的定时器能够让看门狗坚持清零,即便体系已失效。