上下文是:用arm-none-eabi-gcc编译的STM32H753裸机软件。
复位处理程序用 C 语言实现,位于闪存中:
void reset_handler_c(void)
{
asm_func();
}
asm 函数在 .s 文件中实现并位于 RAM 中:
.global asm_func
asm_func:
ldr sp,=xxx
bl entry_point
bx lr
(事实上,它没有多大意义,但它显然是一个简化的示例,只是为了重现问题)
生成的asm如下:
问题是:BLX指令只能使用寄存器作为参数并且在执行时会产生硬故障。 STM32H7编程手册摘录:
现在,如果我调用 C 函数,BLX 就会被 BL 替换,这是正确的:
知道为什么 gcc 会生成这个奇怪的 BLX 指令吗?
问题是:BLX指令只能使用寄存器作为参数 并且在执行时会产生硬故障。
我并不感到惊讶,因为你的核心不知道这条指令。
BLX label
存在于ARM生态系统中,但在Cortex-M7内核中不可用。您正在为错误目标进行编译。如果您想使用正确的 FPU 指令,您需要添加到编译器调用中:
-mthumb -mcpu=cortex-m7
+ 更多内容。
void (*fptr)(void) = asm_func;
fptr();
whih 将仅生成 BLX Rm 指令。