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

Function GCC在Cortex M3上生成未对齐的函数地址,function,gcc,cortex-m3,Function,Gcc,Cortex M3,我只是使用一个节将一个函数放置到一个特定的地址,然后输出该函数的地址,结果是所选的节地址+1。 这就是我所做的: void __attribute__((section (".my_fct_address"))) Fct_Ptr_Test (void) { ... } 及 在ld文件中: .my_fct_address 0x800F000 : { KEEP(*(.my_fct_address)) /* keep my variable even if not referenced */

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

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

在ld文件中:

.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如何成为32位控制器(ARM cortex M3)上的正确地址,以及0x800F000中存储了什么。 更奇怪的是:映射文件总是显示偶数地址 有人能帮忙吗

谢谢


Martin

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

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

与您的问题完全无关,但是使用
printf
打印指针的便携方式是使用
%p
格式。它要求参数为
void*
。与您的问题完全无关,但使用
printf
打印指针的便携方式是使用
%p
格式。它要求参数为
void*
。嗨,yugr,是的,我想就是这样。也非常感谢你的链接。马丁尼:确实如此!换一种说法,因为在仅拇指机器(cortex-m3)上没有互通,一些指令(如bx和pop)希望为基于拇指的分支或返回地址设置lsbit。请参阅BX说明文档。嗨,yugr,是的,我想就是它。也非常感谢你的链接。马丁尼:确实如此!换一种说法,因为在仅拇指机器(cortex-m3)上没有互通,一些指令(如bx和pop)希望为基于拇指的分支或返回地址设置lsbit。请参阅BX说明文档。
fct_ptr = 0x800F000;
fct_ptr = 0x800F001;