我有一个Cortex-M3芯片,我正在运行一个使用eCos的bootloader。在检查固件更新等之后,引导加载程序跳转到实际应用程序所在的ROM上的另一个位置(BASE_ADDRESS_OF_APP + 0x19)(也使用eCos编译)。
现在,我想运行为Cortex-M3目标编译的CppUTests,而不是运行正常的固件。所以我能够使用ecos glibc编译和链接我的目标平台测试,而不是实际的操作系统。但是当我使用JTAG将它加载到我的电路板上时,它不会运行。
在使用arm-eabi-objdump进行一些调查之后,我发现CppUTest firmare的复位向量的偏移量为0x490,而普通固件的偏移量为0x18。我怀疑这就是为什么测试永远不会被执行的原因。这是对的吗?
当我使用相同的链接描述文件链接它们时,两个固件的起始地址有何不同?
如何确保测试程序的起点与应用程序的起点相同?
答案 0 :(得分:1)
这取决于您的链接描述文件的编写方式,如果您的入口点地址未设置为链接描述文件中的静态位置,那么在您输入之前可能会有其他数据/代码放入目标文件中点,有效地移动您的入口点的位置,并确实导致问题。
我通常通过创建一个只包含1个符号的新部分和一个跳转/分支指令来解决这个问题:
.section entryPointSection
b myCodeEntryPoint
然后在链接器脚本中将entryPointSection
放在引导加载程序将跳转到的硬编码地址处。
myCodeEntryPoint
标签可以是普通.text部分中的C函数(或必要时的程序集标签)的名称,并且可以链接到jmp可达范围内的任何位置。它将成为您的切入点,但您并不关心它的位置,因为链接器应该找到它并正确链接它。
如果您还有其他问题,请考虑发布您的链接描述文件。