GCC在Cortex M3上产生未对齐的函数地址

时间:2017-01-09 10:00:21

标签: function gcc cortex-m3

我只是使用一个部分将一个函数放到一个特定的地址,然后输出该函数的地址,结果是所选的部分地址+ 1。 这就是我所做的:

void __attribute__((section (".my_fct_address"))) Fct_Ptr_Test (void)
{
...
}

void (*fct_ptr) (void);
fct_ptr = Fct_Ptr_Test;
printf ("0X%X\r\n", (uint32_t)(fct_ptr));
fct_ptr ();

在ld-file中:

.my_fct_address 0x800F000 :
 {
   KEEP(*(.my_fct_address)) /* keep my variable even if not referenced */
 } > FLASH

上面的printf语句输出0x800F001并正确调用Fct_Ptr_Test

如果我设置

fct_ptr = 0x800F000;

系统崩溃。 如果我设置

fct_ptr = 0x800F001;

一切都很好。 如果我没有将Fct_Ptr_Test放在它自己的部分中,即让链接器将它放在任何地方我也得到一个奇数地址。 现在我想知道0x800F001如何能够成为32位控制器(ARM cortex M3)上的正确地址以及存储在0x800F000中的内容。 更奇怪的是:map-file始终显示偶数地址 有人可以帮忙吗?

由于

马丁

1 个答案:

答案 0 :(得分:2)

链接器将Thumb函数的最低有效位设置为1以便于交互操作(请参阅docs)。也许这就是你的情况?