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