发布时间:2019-06-20 16:41点击:0
成为正式的嵌入式主板开发工程师是一个困难的过程,需要开发人员维护和管理系统的每一个位和字节。开发高可靠性嵌入式系统的技术很多,从标准化、完善的开发周期到严格的实施和系统检查。今天,我想向大家介绍7项简单而长期的技能。它们非常有助于确保系统能够更可靠地运行并捕捉异常行为。
方法1——用己知值添充ROM
软件开发人员通常非常乐观,只要他们的代码能够长期忠实运行。微控制器跳出应用程序空间并在意想不到的代码空间中执行似乎很少见。然而,发生这种情况的可能性不亚于缓存溢出或错误指针丢失引用。确实发生了!发生这种情况后,系统的行为将是不确定的,因为默认情况下,内存空间是0xFF,或者因为内存区域通常不被写入,其值可能只有上帝知道。
但是,有相当完整的链接器或集成开发环境技术可以用来帮助识别这些事件并从中恢复系统。诀窍是使用FILL命令用已知的位模式填充未使用的只读存储器。有许多不同的可能组合来填充未使用的内存,但是如果您想要构建一个更可靠的系统,最明显的选择是将ISRfaulthandler放置在这些位置。如果系统出现问题,处理器开始在程序空间之外执行代码,它将触发ISR,并在决定纠正措施之前提供存储处理器、寄存器和系统状态的机会。
方法2——查验手机应用程序的CRC
嵌入式工程师的一大优势是,我们的集成开发环境和工具链可以自动生成应用程序或内存空间校验和,以验证应用程序是否处于良好状态。有趣的是,在许多情况下,校验和仅在程序代码加载到设备中时使用。
但是,如果CRC或校验和保存在内存中,那么在启动时验证应用程序仍然完好无损(或者甚至定期验证长时间运行的系统)是确保不发生意外事件的一个很好的方法。目前,编程应用程序改变的可能性非常小,但是考虑到每年交付数十亿个微控制器以及可能恶劣的工作环境,医疗仪器应用程序崩溃的可能性并不为零。更有可能的是,系统中的缺陷可能导致扇区的闪存写入或闪存擦除,从而损害应用程序的完整性。
方法3——在启动实行RAM查验
为了建立一个更加可靠和坚固的系统,保证系统硬件的正常运行是非常重要的。毕竟,硬件会失败。(幸运的是,软件永远不会失败。软件只会做代码希望它做的事情,不管它是对还是错)。在启动时验证内存内部或外部没有问题是确保硬件能够按预期运行的好方法。
有许多不同的方法来执行内存检查,但是通常的方法是写一个已知的模式并在读回之前等待一段时间。结果应该是你读的就是你写的。事实是,内存检查在大多数情况下都是通过的,这也是我们想要的结果。但是,检查不合格的可能性也很小,为系统提供了显示硬件问题的机会。
方法4——应用堆栈监控器
对于许多嵌入式开发人员来说,堆栈似乎是一种相当神秘的力量。当奇怪的事情开始发生时,工程师们终于困惑了。他们开始想,也许堆栈中发生了什么事。结果是盲目地调整堆栈的大小和位置等。然而,这个错误通常与堆栈无关,但是它怎么能如此确定呢?毕竟,有多少工程师实际上进行了最坏情况下的堆栈大小分析?
堆栈大小在编译时是静态分配的,但堆栈是动态使用的。随着代码的执行,变量、返回的地址和应用程序所需的其他信息被连续存储在堆栈中。这种机制会导致堆栈在其分配的内存中增长。然而,这种增长有时会超过编译时确定的容量限制,导致堆栈破坏相邻存储区中的数据。
绝对确保堆栈正常工作的一种方法是将堆栈监视器实现为系统“健康保障”代码的一部分(有多少工程师会这样做?)。堆栈监视器在堆栈和“其他”存储区之间创建一个缓冲区,并用已知的位模式填充它。然后监视器将不断监视模式的任何变化。如果位模式改变,这意味着堆栈增长过快,将把系统推向黑暗地狱!此时,监视器可以记录事件的发生、系统状态和任何其他有用的数据,以便将来诊断问题。
大多数实时操作系统(RTOS)或实现内存保护单元的微控制器系统都提供堆栈监视器。可怕的是,这些功能是默认关闭的,或者通常是开发人员有意关闭的。互联网上的快速搜索显示,许多人建议关闭实时操作系统中的堆栈监视器,以节省56字节的闪存空间等。这不值得花费!
方法5-使用微处理器
在过去,很难在小型廉价的微控制器中找到存储器保护单元,但是这种情况已经开始改变。目前,微处理器已经存在于从高端到低端的微控制器中,这些微处理器为嵌入式软件开发人员提供了极大提高固件健壮性的机会。
微处理器已经逐渐与操作系统相结合,以便建立内存空间,在内存空间中处理被划分