STM_ 2、學習Cortex-M4內核結構




一、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套總線

  1. I-Code總線(讀取指令)
  2. D-Code總線(訪問數據)
  3. 系統總線

圖示


四、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位的地址,而不是跳轉指令。向量表的第一個條目指向復位后應執行的第一條指令


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM