良许Linux教程网 干货合集 嵌入式bootloader跳转程序实现原理

嵌入式bootloader跳转程序实现原理

嵌入式开发,很多时候都需要bootlodaer程序,今天围绕bootlodaer讲述一下实现原理,以及相关的内容。

1.bootloader是如何实现程序跳转的?

2.复位向量表

3.理解__set_MSP语句

  • 关键字帮助
  • 堆栈指针SP
  • 控制寄存器CONTROL

写在前面

前面给大家分享了《STM32实现IAP的方法》,主要讲述了IAP编程实现的过程。

其中bootloader跳转的细节没有具体描述,也很少有人研究其中细节的问题。

image-20230803225803154
image-20230803225803154

大家先看一下上图中四行跳转代码,接下来将围绕这四行代码拓展相关的内容。

如何实现程序跳转?

上图四行代码中有几个定义没有贴出来,下面一并贴出来:

#define ApplicationAddress 0x8003000

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 初始值)

拿Cortex-M3(STM32F1)为例(其它M0、M4类似),Cortex-M3权威手册(中文)表 7.6 上电后的向量表

image-20230803225817727
image-20230803225817727

是什么意思呢? 就是相对应用程序存储起始地址的一张向量表,而这张向量表就是按照这样的约定:偏移4的地址为复位向量(PC 初始值),也就是我们应用程序复位的地方。

同样,可以参看启动代码(以STM32F1为例):

image-20230803225821120
image-20230803225821120

这里代码和Cortex-M3技术参考手册数据一一对应的关系。相信看了这两个地方的内容,大家能明白为什么会是ApplicationAddress + 4了。

理解__set_MSP语句

1.拓展:MDK-ARM新功能

点看下图,放大,自己看截图代码(标记处):

image-20230803225824137
image-20230803225824137

用MDK-ARM V5.25及以上版本打开工程,可以看到在__set_MSP下面有一行下划线,**什么意思呢?*具有上下文帮助(F1)的关键字将用浅灰色下划线突出显示*

2.理解__set_MSP语句

上面讲述的内容是想引申出来:鼠标放在__set_MSP的位置,按F1,就可以直接进入帮助文档。

下面是详细内容截图:

image-20230803225826957
image-20230803225826957

大概意思是:调用MSR指令设置主状态指针(MSP)的值

物理上存在两个不同的堆栈指针(SP):

**1.主堆栈指针(MSP)**,复位后的默认堆栈指针。在运行异常处理程序时也使用它。

**2.进程堆栈指针(PSP)**,只能在线程模式下使用。

当引用R13堆栈指针(SP)时,由控制寄存器(CONTROL)的Bit[1]决定:

Bit[1]=0,用MSP;

Bit[1]=1,用PSP;

这里具体内容需要参看Cortex-M技术参考手册。

可以参看我另外一篇文章《如何判断CPU是否正在执行中断函数》讲述了关于控制寄存器(CONTROL)的一种使用方法。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部