我有一个针对 ARM Cortex M0+ MCU 的应用程序,主要用 C++ 编写,但使用用汇编程序编写的 FPU 库。出于性能原因,我需要在RAM中运行这些函数,这意味着当闪存中的函数调用它们时,需要使用farcall存根,因为通常的BL指令无法覆盖闪存和RAM之间的地址差异。对于从 C++ 编译但分配给 RAM 的代码的调用,链接器会自动生成这些存根。但对于调用我的汇编文件中的函数,则不然。
我读过“仅 ARM-EABI 目标完全支持 Farcalls 存根插入,因为它依赖于其他情况下不存在的对象文件属性。”。我还发现 GNU 汇编器有一个指令“.eabi_attribute”,所以我的猜测是我需要在汇编器文件中以某种方式使用该指令,以使链接器能够在必要时为其函数入口点生成 Farcall 存根。但我没有找到有关指定哪些属性的指导。
任何人都可以帮助我让它工作吗?我的汇编程序文件在开头附近已经有“.cpu cortex-m0plus”和“.thumb”指令。
执行此操作的机制是使用 ARM 汇编器的“C++”函数原型。 是的,你的汇编器是长调用的目标,但代码必须在调用者中生成。
例如,
void f () __attribute__ ((longcall));
长通话
短线通话
这些属性指定了特定的 函数被调用。这些属性会覆盖 -mlong-calls(请参阅 ARM 选项)命令行开关和#pragma long_calls 设置。为了 ARM,long_call属性表明该函数可能很远 远离呼叫站点并需要不同的(更昂贵) 调用顺序。 Short_call 属性总是将偏移量设置为 函数从调用点直接进入‘BL’指令。
虽然您可以使用
.eabi_attribute
执行此操作,但这是对编译器的更直接说明,无论如何您都应该生成这些头文件,以防止汇编器和“C++”之间的参数不匹配。