1

我正在为 HCS08 系列微控制器开发基于 USB 的引导加载程序。我在汇编中有引导加载程序代码(适用于串行通信)。我正在从此汇编代码中调用用于 USB 通信的 C 函数(终端<>微控制器)。但是,这些 C 函数似乎没有位于保护区 ROM 中,我可以在 project.map 中看到这一点。它们与我的引导加载程序代码不连续,即我的引导程序代码从 F003 开始​​,但这些 USB 函数在某些〜1000-2000。我的问题是,如何使这些 C 函数继续使用 ROM 中的 bootloader.asm 代码。

这是程序流程:我有一个 C 主函数,它在上电时跳转到 bootloader.asm。虽然,bootloader.asm 工作正常,但由于非受保护程序 ROM 区域中的 USB 例程,这些也被擦除,此后引导加载程序无法与我的终端通信。

在这方面的任何建议都会非常有帮助。

谢谢

4

2 回答 2

1

当您为嵌入式系统生成代码时,您通常使用“链接器/定位器”而不仅仅是链接器。“定位器”部分意味着它允许您设置参数,告诉它内存应该位于哪些地址。不幸的是,我无法确切地告诉您如何使用您正在使用的工具集来指定它。如果您告诉我们那是什么工具集,那么(与我不同)使用过它的人可能会知道为您正在使用的定位器指定地址的详细信息。

于 2010-10-28T00:09:39.027 回答
0

如果您使用 gcc+binutils,您需要的是自定义链接器脚本。这将使您能够明确控制链接程序在内存中的排列方式。如果您只想进行一些修改,棘手的部分可能是为您的平台找到标准脚本。该脚本是在您构建 ld(binutils 的一部分)时生成的,然后嵌入到 ld 中。通常,您可以strings ld通过搜索“section”或其他常见的链接描述文件关键字来找到它。

库存链接描述文件可能非常复杂,以支持 GCC 的所有功能,包括调试、C++ 静态初始化器、只读数据、重定位等。

于 2010-10-28T00:29:13.463 回答