我正在为HCS08系列微控制器开发基于USB的引导加载程序。我在程序集中有引导加载程序代码(适用于串行通信)。 我从这个汇编代码中调用用于USB通信的C函数(终端<> Micro控制器)。但是,似乎这些C函数没有位于保护区ROM中,我可以在project.map中看到它。它们与我的引导程序代码不连续,即我的引导程序代码从F003开始,但这些USB函数在某些〜1000-2000。 我的问题是,如何使这些C函数继续使用ROM中的bootloader.asm代码。
这是程序流程:我有一个C main函数,它在加电时跳转到bootloader.asm。 虽然bootloader.asm工作正常但是由于非保护程序ROM区域中的USB例程,这些也是ERASED,然后bootloader无法与我的终端通信。
这方面的任何建议都会非常有用。
谢谢
答案 0 :(得分:1)
当您为嵌入式系统生成代码时,通常使用“链接器/定位器”而不仅仅是链接器。 “定位器”部分意味着它允许您设置参数,告诉它内存应该位于哪个地址。不幸的是,我无法确切地告诉您如何使用您正在使用的工具集来指定它。如果您告诉我们什么工具集,也许某人(与我不同)使用它将知道指定您正在使用的定位器的地址的详细信息。
答案 1 :(得分:0)
如果您使用的是gcc + binutils,那么您需要的是自定义linker script。这将使您可以明确控制链接程序在内存中的排列方式。如果您只想进行一些修改,那么棘手的部分可能是为您的平台找到标准脚本。在构建ld(binutils的一部分)然后嵌入ld时生成脚本。通常,您可以使用strings ld
找到它并搜索“section”或其他常见的链接描述文件名。
股票链接器脚本可能非常复杂,无法支持GCC的所有功能,包括调试,C ++静态初始化器,只读数据,重定位等。