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