为嵌入式应用构建固件补丁

Building firmware Patch for embedded applications

我有一个不会更改的库堆栈,以及一个将仅使用此堆栈的固件。固件会一路变化很多。由于有限的内存和资源问题(这是嵌入式应用程序而不是桌面或服务器),我不想每次都发布整个图像(包括库堆栈)。 我只是想发布应用程序镜像并且自动能够使用库镜像。我不知道该怎么做。例如,我在 Windows 中知道这是由 dll 处理的。但这是一个嵌入式应用程序,没有OS。二进制图像加载到内存,处理器将执行它。 任何 experience/suggestions?

工具链:IAR 8051

这在很大程度上取决于您的工具链。这是一种可能的高视角方法。

将您的库编译成可执行映像,将您的 link 用户设置为使用闪存的特定部分 space。您可能需要一个 fake/stub 入口函数才能让 link 人开心。

完成后,找到库使用的所有符号的地址,并在构建普通程序时指导您的 linker 关于这些符号的位置,而不是指导 link 进程在 linking 时使用中间库对象。还指示 linker 将代码放入可更新的闪存部分。

然后您将拥有库的图像,以及使用 at 库构建新版本主程序图像的能力。

如果您的 linker 输出格式是未剥离的 elf(在转换为二进制文件以在 flash 上刻录之前),并且如果您的 linker 可以接受用于说明的纯文本文件(如果您使用的是 gnu 工具链,两者都是正确的)。为了您的理智,我建议您编写脚本,除非库中只有很少的外部可见函数和变量。

我不得不同意一些评论者的观点;除非转移库非常困难,否则您应该只构建一个包含库的简单图像并推送整个东西。你可能会说库现在永远不会改变,但不可避免地会出现一些需要改变库代码的事情,如果你改变了库并且不能将符号保持在完全相同的位置,那么你所有的应用程序图像都不会能够使用新库。这是处理兼容软件(固件)更新时的噩梦。