1.寄存器
1.1通用寄存器
1.1.1 概述
Cortex-M3和M4處理器在處理器的內核中有多個執行數據處理和控制的寄存器,這些寄存器大多以寄存器組的形式進行了分組;對於ARM架構,若處理的是存儲器的數據,那么需要將存儲器的數據加載到寄存器當中,處理完畢后,若有必要,還要寫回存儲器,這種方式一般稱為“加載--存儲架構”。Cortex-M3和M4處理器的寄存器組中有16個寄存器,其中13個為32位通用寄存器,其余3個有特殊用途,如圖所示

1.1.2 寄存器r0~r12:
通用目的寄存器,前八個(r0~r7)也被稱為低寄存器(供16位指令訪問),高寄存器(r8~r12)為高寄存器,可用於32位指令訪問,r0~r12的初始值未定義
1.1.3 r13(棧指針):
分為兩個指針,主棧指針(MSP)為默認的棧指針,在復位后或處理器處於處理模式時被使用。另一個為進程棧指針(PSP),只能用於線程模式。棧指針的選擇由CONTROL特殊寄存器決定
在應用需要嵌入式OS的時候,才會用到PSP,此時內核與應用任務的棧是相互獨立的,MSP的初始值需要在復位流程中從存儲器的第一個字中取出,PSP的初始值未定義。
1.1.4 r14(鏈接寄存器LR)
用於函數或子程序調用時返回地址的保存,在函數或者子程序結束時,可以通過將LR的數值加載進程序計數器(PC)中返回程序並繼續執行。
Cortex-M處理器的返回地址總是偶數(指令會對齊半字地址上,因此,第0位為0),LR的第0位可讀可寫,有些跳轉、調用操作需要將LR的第0位置1表示Thumb狀態。
1.1.5 r15(程序計數器PC)
可讀可寫,讀操作返回當前指令地址加4(流水線特性),寫PC會引起跳轉操作。
1.2 特殊寄存器
1.2.1 概述
除了寄存器組中的寄存器外,還有多個特殊寄存器,這些寄存器表示處理器狀態,操作狀態,中斷異常屏蔽。如圖:

特殊寄存器未經過存儲器映射,可以使用MSR和MRS等特殊寄存器訪問指令來進行訪問,例如MRS<reg> ,<special_reg>等,不要把特殊寄存器和其它微控制器架構中的特殊功能寄存器(SFR)搞混了,
它們一般指的是用於IO控制的寄存器。
1.2.2 程序狀態寄存器
包含三個:應用PSR(APSR),執行PSR(EPSR),中斷PSR(IPSR);這三個寄存器可以通過一個組合寄存器(xPSR)訪問,ARMv7-M架構中各個PSR的定義如下圖:


1.2.3 PRIMASK,FAULTMASK和BASEPRI寄存器
以上寄存器均用為異常/中斷的屏蔽,每個異常/中斷都有一個優先等級,數值越小優先級越高。這些特殊寄存器基於優先等級屏蔽異常,只有在特權等級才可以對它們進行操作。默認全部為0(不起作用)
這些編程寄存器的編程模型如下圖:

PRIMASK寄存器為1位寬的中斷屏蔽寄存器,置位時,會組織不可屏蔽中斷(NMI)和HardFault異常之外的所有異常/中斷。實際上,它是將當前異常優先級提升為0。
FaultMask和PRIMASK非常相似,不過它能屏蔽HardFault異常,實際上是將優先級提升到了-1。
BASEPRI寄存器會根據優先等級屏蔽異常和中斷。BASEPRI的寬度取決於設計實際實現的優先級數量,通常為3或4bit,當設置為非0值,它會屏蔽具有相同或更低優先級的異常/中斷。
1.2.4 CONTROL寄存器
CONTROL寄存器定義了:棧指針的選擇(MSP/PSP),線程模式的訪問等級(特權/非特權)。具體位域定義如下:


運行在非特權等級的程序無法再切換回特權訪問等級,若有必要將處理器在線程模式切換回特權訪問等級,則需要使用異常機制,在異常處理期間,處理程序可以清楚nPRIV位。

在未使用嵌入式OS的多數簡單應用,無需修改CONTROL寄存器的數值。整個應用可以運行在特權訪問等級並且只使用MSP。
2.存儲器系統
Cortex-M處理器的總線接口為通用總線接口。微控制器存儲器系統中的存儲器一般為兩種或更多:程序代碼用的Flash存儲器,數據用的靜態RAM(SRAM),有時還會有電可擦除只讀存儲器(EEPROM)。軟件開發人員只需要了解程序存儲器和SRAM的地址及大小即可。
- 存儲器映射:Coretex-M處理器的4GB地址空間被分為了多個存儲器區域,主要用於:程序代碼訪問(CODE區),數據訪問(SRAM區),外設區域,處理器的內部控制和調試部件,存儲器映射如下:

- 棧存儲
棧可用於:
1.當正在執行的函數需要寄存器進行數據處理時,臨時存儲數據的初始值。這些數據在函數結束時可以被恢復出來,以免調用函數的程序丟失數據
2.往函數或子程序中的信息傳遞
3.用於存儲局部變量
4.在中斷等異常產生時保存處理器狀態和寄存器數值



三.異常和中斷

處理器自身也是一個異常事件源,其中包括系統錯誤狀態的錯誤事件以及軟件產生,支持嵌入式OS操作的異常,這些異常類型如下:


編號1~15歸為系統異常,16號及其以上則用於中斷,Cortex-M3及M4的中斷等待非常小,只有12個周期。
- 嵌套向量中斷表(NVIC)
NVIC是Cortex-M處理器的一部分,是可編程的,且寄存器位於存儲器映射的系統控制空間(SCS)。NVIC處理異常和中斷配置,優先級以及中斷屏蔽。
- 向量表
當異常事件產生且被處理器內核接收后,相應的異常處理就會執行。要確定異常處理的起始地址,處理器引入了一種向量表機制。向量表為系統存儲器內的子數據數組,每個元素都代表一個異常類型的起始地址,向量表是可以重定位的,重定位由NVIC中的VTOR可編程寄存器控制。復位后,VTOR默認為0,向量表則位於0x0處,如下所示:

每個異常向量的最低位表示異常是否在Thumb狀態下執行,由於Cortex-M處理器只支持Thumb指令,因此,所有異常向量的最低位為1。
四.復位和復位流程
對於典型的Cortex-M微處理器,復位類型有三種:
1.上電復位:復位微控制器的所有部分其中包括處理器,調試部件和外設等
2.系統復位:只復位處理器和外設,不復位處理器的調試部件
3.處理器復位:指復位處理器
在復位后以及處理器開始執行程序前,Cortex-M處理器會從存儲器中讀出頭兩個字,如下圖

MSP的設置是非常有必要的,因為在復位的很短時間內又產生NMI或HardFault的可能,在異常處理前將處理器狀態壓棧時需要棧存儲和MSP。
示例如下:

對於Cortex-M處理器,向量表中向量地址的最低位應該為1,以表示他們為Thumb代碼。因此,上圖復位向量為0x101,而啟動代碼從0x100開始,在取出復位向量后,Cortex-M處理器就可以從復位向量地址處執行程序,並開始正常操作。
