Cortex-M4 核心寄存器 雜記

以下寄存器的地址從低到高排列:

R0 ~ R12(均爲32bits)

通用寄存器,其中R0~R7爲低地址通用寄存器,R8~R12爲高地址通用寄存器;

SP(R13)(32bits)

棧指針寄存器(Stack Pointer),實際上存在兩個R13寄存器,分爲主棧指針MSP(Main Stack Pointer)寄存器過程棧指針PSP(Process Stack Pointer)寄存器。任意時刻下CPU只能使用一個SP,當CPU處於線程模式(Thread Mode)時,運行非特權級程序(Unprivileged Software)只能使用PSP訪問過程棧(Process Stack)(PS通常不止一個),而運行特權級程序(Privilege Software)可以使用MSP訪問主棧(Main Stack)(通常只有一個);當CPU處於處理模式(Handler Mode)時,運行異常(Exception)服務程序,默認使用MSP訪問MS。

> 異常(Exception)包括了硬件故障(Fault)和內外/軟硬中斷(Interrupt)。

LR(R14)(32bits)

連接寄存器(Link Register),用於存儲函數調用或異常處理程序返回的數據。

PC(Program Counter)(R15)(32bits)

程序計數器,指向指令的指針,Reset後CPU將復位向量(Reset Vector)(位於地址0x00000004)的值存入PC並將最低位的值賦給EPSR寄存器的T位(可見,若設置不當,有可能導致CPU進入ARM State)。

PSR(Program Status Register)(共26有效bits,分佈在一個完整字中)

程序狀態寄存器,在一個字(Word = 32bits)內同時存放(不共享bits)了3個PSR,分別爲:APSR、IPSR和EPSR。

APSR(Application Program Status Register),佔用位[31:27]+[19:16],共8bits,記錄了一系列與當前指令的操作結果相關的標誌Flag(如:小於或負標誌位N[31],零標誌位Z[30],大於等於標誌位GE[19:16]等);

IPSR(Interrupt Program Status Register), 佔用位[8:0],共9bits,記錄了當前發生的異常的類型編號,最多可表達2047個異常類型,但目前實際只有84種。

EPSR(Execution Program Status Register),佔用位[26:24]+[15:10],共9bits,記錄了CPU的Thumb State狀態(若T[24]位爲1,則CPU處於Thumb State),以及If-Then指令塊中各個條件的判斷結果,或可中斷指令(Interruptible-Continuable Instruction, ICI)的下一個寄存器操作數(Register Operand)

> ICI指令通常爲寄存器數據塊讀寫指令(如LDM STM、VLDM、VSTM、VPUSH、PUSH、VPOP、POP等),需要多個指令週期來完成,若被異常中斷則可將下一個要讀/寫的寄存器編號暫存於IPSR的ICI/IT位域內,作爲ICI的現場保護機制。

 

Exception Mask Registers爲異常屏蔽寄存器,共有3個,下段順序列出,各佔用一個完整的字(32bits),爲用戶提供屏蔽非致命的不重要的異常的功能,從而滿足某些具有高實時性要求的應用:

PRIOMASK(Priority Mask Register)

優先級屏蔽寄存器,有效位爲PRIMASK[0],該位置1時,除不可屏蔽中斷(Non-Maskable Interrupt, NMI)以外的所有可以配置優先級的異常(通常爲中斷)都將被屏蔽(CPU不響應)。

FALUTMASK(Fault Mask Register)

故障屏蔽寄存器,有效位爲FAULTMASK[0],該位置1時,除不可屏蔽中斷(Non-Maskable Interrupt, NMI)以外的所有異常(包括故障異常)都將被屏蔽。

> 當CPU退出處理模式(Handler Mode)(可能是由任意類型的異常觸發的)時,CPU將自動將FAULTMASK爲清0,從新使能其對故障異常的響應。

BASEPRIO(Base Priority Mask Register)

基優先級屏蔽寄存器,有效位爲BASEPRI[7:4],共4bits,記錄了某個異常優先級(對優先級的表達與NVIC_IPRx寄存器中用到的表達相同),所有優先級低於或等於該優先級的異常將被屏蔽。

CONTROL(Control Register)

控制寄存器,有效位爲[2:0],共3bits,分別控制了CPU所使用的棧(PS或MS)、當前程序的特權級別(有特權或無特權),以及浮點單元(Floating-Point Unit, FPU)的狀態。

> 當CPU處於Thread Mode時可運行特權級程序(Privileged Software)非特權級程序(Unprivileged Software),而在Handler Mode下只運行特權級程序

 

> 非特權級程序訪問核心寄存器的指令(MRS、MSR、CPS)受到一定的限制,訪問內存和外設也受限,且無法訪問系統計時器(System Timer)NVIC(Nested Vector Interrupt Controller)以及系統控制塊(System Control Block)等硬件資源,不過可以通過SVC指令調用特權級程序;而特權級程序可使用所有指令,並訪問所有的硬件資源。

 

> 特權級用戶程序可通過將EPSR寄存器的T位設置爲1來將CPU設置爲Thumb State。若該位爲0,則CPU工作在ARM State,此時若接收到Thumb指令,CPU將陷入自鎖態(Lockup),只能通過Reset Exception來解除。

 

> Cortex-M4處理器採用ARMv7-M架構,僅支持Thumb-2指令集(從Cortex-M3系列開始,就勇敢地拋棄了ARM指令集),因此CPU只能工作在Thumb State下,在異常處理程序中亦如此。

 

> Thumb-2指令集是一套完善的精簡指令集,同時存在16bits指令和32bits指令,完全兼容Thumb指令集,並具有豐富的拓展子集。這使得Thumb-2兼顧了Thumb指令集高存儲密度、低功耗的優點和ARM指令集功能完善、高效的優點,是時下較爲流行的指令集之一。它免除了繁雜的CPU狀態切換操作,CPU得以完全工作在Thumb State之下。

 

【官方建議】

RTOS中的線程(或稱“任務”)最好運行在Cortex-M4的Thread Mode下,這也是CPU在執行復位程序後默認返回的模式,此時CPU根據PSP寄存器來訪問PS;而OS的內核(Kernel)異常處理程序(Exception Handler)則最好運行在CPU的Handler Mode下,可直接訪問所有硬件資源,此時CPU根據MSP訪問MS。

 

> OS內的每一個任務(線程)都有一個自己專屬的過程棧,這些過程棧的指針都存放在對應任務的任務控制塊(Task Control Block, TCB)的Task_SP成員上。當某個任務被調度(從就緒態轉變爲運行態)時,CPU將其TCB內Task_SP成員的值賦給CPU的核心寄存器SP(R13)的PSP,從而實現任務上下文切換(或現場恢復)。

【關於CMSIS】

Cortex微控制器應用程序接口標準(Cortex Micro-controller Software Interface Standard),定義(規範化、統一化)了Cortex系列CPU核心外設核心寄存器的標準稱謂及其訪問“方法”(既函數),以及“異常”向量的標準稱謂。從而向開發者提供了屏蔽了寄存器地址級硬件信息RTOS內核開發接口核心外設功能開發接口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章