就像很悠远年代的人们思维还很保存,固守着自己一方净土独享着一份闲适。总以为天圆地方一直在平平而充分的日子,又恰似红楼梦中的刘姥姥走进大观园看得目不暇接。关于75年以前人传统观念还比较浓重,关于那个年代的人来讲所遭到教育和现在应该说是不一样的。关于那个年代物资相对比较匮乏,科技相对有些落后没有现在所谓的大数据、云核算、互联网和移动互联网。
从规范完善的开发周期到严格履行和体系查看,开发高牢靠性嵌入式体系的技能有许多种。本文介绍了7个易操作且能够持久运用的技巧,它们关于保证体系愈加牢靠地运转并捕获反常行为大有帮忙。
技巧1——用已知值填充ROM
软件开发人员往往都是十分达观的一群人,只要让他们的代码忠实地长期地运转就能够了,仅此而已。微操控器跳出运用程序空间并在非料想的代码空间中履行这种状况似乎是适当罕见的。但是,这种状况发生的时机并不比缓存溢出或过错指针失掉引证少。它的确会发生!发生这种状况后的体系行为将是不确认的,因为默许状况下内存空间都是0xFF,或许因为内存区一般没有写过,其间的值或许只要天主才知道。
不过有适当齐备的linker或IDE技巧能够用来帮忙辨认这样的作业并从中康复体系。技巧便是运用FILL指令对未用ROM填充已知的位形式。要填充未运用的内存,有许多不同的或许组合能够运用,但假如是想树立愈加牢靠的体系,最显着的挑选是在这些方位放置ISR fault handler。假如体系出了某些过失,处理器开端履行程序空间以外的代码,就会触发ISR,并在决议校对举动之前供给贮存处理器、寄存器和体系状况的时机。
技巧2——查看运用程序的CRC
对嵌入式工程师来说一个很大的优点是,咱们的IDE和东西链能够主动发生运用程序或内存空间校验和(Checksum),然后依据这个校验和验证运用程序是否无缺。风趣的是,在许多这些事例中,只要在将程序代码加载到设备时,才会用到校验和。
但是,假如CRC或校验和坚持在内存中,那么验证运用程序在启动时(或乃至对长期运转的体系守时验证)是否依然无缺是保证意外之事不会发生的极好途径。现在一个编程过的运用程序发生改动的概率是很小的,但考虑每年交给的数十亿个微操控器以及或许恶劣的作业环境,运用程序溃散的时机并不是零。更有或许的是,体系中的一个缺点或许导致某一扇区发生闪存写入或闪存擦除,然后损坏运用程序的完整性。
技巧3——在启动时履行RAM查看
为了树立一个愈加牢靠和厚实的体系,保证体系硬件正常作业十分重要。究竟硬件会发生毛病。(走运的是软件永久不会发生毛病,软件只会做代码要它做的事,不管是正确的仍是过错的)。在启动时验证RAM的内部或外部没有问题,是保证硬件能够如预期般运作的一个好办法。
有许多不同的办法可用于履行RAM查看,但常用的办法是写入一个已知的形式,然后等上一小段时刻再回读。成果应该是所读便是所写。本相是,在大多数状况下RAM查看是经过的,这也是咱们想要的成果。但也有极小的或许性查看不经过,这时就为体系标明出硬件问题供给了极好的时机。
技巧4——运用仓库监督器
对许多的嵌入式开发者而言,仓库似乎是一股适当奥秘的力气。当古怪的作业开端发生,工程师总算被难倒了,他们开端考虑,或许仓库中发生了什么事。成果是盲目地调整仓库的巨细和方位等等。但该过错往往是与仓库无关的,但怎能如此确认?究竟,有多少工程师真的实践履行过最坏状况下的仓库巨细剖析?
仓库巨细是在编译时就静态分配好的,但仓库是以动态的办法运用的。跟着代码的履行,运用程序需求的变量、回来的地址和其它信息被不断存储在仓库中。这种机制导致仓库在其分配的内存中不断增加。但是,这种增加有时会超出编译时确认的容量极限,导致仓库损坏相邻内存区域的数据。
肯定保证仓库正常作业的一种办法是完结仓库监督器,将它作为体系“保健”代码的一部分(有多少工程师会这样做?)。仓库监督器会在仓库和“其它”内存区域之间创立一个缓冲区域,并填充已知的位形式。然后监督器会不断的监督图画是否有任何改动。假如该位形式发生了改动,那就意味着仓库增加得太大了,行将要把体系面向漆黑阴间!此刻监督器能够记载作业的发生、体系状况以及任何其它有用的数据,供日后用于问题的确诊。
大多数实时操作体系(RTOS)或完结了内存保护单元(MPU)的微操控器体系中都供给有仓库监督器。可怕的是,这些功用默许都是封闭状况,或许常常被开发人员有意封闭。在网络上快速搜索一下能够发现,许多人主张封闭实时操作体系中的仓库监督器以节约56字节的闪存空间。等等,这但是因小失大的做法!
技巧5 – 运用MPU
在曩昔,是很难在一个小而廉价的微操控器中找到内存保护单元(MPU)的,但这种状况现已开端改动。现在从高端到低端的微操控器都现已有MPU,而这些MPU为嵌入式软件开发人员供给了一个能够大幅进步其固件(firmware)鲁棒性(robustness)的时机。
MPU 已逐步与操作体系耦合,以便树立内存空间,其间的处理都分隔,或使命可履行其代码,而不必忧虑被stomped on。假使真有作业发生,不受操控的处理会被撤销,也会履行其他的保护措施。请留心带有这种组件的微操控器,假如有,请多加运用它的这种特性。
技巧6 – 树立一个强壮的看门狗体系
你常常会发现的一种总是最受喜欢的看门狗(watchdog)完结是,在看门狗被启用之处(这是一个很好的开端),但也是能够用周期性守时器将该看门狗清零之处;守时器的启用是彻底与程序中呈现的任何状况阻隔的。运用看门狗的意图是帮忙保证假如呈现过错,看门狗不会被清零,即当作业暂停,体系会被逼去履行硬件重设定(hardware reset),以便康复。运用与体系活动独立的守时器能够让看门狗坚持清零,即便体系已失效。
对运用使命怎么整合到看门狗体系中,嵌入式开发人员需求细心考虑和规划。例如,有种技能或许能够让每个在一守时期内运转的使命标明它们能够成功地完结其任 务。在此作业中,看门狗不被清零,强制被复位。还有一些比较先进的技能,像是运用外部看门狗处理器,它可用来监督主处理器怎么体现,反之亦然。
对一个牢靠的体系而言,树立一个强壮的看门狗体系是很重要的。因为有太多的技能,难以在这几个阶段中彻底包括,但针对此一议题,笔者未来还会宣布相关的文章。
技巧7 – 防止易失存储器分配
不习惯在资源有限环境下作业的工程师,或许会企图运用其编程言语的特性,这种言语让他们能够运用易失存储器分配。究竟,这是一种常在核算器体系中运用的技能,在核算器体系中,只要在有必要时,内存才会被分配。例如,以C开发时,工程师或许倾向于运用malloc来分配在堆(heap)上的空间。有一个操 作会履行,一旦完结,能够运用free将被分配的内存回来,以便堆的运用。
在资源受限的体系,这可 能是一场灾祸!运用易失存储器分配的其间一个问题是,过错或不妥的技能或许会导致内存走漏或内存碎片。假如呈现这些问题时,大多数的嵌入式体系并没有 资源或常识来监督堆或妥善地处理它。而当它们发生时,假如运用程序提出对空间的要求,但却没有所恳求的空间能够运用,会发生什么事呢?
运用易失存储器分配所发生的问题是很杂乱的,要妥善处理这些问题,能够说是一个噩梦!一种代替的办法是,直接以静态的办法,简化内存的分配。例如,只要在 程序中简略地树立一个巨细为256字节长的缓冲区,而不是经由malloc恳求这样巨细的内存缓冲区。此一分配的内存可在整个运用程序的生命周期期 间坚持,且不会有堆或内存碎片问题方面的顾忌。
定论
这些都只是一些能够让开发人员开端树立更牢靠嵌入式体系的办法。别的还有许多其他技能,例如运用杰出的编码规范、位翻转的监测、履行数组和指针鸿沟查看,及运用断语等。所有这些技能都是让规划者能够开宣布牢靠性更高嵌入式体系的诀窍。