关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
嵌入式开发,很多时候都需要bootlodaer程序,今天围绕bootlodaer讲述一下实现原理,以及相关的内容。
-
关键字帮助 -
堆栈指针SP -
控制寄存器CONTROL
写在前面
前面给大家分享了《STM32实现IAP的方法》,主要讲述了IAP编程实现的过程。
其中bootloader跳转的细节没有具体描述,也很少有人研究其中细节的问题。
大家先看一下上图中四行跳转代码,接下来将围绕这四行代码拓展相关的内容。
如何实现程序跳转?
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
ApplicationAddress为0x8003000,代表应用程序起始地址为0x8003000。
1.JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
JumpAddress代表跳转地址,基于应用程序起始地址偏移4(这个偏移4下面章节讲述)。这个地址就是应用程序的复位地址,你可以理解为程序跳转到了应用程序复位的地址。
2.Jump_To_Application = (pFunction) JumpAddress;
将跳转地址JumpAddress强制转换pFunction类型,你可以理解为编译器将其编译成一个函数。
3.__set_MSP(*(__IO uint32_t*) ApplicationAddress);
这里是将把应用程序起始地址设为栈顶指针(__set_MSP下面章节讲述)。
4.Jump_To_Application();
设置PC指针为复位地址,你可以理解为跳转到应用程序的函数。
这里是讲述的大概内容,细节内容请往下看,看完下面细节再回来看本节内容。
复位向量表
上面讲述了ApplicationAddress + 4“偏移4”这个问题,其实这个“偏移4”就是向量表的偏移地址:复位向量(PC 初始值)。
理解__set_MSP语句
1.拓展:MDK-ARM新功能
点看下图,放大,自己看截图代码(标记处):
用MDK-ARM V5.25及以上版本打开工程,可以看到在__set_MSP下面有一行下划线,什么意思呢?具有上下文帮助(F1)的关键字将用浅灰色下划线突出显示。
2.理解__set_MSP语句
上面讲述的内容是想引申出来:鼠标放在__set_MSP的位置,按F1,就可以直接进入帮助文档。
下面是详细内容截图:
大概意思是:调用MSR指令设置主状态指针(MSP)的值。
物理上存在两个不同的堆栈指针(SP):
1.主堆栈指针(MSP),复位后的默认堆栈指针。在运行异常处理程序时也使用它。
2.进程堆栈指针(PSP),只能在线程模式下使用。
当引用R13堆栈指针(SP)时,由控制寄存器(CONTROL)的Bit[1]决定:
Bit[1]=0,用MSP;
Bit[1]=1,用PSP;
这里具体内容需要参看Cortex-M技术参考手册。
可以参看我另外一篇文章《如何判断CPU是否正在执行中断函数》讲述了关于控制寄存器(CONTROL)的一种使用方法。
后台回复『嵌入式软件设计与开发』『STM32』阅读更多相关文章。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
原文始发于微信公众号(嵌入式专栏):嵌入式bootloader跳转程序实现原理