Cortex-M CPU架構(gòu)基礎(chǔ)
不同于老的經(jīng)典arm處理器(例如:ARM7,ARM9),ARM Cortex-M 處理器有一個非常不同的架構(gòu),Cortex-M是一個家族系列,其中包括Cortex M0/M3/M4/M7多個不同型號,每個型號之間會有些區(qū)別,例如Cortex-M4比Cortex-M3多了浮點計算功能等,但它們的編程模型基本是一致的。
寄存器簡介
Cortex-M系列CPU的寄存器組里有R0~R15共16個通用寄存器組和若干特殊功能寄存器,如圖所示:

通用寄存器組里的R13作為堆棧指針寄存器(Stack Pointer,SP);R14作為連接寄存器(Link Register,LR),用于在調(diào)用子程序時,存儲返回地址;R15作為程序計數(shù)器(Program Counter,PC),其中堆棧指針寄存器可以是主堆棧指針(MSP),也可以是進(jìn)程堆棧指針(PSP)。
特殊功能寄存器包括程序狀態(tài)字寄存器組(PSRs)、終端屏蔽寄存器組(PRIMASK、FAULTMASK、BASEPRI)、控制寄存器(CONTROL),可以通過MSR\MRS指令來訪問特殊功能寄存器,例如:
MRS? ?R0,? CONTROL? ;讀取CONTROL到R0中
MSR? ?CONTROL,? ?R0 ;寫入R0到CONTROL寄存器中
程序狀態(tài)字寄存器里保存算術(shù)與邏輯標(biāo)志,例如負(fù)數(shù)標(biāo)志,零結(jié)果標(biāo)志,溢出標(biāo)志等等。中斷屏蔽寄存器組控制Cortex-M的中斷除能??刂萍拇嫫饔脕矶x特權(quán)級別和當(dāng)前使用哪個堆棧指針。
如果是具有浮點單元的COrtex-M4或者Cortex-M7,控制寄存器也用來指示浮點單元當(dāng)前是否在使用,浮點單元包含了32個浮點通用寄存器S0-S31和特殊FPSCR寄存器(Floating point status and control register)。
操作模式和特權(quán)級別
Cortex-M引入了操作模式和特權(quán)級別的概念,分別為線程模式和處理模式,如果進(jìn)入異常或中斷處理則進(jìn)入處理模式,其他情況則為線程模式。

Cortex-M有兩個運(yùn)行級別,分別為特權(quán)級和用戶級,線程模式可以工作在特權(quán)級或者用戶級,而處理模式總工作在特權(quán)級,可通過CONTROL特殊寄存器控制,工作模式狀態(tài)切換情況如上圖所示。
Cortex-M的堆棧寄存器SP對應(yīng)兩個物理寄存器MSP和PSP,MSP為主堆棧,PSP為進(jìn)程堆棧,處理模式總是使用MSP作為堆棧,線程模式可以選擇使用MSP或PSP作為堆棧,同樣通過CONTROL特殊寄存器控制。復(fù)位后,Cortex-M默認(rèn)進(jìn)入線程模式、特權(quán)級、使用MSP堆棧。
嵌套向量中斷控制器
Cortex-M中斷控制器名為NVIC(嵌套向量中斷控制器),支持中斷嵌套功能。當(dāng)一個中斷觸發(fā)并且系統(tǒng)響應(yīng)時,處理器硬件會將當(dāng)前運(yùn)行位置的上下文寄存器自動壓入中斷棧中,這部分的寄存器包括PSR、PC、LR、R12、R3-R0寄存器。

當(dāng)系統(tǒng)正在服務(wù)一個中斷時,如果有一個更高優(yōu)先級的中斷觸發(fā),那么處理器同樣會打斷當(dāng)前運(yùn)行的中端服務(wù)程序,然后把這個中斷服務(wù)程序上下文的PSR、PC、LR、R12、R3-R0寄存器自動保存到中斷棧中。
PendSV系統(tǒng)調(diào)用
PendSV也稱為可懸起的系統(tǒng)調(diào)用,它是一種異常,可以像普通的中斷一樣被掛起,它是專門用來輔助操作系統(tǒng)進(jìn)行上下文切換的。PendSV異常會被初始化為最低優(yōu)先級的異常。每次需要進(jìn)行上下文切換的時候,會手動觸發(fā)PendSV異常,在PendSV異常處理函數(shù)中進(jìn)行上下文切換。
中斷向量表
中斷向量表是所有中斷處理程序的入口,把一個函數(shù)(用戶中斷服務(wù)程序)同一個虛擬中斷向量表中的中斷向量聯(lián)系在一起。當(dāng)中斷向量對應(yīng)中斷發(fā)生的時候,被掛起的用戶中斷服務(wù)函數(shù)程序就會被調(diào)用執(zhí)行。

在Cortex-M內(nèi)核上,所有中斷都采用中斷向量表的方式進(jìn)行處理,即當(dāng)一個中斷觸發(fā)時,處理器將直接判定是哪個中斷源,然后直接跳轉(zhuǎn)到相應(yīng)的固定位置進(jìn)行處理,每個中斷服務(wù)程序必須排列在一起放在統(tǒng)一的地址上(這個地址必須要設(shè)置到NVIC的中斷向量偏移寄存器中)。中斷向量表一般由一個數(shù)組定義或在起始代碼中給出,默認(rèn)采用起始代碼給出:

以SysTick中斷為例,在系統(tǒng)啟動代碼中,需要填上SysTick_Handler中斷入口函數(shù),然后實現(xiàn)該函數(shù)即可對SysTick中斷進(jìn)行響應(yīng)。

來源:文章來源于網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。