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

标签 c linker embedded firmware iar

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

工具链:IAR 8051

最佳答案

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

将您的库编译成可执行镜像,将链接器设置为使用闪存空间的特定部分。您可能需要一个伪造/ stub 入口函数才能让链接器满意。

完成后,找到库使用的所有符号地址,并在构建正常程序时指示链接器这些符号位置,并且不要指示链接进程在链接时使用中间库对象.还指示链接器将代码放入可更新的闪存部分。

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

如果您的链接器输出格式是未剥离的 Sprite (在转换为二进制文件以在闪存上刻录之前),并且如果您的链接器可以接受纯文本文件的指令(如果您是使用 gnu 工具链)。为了您的理智,我建议您编写脚本,除非该库中只有很少的外部可见函数和变量。

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

关于c - 为嵌入式应用构建固件补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28225164/

相关文章:

c - 寻找嵌入式Linux/C平台的web服务解决方案

c - gcc 和 GNU ld 链接器 - 生成具有强制固定地址/偏移量的静态链接代码

linux - 如何在运行 Linux 的 PowerPC CPU 上保留 RAM?

c - 我得到所需的错误常量表达式

c - Linux C 计时器 - 信号中断当前进程

c - 当在 C 程序中包含头文件时,链接器/编译器如何找到相应的代码?

embedded - AUTOSAR 开发

linux - Websockets 与 WiFi - 驱动程序问题

c - 如何从图像大小中提取列数和行数