本文分享以下幾點(diǎn)(引申出來(lái)的)重要知識(shí)點(diǎn):
1.STM32是如何實(shí)現(xiàn)程序跳轉(zhuǎn)的?
2.復(fù)位向量表
3.理解__set_MSP語(yǔ)句
關(guān)鍵字幫助
堆棧指針SP
控制寄存器CONTROL
1寫(xiě)在前面
上一篇文章《STM32 IAP應(yīng)用編程幾個(gè)要點(diǎn)》講述的內(nèi)容很多朋友都了解過(guò),也都使用過(guò)ST官網(wǎng)提供的代碼。但使用過(guò)的人有許多都沒(méi)有深入了解,僅僅只是把代碼下載到板卡中跑了一下而已(因?yàn)榇a完全可以使用)。所以,很少有人研究其中細(xì)節(jié)的問(wèn)題。
先看一下上圖中四行跳轉(zhuǎn)代碼,接下來(lái)將圍繞這四行代碼拓展相關(guān)的內(nèi)容。
2STM32是如何實(shí)現(xiàn)程序跳轉(zhuǎn)的?
上圖四行代碼中有幾個(gè)定義沒(méi)有貼出來(lái),下面一并貼出來(lái):
#defineApplicationAddress0x8003000typedefvoid(*pFunction)(void);pFunction Jump_To_Application;uint32_t JumpAddress;
ApplicationAddress為0x8003000,代表應(yīng)用程序起始地址為0x8003000。
1.JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
JumpAddress代表跳轉(zhuǎn)地址,基于應(yīng)用程序起始地址偏移4(這個(gè)偏移4下面章節(jié)講述)。這個(gè)地址就是應(yīng)用程序的復(fù)位地址,你可以理解為程序跳轉(zhuǎn)到了應(yīng)用程序復(fù)位的地址。
2.Jump_To_Application = (pFunction) JumpAddress;
將跳轉(zhuǎn)地址JumpAddress強(qiáng)制轉(zhuǎn)換pFunction類(lèi)型,你可以理解為編譯器將其編譯成一個(gè)函數(shù)。
3.__set_MSP(*(__IO uint32_t*) ApplicationAddress);
這里是將把應(yīng)用程序起始地址設(shè)為棧頂指針(__set_MSP下面章節(jié)講述)。
4.Jump_To_Application();
設(shè)置PC指針為復(fù)位地址,你可以理解為跳轉(zhuǎn)到應(yīng)用程序的函數(shù)。
這里是講述的大概內(nèi)容,細(xì)節(jié)內(nèi)容請(qǐng)往下看,看完下面細(xì)節(jié)再回來(lái)看本節(jié)內(nèi)容。
3復(fù)位向量表
上面講述了ApplicationAddress + 4“偏移4”這個(gè)問(wèn)題,其實(shí)這個(gè)“偏移4”就是向量表的偏移地址:復(fù)位向量(PC 初始值)。
拿Cortex-M3(STM32F1)為例(其它M0、M4類(lèi)似),Cortex-M3權(quán)威手冊(cè)(中文)表 7.6 上電后的向量表:
是什么意思呢?就是相對(duì)應(yīng)用程序存儲(chǔ)起始地址的一張向量表,而這張向量表就是按照這樣的約定:偏移4的地址為復(fù)位向量(PC 初始值),也就是我們應(yīng)用程序復(fù)位的地方。
同樣,可以參看啟動(dòng)代碼(以STM32F1為例):
這里代碼和Cortex-M3技術(shù)參考手冊(cè)數(shù)據(jù)一一對(duì)應(yīng)的關(guān)系。相信看了這兩個(gè)地方的內(nèi)容,大家能明白為什么會(huì)是ApplicationAddress + 4了。
4理解__set_MSP語(yǔ)句
1.拓展:MDK-ARM新功能
點(diǎn)看下圖,放大,自己看截圖代碼(標(biāo)記處):
用MDK-ARM V5.25及以上版本打開(kāi)工程,可以看到在__set_MSP下面有一行下劃線,什么意思呢?
這是MDK-ARM V5.25的新功能(現(xiàn)在,MDK-ARM V5.26就快要出來(lái)了)具有上下文幫助(F1)的關(guān)鍵字將用淺灰色下劃線突出顯示。
詳細(xì)可以參看:
http://www2.keil.com/mdk5/525
(提示:公眾號(hào)不支持外鏈接,請(qǐng)復(fù)制鏈接到瀏覽器下載)
這里推薦閱讀我另外兩篇文章:
1.MDK v5.25比較實(shí)用的功能
2.MDK-ARM V5.26預(yù)覽版更新的幾條重要內(nèi)容
2.理解__set_MSP語(yǔ)句
上面講述的內(nèi)容是想引申出來(lái):鼠標(biāo)放在__set_MSP的位置,按F1,就可以直接進(jìn)入幫助文檔。
下面是詳細(xì)內(nèi)容截圖:
大概意思是:調(diào)用MSR指令設(shè)置主狀態(tài)指針(MSP)的值。
物理上存在兩個(gè)不同的堆棧指針(SP):
1.主堆棧指針(MSP),復(fù)位后的默認(rèn)堆棧指針。在運(yùn)行異常處理程序時(shí)也使用它。
2.進(jìn)程堆棧指針(PSP),只能在線程模式下使用。
當(dāng)引用R13堆棧指針(SP)時(shí),由控制寄存器(CONTROL)的Bit[1]決定:
Bit[1]=0,用MSP;
Bit[1]=1,用PSP;
這里具體內(nèi)容需要參看Cortex-M技術(shù)參考手冊(cè)。
我的另外一篇文章《如何判斷CPU是否正在執(zhí)行中斷函數(shù)》講述了關(guān)于控制寄存器(CONTROL)的一種使用方法,可以參看我那一篇文章。
5“雪白”的圖片
還是跟隨熱點(diǎn),相信大家都聽(tīng)說(shuō)了“關(guān)于谷歌回來(lái)的消息”,據(jù)知情人透露,谷歌回來(lái)幾乎不可能。
當(dāng)我現(xiàn)在(2018年8月9日)百度圖片輸入“雪白”的時(shí)候,已經(jīng)不在是“雪白”的圖片了,已經(jīng)被百度程序猿GG加班加點(diǎn)改掉了。
百度圖片搜索“雪白”如下圖:
谷歌圖片搜索“雪白”如下圖:
-
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
365027 -
復(fù)位
+關(guān)注
關(guān)注
0文章
179瀏覽量
24671 -
控制寄存器
+關(guān)注
關(guān)注
0文章
34瀏覽量
11654
發(fā)布評(píng)論請(qǐng)先 登錄
【「Yocto項(xiàng)目實(shí)戰(zhàn)教程:高效定制嵌入式Linux系統(tǒng)」閱讀體驗(yàn)】01初讀體驗(yàn)
CUEBIDE生成的APP程序,在寫(xiě)入FLASH之后無(wú)法正常跳轉(zhuǎn)怎么解決?
EMC 設(shè)計(jì)避坑指南:四不口訣

C51單片機(jī)及C語(yǔ)言知識(shí)點(diǎn)必備秘籍
電機(jī)選型計(jì)算公式與知識(shí)點(diǎn)匯總
電氣工程師必知必會(huì)的100個(gè)電?知識(shí)點(diǎn)分享
如何用幾條命令搞定Ubuntu系統(tǒng)的網(wǎng)絡(luò)配置

使用stm32cubeide debug是可以運(yùn)行的,但是就是不能跳轉(zhuǎn),為什么?
請(qǐng)問(wèn)STM32H5遞增HDPL后如何跳轉(zhuǎn)下一級(jí)程序?
華邦電子安全閃存關(guān)鍵知識(shí)點(diǎn)
Docker-鏡像的分層-busybox鏡像制作

Aigtek功率放大器應(yīng)用:電感線圈的知識(shí)點(diǎn)分享

后悔沒(méi)有早點(diǎn)看到:天線設(shè)計(jì)中的知識(shí)點(diǎn)!

單片機(jī)中斷相關(guān)知識(shí)點(diǎn)
接口測(cè)試?yán)碚?、疑?wèn)收錄與擴(kuò)展相關(guān)知識(shí)點(diǎn)

評(píng)論