【问题标题】:Building firmware Patch for embedded applications为嵌入式应用程序构建固件补丁
【发布时间】:2015-01-29 21:42:12
【问题描述】:

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

工具链:IAR 8051

【问题讨论】:

  • 我想这与让编译器知道在哪里可以找到应用程序将要调用的库函数的引用(内存位置)有关。你认为这是正确的方向吗?
  • 为什么每次都觉得全图太大放不下?对于从闪存/ROM 执行的 MCU 来说,包含一个小型引导加载程序,该引导加载程序从一个或多个可能的应用程序映像中更新和选择,这是相当标准的做法,但是您所描述的并不是特别常见,除非在处理来自的专有固件“blob”时芯片供应商。
  • 刚刚检查了您的帖子历史记录......这仍然适用于带有 IAR 工具链的 TMS470 吗?如果是这样,您可能想在您的问题中指定它。您最初问题的任何解决方案都将非常依赖于工具链(可能还有架构)。
  • 我没有在 TMS 上发帖。我的工具链是 IAR8051。在正在处理的特殊应用中,这种分离会产生很大的不同。引导加载程序当然存在。
  • 糟糕,TMS 在您回答的线程上,而不是您提出的问题。

标签: c linker embedded firmware iar


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多