1. 程式人生 > >Cortex --暫存器組

Cortex --暫存器組

前言

還是和ARM7做對比進行學習

暫存器的總體區別

由於arm7有七種工作模式,而cortex只有兩種,所以在暫存器方面有很大的區別。

使用者模式 系統模式 管理模式 中止模式 為定義模式 IRQ模式 FIQ模式 cortex
R0 R0 R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 R2 R2
R7 R7 R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8 R8_FIQ R8
…_FIQ
R12 R12 R12 R12 R12 R12 R12_FIQ R12
R13(SP) R13 R13_SVC R13_ABT R13_UND R13_IRQ R13_FIQ R13
R14 (LR) R14 R14_SVC R14_ABT R14_UND R14_IRQ R14_FIQ R14
R15(PC) PC PC PC PC PC PC PC
CPSR CPSR CPSR CPSR CPSR CPSR CPSR xPSR
SPSR_SVC SPSR_ABT SPSR_UND SPSR_IRQ SPSR_FIQ
PRIMASK
FAULTMASK
BASEPRI
CONTROL

在arm7中,R0–R7的通用暫存器所有模式共用,而R8–R12暫存器中,快中斷模式有自己獨立的暫存器,可以快速處理中斷,而其他模式還是共用暫存器。SP和LR中使用者模式和系統模式共用暫存器,其他模式有獨立暫存器,每個異常模式有自己的SPSR用於儲存之前的cpsr,中斷處理後進行返回。

M3就沒有這麼繁瑣的暫存器,它有R0–R15的通用暫存器,也有CPSR,不過換了個名字xPSR。同時新增了用於控制異常的使能和失能暫存器PRIMASK, FAULTMASK 和 BASEPRI。以及用於定義特權級別,還用於選擇當前使用哪個堆疊指標的控制暫存器CONTROL

程式狀態暫存器

在arm7時代的程式狀態暫存器是這樣的。將整個暫存器劃分為4個域,[31-24]是標誌域,用於判斷計算是否溢位進位為0等。[23-16]是狀態域沒有使用,[15-8]是擴充套件域沒有使用,[7-0]是控制域用於控制中斷的模式。

31 30 29 28 27 26-25 24 23 16 15-8 7 6 5 4-0
N Z C V Q unused J unused unused I F T MODE

cortex的程式狀態暫存器xpsr,將整個暫存器分為三個子狀態暫存器(部分位沒有使用):
應用程式 PSR(APSR)—對應cpsr標誌域[31-27],(由8位減到5位)
執行 PSR(EPSR)—對應cpsr沒有使用的狀態域和擴充套件域
中斷號 PSR(IPSR)—對應cpsr的控制域[8-0](增加了1位)

31 30 29 28 27 26-25 24 23 -16 15-10 9 8-0
N Z C V Q ICI/IT T unused ICI/IT 中斷號

在這裡插入圖片描述

APSR

N:表示兩個有符號整數運算時,N==1表示運算結果為負數,N=0表示運算結果為正數或者零。
Z:Z=1表示運算結果為0,Z=0表示運算結果不為0
C:無符號加法運算產生進位,則C=1,無符號減法運算產生溢位,則C=0;
V:有符號加減運算產生溢位,則V=1;
Q:飽和條件碼標誌位

IPSR

在arm7中,是通過一個特定的數來表示某個模式,而cortex中,只有兩個模式,所以當IPSR等於0時候,處於執行緒模式時,在手柄模式下,為當前異常的異常號。

EPSR

用來說明是arm指令還是thumb指令,其實也就是控制域的[5]位
T:Thumb狀態, T=1,ARM狀態,T=0;

通用狀態暫存器

由R0到R12暫存器構成,其中R0到R7是低組暫存器。所有指令都能訪問它們,復位後的初始值是不可預料的。R8-R12 被稱為高組暫存器。這是因為只有很少的 16 位 Thumb 指令能訪問它們, thumb-2 指令則不受限制。復位後的初始值也是不可預料的。

中間結果儲存暫存器R12

R12一般用在子程式連線程式碼中使用,作為子程式的中間結果暫存器

堆疊指標暫存器R13(sp)

在 CM3 中有兩個堆疊指標,當引用 R13(時,引用到的是當前正在使用的那一個,另一個必須用特殊的指令來訪問( MRS,MSR指令)。
主堆疊指標(MSP),或寫作 SP_main。這是預設的堆疊指標,它由 OS 核心、異常服務例程以及所有需要特權訪問的應用程式程式碼來使用。
程序堆疊指標(PSP),或寫作 SP_process。用於常規的應用程式程式碼(不處於異常服用例程中時)。

連線暫存器R14(LR)

當通過BL跳轉到子程式時,R14就被設定成子程式的返回地址,在子程式中把LR的值賦值給pc就可以實現子程式的返回。如 MOV PC,LR 或者 BX LR;

程式計數器R15(PC)

CM3 內部使用了指令流水線,讀 PC 時返回的值是當前指令的地址+4。

異常/中斷遮蔽暫存器組

該暫存器組總共有3個暫存器,只有在特權級下,才允許訪問這 3 個暫存器。
使用MRS/MSR指令訪問這三個暫存器,比如:
MRS R0, BASEPRI ;讀取BASEPRI到R0中
MSR BASEPRI, R0 ;將R0資料寫入到BASEPRI中

PRIMASK暫存器

只有單一位元的暫存器。置為1後,就關掉所有可遮蔽異常,只剩下NMI和硬Fault的異常可以響應。預設值是0,表示沒有關閉中斷。

FAULTMASK暫存器

只有單一位元的暫存器。置為1後,只有NMI異常可以響應。預設值為0,表示沒有關異常。

BASEPRI暫存器

該暫存器最多有9位(由表達優先順序的位數決定)。定義了被遮蔽優先順序的閾值。當它被設定為某個值後,所有優先順序號大於等於此值的中斷都被關。若設定成0,則不關斷任何中斷,0為預設值。

控制暫存器(Control)

CONTROL[1]:
為0表示選擇MSP(主堆疊指標,預設情況),為1表示選擇PSP(程序堆疊指標);
當為Handle模式下不允許向該位寫1,也就是在Handle模式下。改為一直為0;僅當處於特權級的執行緒模式下,此位才可寫,其它場合下禁止寫此位。
CONTROL[0]:
為0表示特權級的執行緒模式,為1表示使用者級的執行緒模式,Handler 模式永遠都是特權級的;