还是和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 | 中断号 |
N:表示两个有符号整数运算时,N==1表示运算结果为负数,N=0表示运算结果为正数或者零。
Z:Z=1表示运算结果为0,Z=0表示运算结果不为0
C:无符号加法运算产生进位,则C=1,无符号减法运算产生溢出,则C=0;
V:有符号加减运算产生溢出,则V=1;
Q:饱和条件码标志位
在arm7中,是通过一个特定的数来表示某个模式,而cortex中,只有两个模式,所以当IPSR等于0时候,处于线程模式时,在手柄模式下,为当前异常的异常号。
用来说明是arm指令还是thumb指令,其实也就是控制域的[5]位
T:Thumb状态, T=1,ARM状态,T=0;
由R0到R12寄存器构成,其中R0到R7是低组寄存器。所有指令都能访问它们,复位后的初始值是不可预料的。R8-R12 被称为高组寄存器。这是因为只有很少的 16 位 Thumb 指令能访问它们, thumb-2 指令则不受限制。复位后的初始值也是不可预料的。
R12一般用在子程序连接代码中使用,作为子程序的中间结果寄存器
在 CM3 中有两个堆栈指针,当引用 R13(时,引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问( MRS,MSR指令)。
主堆栈指针(MSP),或写作 SP_main。这是缺省的堆栈指针,它由 OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
进程堆栈指针(PSP),或写作 SP_process。用于常规的应用程序代码(不处于异常服用例程中时)。
当通过BL跳转到子程序时,R14就被设置成子程序的返回地址,在子程序中把LR的值赋值给pc就可以实现子程序的返回。如 MOV PC,LR 或者 BX LR;
CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。
该寄存器组总共有3个寄存器,只有在特权级下,才允许访问这 3 个寄存器。
使用MRS/MSR指令访问这三个寄存器,比如:
MRS R0, BASEPRI ;读取BASEPRI到R0中
MSR BASEPRI, R0 ;将R0数据写入到BASEPRI中
只有单一比特的寄存器。置为1后,就关掉所有可屏蔽异常,只剩下NMI和硬Fault的异常可以响应。默认值是0,表示没有关闭中断。
只有单一比特的寄存器。置为1后,只有NMI异常可以响应。默认值为0,表示没有关异常。
该寄存器最多有9位(由表达优先级的位数决定)。定义了被屏蔽优先级的阈值。当它被设置为某个值后,所有优先级号大于等于此值的中断都被关。若设置成0,则不关断任何中断,0为默认值。
CONTROL[1]:
为0表示选择MSP(主堆栈指针,默认情况),为1表示选择PSP(进程堆栈指针);
当为Handle模式下不允许向该位写1,也就是在Handle模式下。改为一直为0;仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。
CONTROL[0]:
为0表示特权级的线程模式,为1表示用户级的线程模式,Handler 模式永远都是特权级的;