嵌入式系统常用的7个技巧

💡 原文中文,约3400字,阅读约需8分钟。
📝

内容提要

构建高可靠性的嵌入式系统需要开发人员维护和管理每个比特和字节。技巧包括用已知值填充ROM、检查应用程序的CRC、在启动时执行RAM检查、使用堆栈监视器、使用内存保护单元(MPU)、建立强大的看门狗系统和避免易失存储器分配。这些技巧可以提高系统的可靠性和鲁棒性。

🔎

延伸解读

从“能跑”到“可靠”:七个技巧的定位

文章开篇指出,软件在受控条件下运行正常,不代表未来仍能稳定。七个技巧覆盖启动自检、运行时监控和内存管理,目标是在异常发生时能识别、记录并恢复,而非仅让代码通过测试。这些做法需要开发者在设计阶段就纳入系统,而非事后补救。

启动自检:ROM填充与CRC校验

用已知值填充未使用的ROM区域,可将意外跳转引导至ISR故障处理程序,从而捕获处理器状态。同时,利用IDE或工具链生成的校验和,在启动时或定期验证应用程序完整性,能发现因闪存写入或擦除导致的代码损坏。两者结合,为系统启动增加了一道防线。

运行时防护:堆栈监视与MPU

堆栈监视器在堆栈与其他内存间填充已知模式,模式变化即提示堆栈溢出,可记录现场供诊断。MPU则通过隔离任务内存空间,防止越界访问破坏其他代码。文章提醒,这些功能常因节省少量闪存而被关闭,但关闭它们可能得不偿失。

看门狗与内存分配:系统级可靠性

强大的看门狗系统应使用独立于程序活动的定时器清零,确保系统失效时能触发硬件复位。同时,避免使用malloc等易失存储器分配,可防止内存泄漏和碎片,简化内存管理。这些措施从系统层面提升了鲁棒性,但需要开发者仔细设计和权衡。

❓

Q&A

如何用已知值填充ROM来提高嵌入式系统的可靠性?

使用链接器或IDE的FILL命令将未使用的ROM区域填充为已知的位模式,例如放置ISR故障处理程序。这样当系统意外跳出应用程序空间时,会触发ISR,从而有机会保存处理器状态并采取恢复措施。

为什么需要在启动时检查应用程序的CRC?

检查应用程序的CRC可以验证应用程序在启动时是否完好,确保不会因为闪存写入或擦除等缺陷导致应用程序损坏。定期检查也能及时发现长期运行中的问题。

堆栈监视器是如何工作的?

堆栈监视器在堆栈和其他内存区域之间创建一个填充了已知位模式的缓冲区,并持续监视该模式是否变化。如果模式改变,说明堆栈增长过大,即将溢出,监视器可以记录事件和系统状态供诊断。

使用MPU对嵌入式系统有什么好处?

MPU可以划分内存空间,使任务隔离执行,防止一个任务破坏另一个任务的内存。如果发生错误,不受控制的处理会被取消,并执行其他保护措施,从而提高固件的鲁棒性。

如何设计一个强大的看门狗系统?

看门狗应使用独立的定时器,与程序活动隔离,确保系统失效时看门狗不被清零,强制硬件复位。设计时需考虑应用任务如何整合,例如让任务定期标示成功完成,否则看门狗触发复位。也可使用外部看门狗处理器。

为什么嵌入式系统中要避免易失存储器分配?

易失存储器分配(如malloc/free)可能导致内存泄漏或内存碎片,而嵌入式系统通常没有资源来监视和处理这些问题。替代方法是使用静态分配,例如直接定义固定大小的缓冲区,简化内存管理并避免堆问题。

🏷️

标签

➡️

继续阅读