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

bejyjqdl  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(155)

我只是使用一个节将一个函数放置到一个特定的地址,然后输出该函数的地址,结果是所选的节地址+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语句输出0x 800 F001,Fct_Ptr_Test被正确调用
如果我设置

fct_ptr = 0x800F000;


系统崩溃。如果我设置

fct_ptr = 0x800F001;


一切都好了。如果我不把Fct_Ptr_Test在自己的部分,即让链接器把它放在任何地方,我也得到一个奇怪的地址。现在我想知道0x 800 F001如何成为32位控制器(ARM Cortex M3)上的正确地址,以及0x 800 F000中存储了什么。更奇怪的是:map-file总是显示偶数地址有人能帮忙吗?
谢啦,谢啦
马田

unguejic

unguejic1#

Linker将Thumb函数的最低有效位设置为1,以促进交互(请参见docs)。也许这就是你的情况?

相关问题