一、Cortex-M4采用的價格
Cortex-M4采用ARMv7-ME架構,主要特點有:
- 32位處理器,哈佛結構,三級流水線
- Thumb-2指令集,擴展的DSP指令和SIMD指令,單周期MAC
- 可選的單精度FPU,可選的MPU,可選的Debug$trace接口
- 可配置的NVIC,可配置的WIC(wakeup interrupt controller)
- 3套AHB-Lite總線接口
- 低功耗,高性能
- 與Cortex-M3內核兼容......
二、Cortex-M4流水線
Cortex-M4使用一個三級流水線,分別是取指、譯碼和執行
讀取PC會返回當前指令地址+4,以兼容Thumb代碼。 不管是執行16位指令還是32位指令, 其偏移量總是4,這保證了Thumb和Thumb-2指令之間的一致性。
內核的預取單元中有一個指令緩沖區,它允許后續的指令在執行前先在里面排隊,也能在執行未對齊的32位指令時,避免流水線“斷流”。
緩沖區並不會在流水線中添加額外的級數,因此不會惡化跳轉導致的性能下降( penalty)
三、Cortex-M4的總線接口(簡單了解)
Cortex-M4的3套總線
- I-Code總線(讀取指令)
- D-Code總線(訪問數據)
- 系統總線
圖示
四、Cortex-M4的相關寄存器組
1、通用寄存器組
R0‐R12 是通用寄存器, 但是絕大多數的 16 位指令只能使用 R0‐R7(低組寄存器),而 32 位的 Thumb-2指令則可以訪問所有通用寄存器
2、堆棧指針R13(SP)
- 主堆棧指針(MSP) ,或寫作 SP_main。這是缺省的堆棧指針,它由 OS 內核、異常服務例程以及所有需要特權訪問的應用程序代碼來使用
- 進程堆棧指針(PSP) ,或寫作 SP_process。用於常規的應用程序代碼(不處於異常服用例程中時)
3、連接寄存器R14(LR)
連接寄存器用於在調用子程序時存儲返回地址,如,在使用 BL指令時,自動填充 LR 的值。
4、程序計數器R15(PC)
因為 CM4 內部使用了指令流水線,讀 PC 時返回的值是當前指令的地址+4。比如:0x2000: MOV R0, PC ; R0 = 0x2004
5、特殊功能寄存器組
5.1、程序狀態寄存器(xPSR)
程序狀態寄存器在其內部又被分為三個子狀態寄存器:
- 應用程序狀態寄存器( APSR)
- 中斷狀態寄存器( IPSR)
- 執行狀態寄存器( EPSR)
5.2、中斷屏蔽寄存器組
- PRIMASK,只有1個位的寄存器。當它置1時,就關掉所有可屏蔽的異常,只剩下 NMI和硬fault可以響應。它的缺省值是0,表示沒有關中斷。
- FAULTMASK,只有1個位的寄存器。當它置1時,只有NMI才能響應,所有其它的異常,包括中斷和fault,通通閉嘴。它的缺省值也是 0,表示沒有關異常。
- BASEPRI ,8位寄存器(由表達優先級的位數決定)。它定義了被屏蔽優先級的閾值。當它被設成某個值后,所有優先級號大於等於此值的中斷都被關(優先級號越大,優先級越低)。但若被設成0,則不關閉任何中斷,0是缺省值。
5.3、控制寄存器CONTROL
-
CONTROL[2]
- 0=FPU禁止
- 1=FPU激活
-
CONTROL[1]
-
- 0=選擇主堆棧指針 MSP(復位后缺省值)
- 1=選擇進程堆棧指針 PSP
- 線程模式可以使用 PSP。handler 模式下,只允許使用 MSP,所以此時不得往該位寫 1。
-
CONTROL[0]
-
- 0=特權級的線程模式
- 1=用戶級的線程模式
- Handler 模式永遠都是特權級的。
五、Cortex-M4操作模式
Cortex-M4支持 2 個模式和兩個權限等級
當處理器處在線程狀態下時,既可以使用特權級,也可以使用用戶級;
handler模式總是特權級的。在復位后,處理器進入線程模式+特權級
在特權級下的代碼可以通過置位 CONTROL[0]來進入用戶級。用戶級下的代碼不能再試圖修改 CONTROL[0]來回到特權級。
而不管是任何原因產生了任何異常,處理器都將以特權級來運行其服務例程,異常返回后將回到產生異常之前的級別。
用戶級變更為特權級的方式:用戶級下的代碼必須通過一個異常 handler,由那個異常 handler 來修改 CONTROL[0],才能在返回到線程模式后拿到特權級。
六、Cortex-M4復位序列
Cortex-M4內核復位后,讀取下列兩個32位整數的值:
- 從地址 0x0000,0000 處取出 MSP 的初始值。
- 從地址 0x0000,0004 處取出 PC 的初始值——這個值是復位向量, LSB 必須是 1。然后從這個值所對應的地址處取指。
傳統的ARM 架構總是從0地址開始執行第一條指令。它們的0地址處總是一條跳轉指令。在 CM4中,0地址處提供 MSP 的初始值,然后就是向量表(向量表在以后還可以被移至其它位置)。向量表中的數值是32位的地址,而不是跳轉指令。向量表的第一個條目指向復位后應執行的第一條指令