【问题标题】:How to put a C function in some address range如何将 C 函数放入某个地址范围
【发布时间】:2010-10-28 08:29:13
【问题描述】:

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

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

这方面的任何建议都会很有帮助。

谢谢

【问题讨论】:

标签: c assembly bootloader


【解决方案1】:

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

【讨论】:

  • 是的,你可能是对的。我正在使用处理器专家的代码战士。所以,我认为你在谈论 .prm 文件。那么,是不是在所有这些 USB 文件上我都会说“#pragma CODE_SEG Bootloader_ROM”,在这个 prm 文件中我会将“Bootloader_ROM”添加到特定的 ROM 内存中。
  • @Punit:这听起来很合理,但在不了解工具集的情况下,无法确定。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2012-05-18
    • 2013-11-11
    • 2019-02-28
    相关资源
    最近更新 更多