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

C 为嵌入式应用程序构建固件补丁,c,linker,embedded,firmware,iar,C,Linker,Embedded,Firmware,Iar,我有一个不会改变的库堆栈和一个只使用这个堆栈的固件。固件将在这一过程中发生很多变化。我不想每次都发布整个映像(包括库堆栈),因为内存和资源有限(这是一个嵌入式应用程序,不是桌面或服务器)。 我只想发布应用程序映像,这样就可以自动使用库映像。我不知道怎么做。例如,我知道在Windows中,这是由dll处理的。但这是一个嵌入式应用程序,没有操作系统。二进制图像加载到内存,处理器将执行它。 有什么经验/建议吗 工具链:IAR 8051这在很大程度上取决于您的工具链。这里有一个可能的高视角方法 将库编译

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


工具链:IAR 8051

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

将库编译成可执行映像,将链接器设置为使用闪存空间的特定部分。您可能需要一个假/存根输入函数,链接器才会高兴

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

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

如果您的链接器输出格式是非压缩elf(在转换为二进制文件以便在闪存上刻录之前),并且如果您的链接器可以接受纯文本文件作为指令(如果您使用gnu工具链,这两种格式都是正确的),则可能会编写脚本。为了您的理智,我建议您编写脚本,除非库中很少有外部可见的函数和变量


我必须同意一些评论;除非转移库非常困难,否则您应该只构建一个包含库的简单映像,并推动整个过程。您可能会说库现在永远不会更改,但不可避免地会出现一些需要更改库代码的情况,如果您更改了库并且无法将符号保持在完全相同的位置,则所有应用程序映像将无法与新库一起使用。在处理兼容软件(固件)更新时,这是一个噩梦。

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

将库编译成可执行映像,将链接器设置为使用闪存空间的特定部分。您可能需要一个假/存根输入函数,链接器才会高兴

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

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

如果您的链接器输出格式是非压缩elf(在转换为二进制文件以便在闪存上刻录之前),并且如果您的链接器可以接受纯文本文件作为指令(如果您使用gnu工具链,这两种格式都是正确的),则可能会编写脚本。为了您的理智,我建议您编写脚本,除非库中很少有外部可见的函数和变量


我必须同意一些评论;除非转移库非常困难,否则您应该只构建一个包含库的简单映像,并推动整个过程。您可能会说库现在永远不会更改,但不可避免地会出现一些需要更改库代码的情况,如果您更改了库并且无法将符号保持在完全相同的位置,则所有应用程序映像将无法与新库一起使用。在处理兼容软件(固件)更新时,这是一个噩梦。

我想这与让编译器知道在哪里可以找到应用程序将要调用的库函数的引用(内存位置)有关。你认为这是正确的方向吗?为什么你认为完整的图像太大而不能每次发布?对于使用flash/ROM执行的MCU来说,包含一个小的引导加载程序来更新并从一个或多个可能的应用程序映像中进行选择是相当标准的做法,但您所描述的并不常见,除非是在处理来自芯片供应商的专有固件“BLOB”时。只需查看您的发布历史。。。。这仍然适用于带有IAR工具链的TMS470吗?如果是这样的话,你可能想在你的问题中具体说明这一点。您最初问题的任何解决方案都将非常依赖于工具链(可能还有架构)。我还没有在TMS上发布。我的工具链是IAR8051。在正在处理的特殊应用中,这种分离将产生很大的不同。当然,引导加载程序是存在的。哎呀,TMS在您回答的线程上,而不是您问的问题。我想这与让编译器知道在哪里可以找到应用程序将要调用的库函数的引用(内存位置)有关。你认为这是正确的方向吗?为什么你认为完整的图像太大而不能每次发布?对于使用flash/ROM执行的MCU来说,包含一个小的引导加载程序来更新并从一个或多个可能的应用程序映像中进行选择是相当标准的做法,但您所描述的并不常见,除非是在处理来自芯片供应商的专有固件“BLOB”时。只需查看您的发布历史。。。。这仍然适用于带有IAR工具链的TMS470吗?如果是这样的话,您可能想在yo中指定它