各位大神好!
我通过自定义scatter文件将set_LED这个函数固定到了0x080E0020这个地址。
set_LED函数的申明:
void set_LED(int LEDn, int state) __attribute__((section(".ARM.__at_0x080E0020")));
现在我在main函数中这样调用:
#include "stm32f407xx.h"
const int temp __attribute__((section(".ARM.__at_0x08080020"))) = 12;
int main()
{
if(temp==12){
//GPIOF->BSRRH |= 1<<6;
((void (*)(int, int))0x080E0020)(0,1);
}
while(1){
}
}
在调试状态,可以看到是进入了set_LED这个函数的,但是再进行下去就直接HardFault_Handler了。
求告知真相。
------解决思路----------------------
给CPU执行的地址是0x080E0021,但在内存中其实还是0x080E0020,LZ,你注意ARM的Thumb指令集要求,在地址位的最低比特位是1,表示是Thumb的,0表示ARM的。
这是从ARM7时代开始,也即是ARMv4版本的汇编指令体系结构就开始了,现在上到ARMv6/v7,或者说CM0/3,因为历史原因,地址位的最后一个bit还是1,v6版本开始,就是Thumb2指令了,没有ARM指令,LZ以后在调试代码时,多注意看看汇编窗口,可以发现这个现象的。此外,可以看看CM3权威指南这本书,讲得很好很清楚。