M3內(nèi)核基本結(jié)構(gòu)
- Cortex-M3內(nèi)核是32位的
- M3F103內(nèi)核采用Thumb-2指令集
- 支持16/32位指令混合編碼
- 內(nèi)核模式分為handler(管理者)和thread(線程)模式。handler運行在特權(quán)級下,thread可運行在特權(quán)級下和用戶級下
- 操作權(quán)限分兩個等級:特權(quán)級和用戶級郊闯,處理器復(fù)位后自動進入thread模式下的特權(quán)級,這時候程序具有全部權(quán)限俗冻,處理器配置完畢后自動進入thread的用戶級,放棄對重要處理器的配置權(quán)限牍颈。當(dāng)進入中斷時迄薄,自動切換到handler級。通過control寄存器的第0位可以切換特權(quán)級
- 內(nèi)核有18個寄存器煮岁,R0-R12讥蔽、R13為SP寄存器、R14為LR寄存器画机、R15為PC寄存器冶伞、XPSR寄存器
R0-R12作為通用寄存器,這些通用寄存器用來存放臨時數(shù)據(jù)步氏,R0-R3在程序調(diào)用時可以用來傳遞函數(shù)參數(shù)和返回值响禽,R12在某些情況下可以用來 保存子程序的中間值
SP是棧寄存器,用來指示當(dāng)前棧的位置荚醒。在M3中有兩個SP寄存器分別為MSP和PSP芋类。MSP為缺省的棧指針,handler模式只能用MSP界阁,thread模式可以使用MSP和PSP侯繁。注意任何時刻只有一個SP起作用,可簡單的只使用MSP泡躯。
LR是鏈接寄存器贮竟,用來保存跳轉(zhuǎn)后返回的地址丽焊。當(dāng)發(fā)生函數(shù)調(diào)用時,LR寄存器中保存著函數(shù)返回后需要執(zhí)行的指令地址咕别。LR對普通函數(shù)調(diào)用時存儲調(diào)用函數(shù)后的返回地址技健,但在中斷發(fā)生時發(fā)生了變化。
當(dāng)中斷發(fā)生時惰拱,硬件自動存儲R0-R3凫乖,R12,LR弓颈,PC,XPSR這8個寄存器删掀,中斷返回時自動恢復(fù)這8個寄存器翔冀。中斷發(fā)生時將這8個寄存器壓入PSP/MSP棧,進入中斷服務(wù)程序后披泪,硬件會自動將一個特殊的值EXC_RETURN而不是返回地址存入LR中纤子,EXC_RETURN只有三個值,0xFFFFFFF1表示中斷服務(wù)程序返回handler模式且使用MSP款票,0xFFFFFFF9表示中斷服務(wù)函數(shù)返回thread模式且使用MSP控硼,0XFFFFFFFD表示中斷服務(wù)函數(shù)返回thread模式且使用PSP。
中斷時由于LR不保存返回地址艾少,所以根據(jù)棧中的PC值(下條指令地址)來尋找入口卡乾。
可以理解為M3內(nèi)核機制進行了一個二級跳,先將8個寄存器數(shù)值壓入棧中缚够,再將代表中斷返回所使用的工作模式以及棧寄存器的EXC_RETURN值存入LR中幔妨,中斷退出時跳轉(zhuǎn)到EXC_RETURN值,并從棧中取出8個寄存器值,這樣就不僅找到了返回地址,又可以找到中斷前的工作狀態(tài)和棧指針裸准。
PC寄存器存儲的是當(dāng)前所執(zhí)行指令所在的地址副硅。處理器通過PC寄存器找到其需要執(zhí)行的指令,更改PC寄存器就會發(fā)生指令跳轉(zhuǎn)羞迷。
XPSR--狀態(tài)寄存器,這個狀態(tài)寄存器由多個寄存器復(fù)合而成。APSR存放著程序的狀態(tài)悉抵,IPSR存放著中斷號,EPSR存放著執(zhí)行程序的狀態(tài)摘完。
STM32F103處理器運行的程序完全由這18個寄存器控制基跑,操作系統(tǒng)通過備份、還原更改寄存器來控制程序執(zhí)行流程描焰,實現(xiàn)任務(wù)切換媳否。
Thumb-2指令集
- 指令數(shù):16條 指令空間:40byte 指令特點:16/32混合
- 數(shù)據(jù)計算指令:add栅螟、adr、sub
- 數(shù)據(jù)搬移指令:mov篱竭、ldr力图、ldm、stm掺逼、push吃媒、pop
- 狀態(tài)寄存器操作指令:mrs、msr
- 邏輯計算指令:and
- 跳轉(zhuǎn)指令:bx吕喘、xbz
- 軟中斷指令:svc
一個例子
testfunc1
PUSH {R4-R5}
LDR R0, =1
LDR R1, =2
LDR R2, =3
LDR R3, =4
LDR R4, =5
LDR R5, =6
PUSH{R4-R5,R14}
BL testfunc2
ADD R0,#7
ADD SP,#8
POP{R14}
POP{R4-R5}
BX R14
char testfunc2(char p1,char p2,char p3,char p4,char p5,char p6)
{
return p1 + p2 + p3 + p4 + p5 +p6;
}
該函數(shù)依次進行了赘那,將R4,5壓棧(0-3不壓),R14(LR)壓棧氯质,計算testfunc2募舟,恢復(fù)現(xiàn)場的操作。
函數(shù)間調(diào)用標(biāo)準(zhǔn)
該內(nèi)核使用匯編語言編寫寄存器相關(guān)代碼闻察,用c編寫功能型代碼
Arm內(nèi)核上的規(guī)則是AAPCS
- 父函數(shù)與子函數(shù)間的入口參數(shù)通過R0-R3傳遞
- 子函數(shù)通過R0將函數(shù)值傳遞給父函數(shù)
- AAPCS規(guī)定拱礁,發(fā)生函數(shù)調(diào)用錢由父函數(shù)備份R0-R3寄存器中有用的數(shù)據(jù)
- R4-R11為普通的通用寄存器
- R13寄存器是SP,用來保存當(dāng)前指針
- R14是連接寄存器辕漂,用來保存函數(shù)的返回地址
- R15是程序寄存器PC呢灶,正在執(zhí)行的指令所在的地址存儲在PC中
- XPSP寄存器是狀態(tài)寄存器,某些指令會影響狀態(tài)寄存器钉嘹,用作判斷