【问题标题】:LPC1788 - Bootloader and shared libraryLPC1788 - 引导加载程序和共享库
【发布时间】:2017-01-24 10:37:32
【问题描述】:

我正在为我的定制板 (LPC1788) 开发嵌入式软件。我的目标是提高嵌入式系统 C 编程的技能和经验。

我已经实现了一个 USB 引导加载程序,它可以启动用户应用程序(如果存在)。否则,它用于通过 USB 轻松加载应用程序。 我的 USB 引导加载程序使用静态库 board.a,用户应用程序也是如此。

有什么技巧可以从用户应用程序引用board.a,它被链接到引导加载程序的二进制文件中?

换句话说,我想通过只输入一次board.a 代码和数据来优化闪存空间。

注意:我使用 LPCXpresso(NXP MCU 工具/GNU Make Builder)它调用 arm-none-eabi-gcc(GNU ARM 嵌入式工具链)

【问题讨论】:

  • 我不认为有一个简单的方法可以做到这一点,但假设你将来会改进库 board.a,所以也要改进 userApp。您将能够使用改进的库上传新应用程序,而无需接触引导加载程序。这是正常的工作方式——我的意思是:你只刷新一次引导加载程序,而应用程序则刷新一次或多次。我认为共享库不是一个好主意。
  • 是的,你完全有理由升级 board.a 强制升级引导加载程序(非正常工作)。我只是想优化空间。谢谢你:)
  • 从理论上讲,我看不出有什么理由不这样做。但这取决于您的工具链(编译器/链接器),所以请edit您的问题并添加详细信息。

标签: c linker embedded cortex-m3


【解决方案1】:

就像在操作系统上使用共享库一样。您的系统设计可以是,当引导加载程序分支到应用程序时,它可以使用其中一个寄存器(例如 r0)来包含“共享”库的地址,或者它可以包含指向指针数组的指针这是您要共享的 board.a 中各个功能的地址。无论如何,从链接/使用的角度来看,函数只不过是地址,因此只需将应用程序中的函数指针与地址空间中已经存在的函数(我假设是闪存)匹配起来。这就是共享库的全部内容,它们只是具有库和存根,以帮助您在这些操作系统上运行的应用程序看不到它。

【讨论】:

  • 另一种方法是使用链接器强制共享代码在被引导加载程序和应用程序链接时位于同一位置。例如,一个链接描述文件条目表示此代码位于闪存中的偏移量/地址 0x2000,但引导加载程序在程序下载时忽略该范围内的地址(假设您使用的是 intel hex 或 motorola srecord 格式,或者可能是 elf 或其他) ,这样除了链接描述文件的一两行之外没有其他工作(可能必须是一个对象而不是库才能工作)。
  • 感谢您的回答。现在对我来说更清楚了。请让我知道如何在同一地址强制链接库。你能告诉我如何提高我在嵌入式开发(HAL、C、链接器、设计、RTOS...)方面的知识吗?
猜你喜欢
  • 2014-10-13
  • 1970-01-01
  • 2020-03-12
  • 2016-10-12
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
相关资源
最近更新 更多