Registers
1. 通用寄存器R0-R12。
2. R13 - Stack Pointer(SP_main & SP_process)。
(1).Reset之后, 处理器会自动获取Vector中偏移为0下的内容,写入到SP_main中,即初始化SP_main指针,此时为Thread mode并且为Privileged。如果想要切换为SP_process,需要再将SP_process初始 化,使用MSR指令即可。
(2).ARMv7-M的实现中,忽略掉了SP[1:0],也就是处理器自动向下取4-byte对齐使用。ARM建议在软件的使用SP时,也将SP[1:0]清零,以保证良好的可移植性。
3. R14 - Link Register(LR)
在软件使用Bl/BLX等跳转且保存link状态的指令时,处理器自动将当前PC内的值存放到LR中,一般为Bl/BLX下条指令的地址。
4. R15 - Program Counter(PC)
指向下条要执行的指令地址。
5. xPSR - Status Registers(APSR & IPSR & EPSR)
APSR:包含N,Z,C,V,Q,GE[3:0] bit,
N[31]:负的条件标记
Z[30]:零的条件标记
C[29]:操作进位
V[28]:操作溢出
Q[27]:饱和指令饱和标记
GE[19:16]:DSP单元扩展标记
IPSR:包含Exception Number
IPSR[8:0]值为0或者当前Active的异常对应的异常号。虽然Reset异常的异常号为1,但对于软件来说1这个值是不可见的,是一个瞬间的值。
EPSR:
T bit,Thumb状态标记。
ICI/IT bit, 当使用interrupt-continue load/store指令或者IT指令时,用来保存指令状态或者IT状态。
6. Mask Registers(PRIMASK & BASEPRI & FAULTMASK)
PRIMASK:1bit有效,设置此bit为1代表提升运行优先级为0,即屏蔽掉除Reset(-3),NMI(-2),HARDFAULT(-1)之外的任何优先级,因为其他异常的优先级默认为0。
BASEPRI:基本优先级Mask,一个8位寄存器。BASEPRI更改异常抢占所需的优先级。只有当BASEPRI的值低于当前正在执行的软件的未屏蔽优先级时,它才有效
FAULTMASK:Fault mask,1bit有效,设置此bit为1,来提升运行优先级为-1,和HardFault的优先级相同。达到屏蔽HardFault异常的作用。只有特权级下运行并且在优先级在-1之下时才能设置这个bit,这意 味着HardFault和NMI Handler中不能设置此bit。在出去NMI的异常返回时,处理器都会自动清楚此bit。
使用CPS指令来修改Mask Registers。
7. CONTROL - Control Registers
nPRIV: CONTROL.bit[0]定义了Thread mode下的特权等级,是Privileged还是Unprivieged。
0:Thread mode has Privileged access。
1:Thread mode has Unprivileged access。
SPSEL: CONTROL.bit[1]定义了使用哪个栈。
0:使用SP_main作为当前栈。
1:在Thread mode下使用SP_process作为当前栈,Handler mode下此bit保留。
FPCA: CONTROLbit[2]处理器是否包含FP单元。
0:无FP Extension。
1:有FP Extension。
软件可以使用MSR指令设置此CONTROL寄存器,然后使用ISB指令确保在下条指令运行时,当前配置能够应用成功。