上下文为:使用arm-None-eabi-gcc编译的STM32 H753裸金属软件.
重置处理程序是用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指令只能取一个寄存器作为参数and a hardfault is generated at execution.摘录自STM32H7编程手册:
现在,如果我调用一个C函数,BLX将被BL替换,这是正确的:
你知道为什么gcc会生成这个奇怪的BLX指令吗?
编辑:编译选项为-mcpu=cortex-m7 -std=c99 -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -O1 ...