【问题标题】:GCC produces unaligned function address on Cortex M3GCC 在 Cortex M3 上生成未对齐的函数地址
【发布时间】:2017-01-09 10:00:21
【问题描述】:

我只是使用一个节将一个函数放置到特定地址,然后输出该函数的地址,结果是所选节地址 + 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 文件中:

.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 总是显示偶数地址 有人可以帮忙吗?

谢谢

马丁

【问题讨论】:

  • 与您的问题和问题完全无关,但使用printf 打印指针的便携方式是"%p" 格式。它要求参数是void *

标签: function gcc cortex-m3


【解决方案1】:

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

【讨论】:

  • 嗨 yugr,是的,我想就是这样。也非常感谢链接。马丁
  • 绝对是这样!
  • 换一种说法,因为只有拇指机器 (cortex-m3) 上没有互通,一些指令(如 bx 和 pop)期望为基于拇指的分支或返回地址设置 lsbit。请参阅 BX 指令文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多