成为一名未来的嵌入式开发工程师。 这是一个艰巨的过程,需要开发人员维护和管理系统的每一个比特和字节。 开发高可靠性嵌入式系统的技术有很多,从严格的、稳健的开发周期到严格的执行和系统测试。
明天我将向大家介绍7个易于操作且长期有效的方法,这些方法对于确保系统运行越来越可靠以及捕获异常行为有很大帮助。
用已知值填充 ROM
软件开发人员通常是一群思想非常开放的人,他们只是让他们的代码忠实地运行很长一段时间,仅此而已。 实际上,微控制器很少会跳出应用程序空间并在无法想象的代码空间中执行这些应用程序。 然而,发生这种情况的可能性不亚于缓冲区溢出或错误处理错误引用。 它确实发生了! 出现这种情况后系统的行为将是未定义的,因为显存空间默认是0xFF,或者因为显存区域一般不被写入,里面的值可能只有天知道。
然而,有相当完整的链接器或 IDE 方法可用于帮助识别此类风暴并从中恢复系统。 方法是使用 FILL 命令用已知的位模式填充未使用的 ROM。 有许多不同的可能组合来填充未使用的视频内存,但如果想要构建更可靠的系统,最明显的选择是将 ISRfaulthandler 放置在该位置。 如果发生系统错误并且处理器开始执行程序空间之外的代码,则会触发 ISR,并提供在决定校准操作之前存储处理器、寄存器和系统状态的机会。
检查应用程序的CRC
对于嵌入式工程师来说一个很大的用处就是我们的IDE和工具链可以手动形成应用程序或者内存空间的校准和(Checksum),从而根据这个完成应用程序的校准和验证。 有趣的是嵌入式系统软件教程,在许多这样的情况下,仅当程序代码加载到设备中时才使用校准和。
然而,如果 CRC 或校准并保留在视频内存中,则验证应用程序在启动时是否仍然完好无损(或者对于长时间运行的系统甚至定期验证)是确保不会发生意外情况的绝佳方法。 如今,已编程的应用程序发生更改的可能性很小,但考虑到每年出货的数十亿个微控制器以及潜在的恶劣操作环境,应用程序崩溃的可能性并非为零。 更有可能的是,系统中的错误可能会导致对磁道进行闪存写入或闪存擦除,从而损害应用程序的完整性。
启动时执行RAM检测
为了构建一个日益可靠和坚固的系统,确保系统硬件正常工作非常重要。 虽然硬件会出现故障。 (幸运的是,软件永远不会失败,它只是按照代码的指示去做,无论正确或错误)。 在启动时验证 RAM 内部或外部没有问题是确保硬件按预期运行的好方法。
执行 RAM 测试的方法有很多种,但常见的方法是写入已知模式,然后等待一小段时间再读回。 结果应该是读到的就是写到的。 事实是,在大多数情况下,RAM 测试都会通过,这正是我们想要的。 但测试失败的可能性也很小,这为系统识别硬件问题提供了绝佳的机会。
使用堆栈监视器
对于许多嵌入式开发人员来说,堆栈实际上是一种相当神秘的力量。 当奇怪的事情开始发生时,工程师们终于被难住了,他们开始想知道堆栈中到底发生了什么。 其结果就是盲目地调整堆栈的大小和位置等等。 但错误往往与堆栈无关,但怎么能这么确定呢? 不过,有多少工程师实际上执行过最坏情况堆栈大小分析?
堆栈大小在编译时静态分配,但堆栈是动态使用的。 当代码执行时,应用程序所需的变量、返回地址和其他信息连续存储在堆栈中。 这些机制导致堆栈在其分配的视频内存中不断下降。 然而,这些下降有时会超出编译时确定的容量限制,导致堆栈损坏相邻视频内存区域中的数据。
绝对确保堆栈正常工作的一种方法是实现堆栈监视器作为系统“医疗保健”代码的一部分(有多少工程师这样做?)。 堆栈监视器在堆栈和“其他”内存区域之间创建一个缓冲区,并用已知的位模式填充它。 之后,监控器会持续监控图案是否有变化。 如果位模式发生变化,则意味着堆栈已经下降太多,即将将系统推入黑暗地狱! 此时,监视器可以记录风暴的发生、系统的状态以及任何其他有用的数据以供以后使用。 问题的诊断。
大多数实时操作系统 (RTOS) 或实现内存保护单元 (MPU) 的微控制器系统中都提供堆栈监视器。 可怕的是这个功能默认是关闭的,或者经常被开发者故意关闭。 网上快速搜救可以发现,很多人建议关闭实时操作系统中的堆栈监视器以节省56字节的闪存空间等,这是得不偿失的!
使用微处理器
过去,很难在小型、廉价的微控制器中找到内存保护单元 (MPU),但这种情况已经开始改变。 MPU 已应用于当今的低端到高端微控制器中,并且该 MPU 为嵌入式软件开发人员提供了显着提高其固件稳健性的机会。
MPU已逐渐与操作系统耦合,以方便构建视频内存空间嵌入式系统软件教程,其中处理是分离的,或者任务可以执行其代码而不必担心被踩踏。 如果确实发生了某些情况,则会取消不受控制的处理并实施其他保护措施。 留意带有这些组件的微控制器,如果有的话,利用这些功能。
构建强大的看门狗系统
您经常会发现,最喜欢的看门狗实现是启用看门狗的位置(这是一个好的开始),但也可以使用周期性计时器来清除看门狗; 定时器的启用与程序中发生的任何事情完全隔离。 使用看门狗的目的是帮助确保如果发生错误,看门狗不会被清除,即当工作暂停时,系统将被迫执行硬件复位(hardware Reset)以便于恢复。 使用独立于系统活动的定时器,即使系统被禁用,看门狗也可以保持清零状态。
嵌入式开发人员需要仔细考虑和设计如何将应用任务集成到看门狗系统中。 例如,一种技术可能是允许每个任务在特定时间段内运行,以表明它们可以成功完成其任务。 在这场动荡中,看门狗没有被清除,被迫重置。 还有一些更先进的技术,例如使用外部看门狗处理器,可用于监视主处理器的行为方式,反之亦然。 构建强大的看门狗系统对于可靠的系统非常重要。
避免易失性内存分配
不习惯在资源有限的环境中工作的工程师可能会倾向于使用其编程语言的功能,这些功能允许他们使用易失性内存分配。 尽管如此,这是一种在估计器系统中经常使用的技术,其中仅在必要时才分配视频内存。 例如,在用C语言开发时,工程师可能倾向于使用malloc在堆上分配空间。 将执行一项操作。 完成后可以使用free返回分配的显存,方便堆使用。
在资源受限的系统上,这可能是一场灾难! 使用易失性内存分配的问题之一是错误或不正确的技术可能会导致视频内存泄漏或碎片。 大多数嵌入式系统没有资源或知识来监视堆或在出现此类问题时妥善处理它。 当他们这样做时,如果应用程序请求空间,但所请求的空间都不可用,会发生什么?
使用易失性内存分配所产生的问题非常复杂,妥善处理这个问题可以说是一场噩梦! 另一种方法是直接以静态的方式简化显存的分配。 例如,只需在程序中构建一个256字节长的缓冲区,而不是通过malloc请求这个大小的视频内存缓冲区。 可以在应用程序的整个生命周期中维护分配的视频内存,而无需担心堆或视频内存碎片问题。
推理
以上关于嵌入式开发的教程可以让开发者获得更好的嵌入式系统的方法。 所有这些技术都是让设计人员能够开发更可靠的嵌入式系统的技巧。