查看原文
其他

STM32四行【跳转程序】引申出来的几条重要知识点

strongerHuang strongerHuang 2021-01-31

置顶公众号,不错过每一条消息!


本文分享以下几点(引申出来的)重要知识点:

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

2.复位向量表

3.理解__set_MSP语句

  • 关键字帮助

  • 堆栈指针SP

  • 控制寄存器CONTROL


1写在前面

上一篇文章《STM32 IAP应用编程几个要点》讲述的内容很多朋友都了解过,也都使用过ST官网提供的代码。但使用过的人有许多都没有深入了解,仅仅只是把代码下载到板卡中跑了一下而已(因为代码完全可以使用)。所以,很少有人研究其中细节的问题。

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


2STM32是如何实现程序跳转的?

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

#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指针为复位地址,你可以理解为跳转到应用程序的函数。


这里是讲述的大概内容,细节内容请往下看,看完下面细节再回来看本节内容。


3复位向量表

上面讲述了ApplicationAddress + 4“偏移4”这个问题,其实这个“偏移4”就是向量表的偏移地址:复位向量(PC 初始值)


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

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


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

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


4理解__set_MSP语句

1.拓展:MDK-ARM新功能

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

用MDK-ARM V5.25及以上版本打开工程,可以看到在__set_MSP下面有一行下划线,什么意思呢?


这是MDK-ARM V5.25的新功能(现在,MDK-ARM V5.26就快要出来了)具有上下文帮助(F1)的关键字将用浅灰色下划线突出显示


详细可以参看:

http://www2.keil.com/mdk5/525

提示:公众号不支持外链接,请复制链接到浏览器下载)


这里推荐阅读我另外两篇文章:

1.MDK v5.25比较实用的功能

2.MDK-ARM V5.26预览版更新的几条重要内容



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)的一种使用方法,可以参看我那一篇文章。


5“雪白”的图片

还是跟随热点,相信大家都听说了“关于谷歌回来的消息”,据知情人透露,谷歌回来几乎不可能


当我现在(2018年8月9日)百度图片输入“雪白”的时候,已经不在是“雪白”的图片了,已经被百度程序猿GG加班加点改掉了。


百度图片搜索“雪白”如下图:


谷歌图片搜索“雪白”如下图:



推荐阅读

1.STM32 IAP应用编程几个要点

2.MDK-ARM V5.26预览版更新的几条重要内容


6最后

本文由作者strongerHuang原创发布,转载请公众号联系作者授权。


若觉得文章对你有帮助,记得点赞、分享。(一个赞代表一份认可


扫描下面二维码、关注,在底部菜单中查看更多精彩内容!

长按识别图中二维码关注



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存