2

我有一个 Cortex-M3 芯片,我正在运行一个使用 eCos 的引导加载程序。引导加载程序在检查固件更新等后,跳转到实际应用程序所在的 ROM 上的另一个位置(BASE_ADDRESS_OF_APP + 0x19)(也使用 eCos 编译)。

现在,我不想运行普通固件,而是想运行为 Cortex-M3 目标编译的 CppUTests。因此,我能够使用 ecos glibc 编译和链接目标平台的测试,而不是实际的操作系统。但是当我使用 JTAG 将它加载到我的板上时,它不会运行。

在使用 arm-eabi-objdump 进行一些调查后,我发现 CppUTest 固件的重置向量位于 0x490 的偏移量处,而普通固件的偏移量为 0x18。我怀疑这就是为什么永远不会执行测试的原因。这个对吗?

当我将它们与相同的链接描述文件链接时,这两个固件怎么可能有不同的起始地址?

如何确保测试程序的起点与应用程序的起点相同?

4

1 回答 1

1

这取决于您的链接器脚本的编写方式,如果您的入口点地址未设置为链接器脚本中的静态位置,那么其他数据/代码可能会在您的入口点之前有效地放入目标文件中移动入口点的位置并确实导致问题。

我通常通过创建一个只有 1 个符号的新部分和如下跳转/分支指令来解决这个问题:

.section entryPointSection
b myCodeEntryPoint

然后在您的链接器脚本entryPointSection中将引导加载程序跳转到的硬编码地址。

标签可以是普通 .text 部分中的 C 函数(或必要时的程序集标签)的myCodeEntryPoint名称,并且可以链接到 jmp 范围内的任何位置。它将成为您的入口点,但您并不真正关心它在哪里,因为链接器应该找到它并正确链接它。

如果您还有其他问题,请考虑发布您的链接描述文件。

于 2013-01-31T18:06:07.060 回答