Cortex-M3-寄存器
生活随笔
收集整理的這篇文章主要介紹了
Cortex-M3-寄存器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Cortex-M3-寄存器
- Cortex‐M3 處理器擁有 R0‐R15 的寄存器組。其中 R13 作為堆棧指針 SP。SP 有兩個,但在同一時刻只能有一個可以看到,這也就是所謂的“banked”寄存器。
R0-R12:通用寄存器?
- R0‐R12 都是 32 位通用寄存器,用于數據操作。但是注意:絕大多數 16 位 Thumb 指令只能訪問 R0‐R7,而 32 位 Thumb‐2 指令可以訪問所有寄存器。
Banked R13: 兩個堆棧指針
- Cortex‐M3 擁有兩個堆棧指針,然而它們是 banked,因此任一時刻只能使用其中的一個。
- 主堆棧指針(MSP):復位后缺省使用的堆棧指針,用于操作系統內核以及異常處理例程(包括中斷服務例程)
- 進程堆棧指針(PSP):由用戶的應用程序代碼使用。
- 堆棧指針的最低兩位永遠是 0,這意味著堆棧總是 4 字節對齊的。
- 要注意的是,并不是每個應用都必須用齊兩個堆棧指針。簡單的應用程序只使用 MSP就夠了。堆棧指針用于訪問堆棧,并且 PUSH 指令和 POP 指令默認使用 SP。
- 在 ARM 編程領域中,凡是打斷程序順序執行的事件,都被稱為異常(exception)。除了外部中斷外,當有指令執行了“非法操作”,或者訪問被禁的內存區間,因各種錯誤產生的 fault,以及不可屏蔽中斷發生時,都會打斷程序的執行,這些情況統稱為異常。在不嚴格的上下文中,異常與中斷也可以混用。另外,程序代碼也可以主動請求進入異常狀態的(常用于系統用)。
R14:連接寄存器
- 當呼叫一個子程序時,由 R14 存儲返回地址
- R14 是連接寄存器(LR)。在一個匯編程序中,你可以把它寫作 both?LR 和 R14。LR 用于在調用子程序時存儲返回地址。例如,當你在使用 BL(分支并連接,Branch?and?Link)指令時,就自動填充 LR 的值。
- 盡管 PC 的 LSB 總是 0(因為代碼至少是字對齊的),LR 的 LSB 卻是可讀可寫的。這是歷史遺留的產物。在以前,由位 0 來指示 ARM/Thumb 狀態。因為其它有些 ARM 處理器支持ARM 和 Thumb 狀態并存,為了方便匯編程序移植,CM3 需要允許 LSB 可讀可寫
- 不像大多數其它處理器,ARM 為了減少訪問內存的次數(訪問內存的操作往往要 3 個以上指令周期,帶 MMU和 cache 的就更加不確定了),把返回地址直接存儲在寄存器中。這樣足以使很多只有 1 級子程序調用的代碼無需訪問內存(堆棧內存),從而提高了子程序調用的效率。如果多于 1 級,則需要把前一級的 R14 值壓到堆棧里。在 ARM上編程時,應盡量只使用寄存器保存中間結果,迫不得以時才訪問內存。在 RISC 處理器中,為了強調訪內操作越過了處理器的界線,并且帶來了對性能的不利影響,給它取了一個專業的術語:濺出。。
R15:程序計數寄存器,也就是PC指針
- 指向當前的程序地址。如果修改它的值,就能改變程序的執行流。
- 在匯編代碼中你也可以使用名字“PC”來訪問它。因為 CM3 內部使用了指令流水線,讀 PC 時返回的值是當前指令的地址+4。比如說:
- 0x1000: MOV R0, PC ; R0 = 0x1004
- 如果向 PC 中寫數據,就會引起一次程序的分支(但是不更新 LR 寄存器) )。CM3 中的指令至少是半字對齊的,所以 PC 的 LSB 總是讀回 0。然而,在分支時,無論是直接寫 PC 的值還是使用分支指令,都必須保證加載到 PC 的數值是奇數(即 LSB=1),用以表明這是在Thumb 狀態下執行。倘若寫了 0,則視為企圖轉入 ARM 模式,CM3 將產生一個 fault 異常。
特殊功能寄存器
- Cortex‐M3 還在內核水平上搭載了若干特殊功能寄存器,包括程序狀態字。
- 寄存器組(PSRs)。
- 中斷屏蔽寄存器組(PRIMASK,?FAULTMASK,?BASEPRI)。
- 控制寄存器(CONTROL)。
注:
- MSB是Most Significant Bit的縮寫,指最高有效位;
- LSB是least significant bit的縮寫,指最低有效位;
拓展:關于R15,PC指針描述
- 不管是ARM狀態還是Thumb狀態,至少都是半字對齊,ARM狀態是字對齊.
- 區別在于尋址之后,對程序指針 PC,也就是R15的處理,Thumb狀態的尋址之后,PC值尾位自己置1.ARM狀態尾位不動.
- 而Thumb2指令集,也是如此,Thumb2編譯出的函數,地址是半字對齊的,也可能是字對齊,即同時兼容了前ARM內核的狀態,但是,不過是半字對齊還是字對齊,都將PC尾位置1.
- 所以,你一定是讀取了PC的值,如果你直接讀取函數的地址,不可能出現函數在奇數的情況.
總結
以上是生活随笔為你收集整理的Cortex-M3-寄存器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cortex-M3-复位(序列)
- 下一篇: GCC 和 MDK (即 Keil) 手