本文主要是介绍为什么bootloader跳转地址要加4?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题
“我看你验证程序从ROM跳Flash地址要加4,为啥?”
又被问到了,这次记一下,以后谁再问我就直接发链接,必须点赞+关注,哈哈
答案
上电流程
ARM内核上电以后会从启动地址开始执行,就是vector的起始地址。
vector的第一个4byte-word是堆栈的栈顶地址,后面4byte-word是程序地址,要去这里执行。
硬件上电后会把第一个word load到SP里面,然后第二个word load到PC里面。所以,bootloader跳转的地址要+4.
函数指针
对于MCU来说,变量实际上就是一个地址,在编译器的帮助下程序才可以正确的使用这个地址里面的值。
vector的第2个word存的是个程序的地址,那么vector的第二个word实际上就是个函数指针变量。所以才可以用这样的代码进行程序调用
((void (unsigned int *)(void))(0x100000004))();
这个代码在效果上等价于
typedef void (unsigned int * call_t) (void);
call_t call = (call_t)0x100000004;
call();
意思就是从0x100000004这个地址取值放到PC里面去执行。
这篇关于为什么bootloader跳转地址要加4?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!