技巧和窍门–设计强大的Bootloader的7个技巧

嵌入式软件永远不会完成。该软件始终需要进行一些调整,调整,功能附加或错误修复。这就是世界运转的方式。可以将产品发送回制造商以进行更新,也可以将技术人员发送给该产品。无论哪种方式,它都是昂贵的!某些产品以访问微控制器的方式构建’的编程端口将要求系统完全拆除。引导加载程序是两种情况下的完美解决方案。

引导加载程序已成为几乎每个嵌入式系统中的必需品,但不幸的是,它们几乎没有受到关注。对于大多数开发人员而言,更新固件的能力是事后才想到的。监督的结果是在最后一刻不遗余力地将任何更新功能构建到系统中。错误进入系统,由于缺乏测试,毫无疑问地进入了现场。为了确保引导加载程序不仅更新固件,而且每次都能正确更新,可以遵循7条提示。

秘诀1–尽早添加引导程序

在设计初期,最好是在概念证明阶段之后,即项目获得正式资助后,从引导加载程序开始。尽早将引导加载程序集成到系统中,不仅可以进行全面的测试,而且可以限制在集成过程中可能需要对应用程序进行的更改。

秘诀2–检查复位向量

引导加载程序的目的之一是使系统进入已知状态,并做出决定跳转到应用程序或等待编程指令的决定。如果引导加载程序决定应启动应用程序,则跳转到应用程序向量不应是盲目的。系统闪存以前可能已被擦除,而复位向量的唯一位置为0xFFFFFFFF。如果执行此复位向量,系统将会怎样?

可以在启动应用程序之前对应用程序执行的最简单检查是,确保已将复位向量编程为一个值,即’不会被删除。编程的复位向量可确保程序不会跳入杂草的最低置信度。可以在下面的图1中看到一个示例。开发人员甚至可能更想知道并提供可能的有效复位向量的边界检查。边界检查将有助于确保不仅已对复位向量进行了编程,而且已将其指向有效位置。

重置向量

秘诀3– Perform a CRC check

重置向量检查是验证存在应用程序的一个很好的开端,但是仅重置向量并不能说明全部情况。如果固件更新中途中断,将会发生什么?重置向量可能已写入闪存,但应用程序本身已损坏。向应用程序添加CRC检查是验证应用程序的好方法。引导加载程序可以在启动时对应用程序空间执行快速CRC检查,如果检查成功,则引导加载程序可以假定应用程序空间是完整的。

秘诀4– Lock the bootloader

在现场更新Bootloader是一项极其危险的工作。电源故障,宇宙射线杂散或肮脏的外观可能会导致内存的引导加载程序部分损坏且无法使用。结果是嵌入式系统被砖砌起来,直到可以通过更复杂的编程工具对其进行修复为止。引导加载程序应该是一款小型,简单且强大的应用程序,不需要功能升级或错误修复。引导加载程序应放置在受保护的内存部分中,以确保不会意外擦除或以任何方式,形状或形式覆盖引导加载程序。

秘诀5–将闪存分为多个应用程序插槽

嵌入式系统有时具有复杂的要求,例如在应用程序仍在运行时更新固件,或者在更新失败的情况下能够还原到以前的版本。如果不将闪存空间分成多个应用程序段,将很难实现这些要求。例如,可以将闪存空间分解为包括引导加载程序和受保护的内存中的原始固件,然后是两个备用的应用程序部分以更新固件。引导加载程序将对备用插槽之一进行编程,如果成功,则可以切换到使用该应用程序。发生故障时,引导加载程序总是可以退回到原始位置或备份插槽中存储的应用程序。

秘诀6–使用握手协议

编译器将生成细分为记录的应用程序表示形式。这些记录可以多种格式生成,但是一个共同的特征是每个记录代表应用程序的较小部分,并包含一个校验和。开发人员可以创建一个协议,一次发送一个记录,验证记录,将其写入闪存,然后以确认响应更新工具。工具收到确认后,可以发送下一条记录。使用握手可以将刷新过程分成可管理的块,并且在发生错误的情况下,系统可以立即处理它,而不必在更新周期结束时进行处理。

秘诀7–使用增量生成器

传统的微控制器引导加载程序将在更新过程中完全擦除应用程序闪存空间。如果仅对软件进行很小的更改,则更新固件可能会浪费时间。大型计算机系统中经常采用的一种方法是确定应用程序文件之间的差异或差异,并且仅更新那些已更改的文件或内存部分。 Delta生成器还可以用于最小化更新微控制器应用程序所需的时间。

4 thoughts 上 “Tips and Tricks –设计强大的Bootloader的7个技巧”

  1. 您好,感谢您的博客。

    我想知道为什么我们需要制作自己的自定义Bootloader,因为大多数微控制器已经具有defualt的Bootloader。建立自己的Bootloader有什么好处。

    1. 根据应用程序的不同,您可能无法信任内部引导加载程序,或者它可能不具备所需的功能。微控制器通常带有引导加载程序,以帮助某人加快开发速度,但是尚未针对每个应用程序或需求对这些资源进行全面测试或验证。另外,如果我’攻击者,我的第一件事’要做的就是查看微控制器的默认引导程序,并尝试利用它来访问您的IP或注入我自己的代码。

  2. 嘿,雅各布,

    不错的文章。我想知道,如果我们的带宽很低,压缩可能会出现在图片上。引导加载程序是否也仅需要更新应用程序软件中已更新的部分,而不是相同部分?

    1. 谢谢。压缩可以发挥作用来传输图像,因此我们不’不要用一大堆带宽来获得图像。对于一般的计算引导加载程序,仅会更改已更改的文件。对于微控制器(这是我的重点领域),通常必须完全重写整个图像。更改单个功能会影响所有功能最终在新版本中的位置。当然,有很多方法可以解决,但是软件和链接器的复杂性可以使大多数人发现更容易重新刷新整个内容。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.