Cortex-M4 的核心寄存器

以下寄存器的地址从低到高排列:

 

R0 ~ R12(均为32bits)

通用寄存器,其中R0~R7为低地址通用寄存器,R8~R12为高地址通用寄存器;

 

SP(R13)(32bits)

栈指针寄存器(Stack Pointer),实际上存在两个R13寄存器,分为主栈指针MSP(Main Stack Pointer)寄存器过程栈指针PSP(Process Stack Pointer)寄存器。任意时刻下CPU只能使用一个SP,当CPU处于线程模式(Thread Mode)时,运行非特权级程序(Unprivileged Software)只能使用PSP访问过程栈(Process Stack)(PS通常不止一个),而运行特权级程序(Privilege Software)可以使用MSP访问主栈(Main Stack)(通常只有一个);当CPU处于处理模式(Handler Mode)时,运行异常(Exception)服务程序,默认使用MSP访问MS。

 

> 异常(Exception)包括了硬件故障(Fault)和内外/软硬中断(Interrupt)。

 

LR(R14)(32bits)

连接寄存器(Link Register),用于存储函数调用或异常处理程序返回的数据。

 

PC(Program Counter)(R15)(32bits)

程序计数器,指向指令的指针,Reset后CPU将复位向量(Reset Vector)(位于地址0x00000004)的值存入PC并将最低位的值赋给EPSR寄存器的T位(可见,若设置不当,有可能导致CPU进入ARM State)。

 

PSR(Program Status Register)(共26有效bits,分布在一个完整字中)

程序状态寄存器,在一个字(Word = 32bits)内同时存放(不共享bits)了3个PSR,分别为:APSR、IPSR和EPSR。

APSR(Application Program Status Register),占用位[31:27]+[19:16],共8bits,记录了一系列与当前指令的操作结果相关的标志Flag(如:小于或负标志位N[31],零标志位Z[30],大于等于标志位GE[19:16]等);

IPSR(Interrupt Program Status Register), 占用位[8:0],共9bits,记录了当前发生的异常的类型编号,最多可表达2047个异常类型,但目前实际只有84种。

EPSR(Execution Program Status Register),占用位[26:24]+[15:10],共9bits,记录了CPU的Thumb State状态(若T[24]位为1,则CPU处于Thumb State),以及If-Then指令块中各个条件的判断结果,或可中断指令(Interruptible-Continuable Instruction, ICI)的下一个寄存器操作数(Register Operand)

 

> ICI指令通常为寄存器数据块读写指令(如LDM STM、VLDM、VSTM、VPUSH、PUSH、VPOP、POP等),需要多个指令周期来完成,若被异常中断则可将下一个要读/写的寄存器编号暂存于IPSR的ICI/IT位域内,作为ICI的现场保护机制。

 

Exception Mask Registers为异常屏蔽寄存器,共有3个,下段顺序列出,各占用一个完整的字(32bits),为用户提供屏蔽非致命的不重要的异常的功能,从而满足某些具有高实时性要求的应用:

 

PRIOMASK(Priority Mask Register)

优先级屏蔽寄存器,有效位为PRIMASK[0],该位置1时,除不可屏蔽中断(Non-Maskable Interrupt, NMI)以外的所有可以配置优先级的异常(通常为中断)都将被屏蔽(CPU不响应)。

 

FALUTMASK(Fault Mask Register)

故障屏蔽寄存器,有效位为FAULTMASK[0],该位置1时,除不可屏蔽中断(Non-Maskable Interrupt, NMI)以外的所有异常(包括故障异常)都将被屏蔽。

 

> 当CPU退出处理模式(Handler Mode)(可能是由任意类型的异常触发的)时,CPU将自动将FAULTMASK为清0,从新使能其对故障异常的响应。

 

BASEPRIO(Base Priority Mask Register)

基优先级屏蔽寄存器,有效位为BASEPRI[7:4],共4bits,记录了某个异常优先级(对优先级的表达与NVIC_IPRx寄存器中用到的表达相同),所有优先级低于或等于该优先级的异常将被屏蔽。

 

CONTROL(Control Register)

控制寄存器,有效位为[2:0],共3bits,分别控制了CPU所使用的栈(PS或MS)、当前程序的特权级别(有特权或无特权),以及浮点单元(Floating-Point Unit, FPU)的状态。

 

> 当CPU处于Thread Mode时可运行特权级程序(Privileged Software)非特权级程序(Unprivileged Software),而在Handler Mode下只运行特权级程序

 

> 非特权级程序访问核心寄存器的指令(MRS、MSR、CPS)受到一定的限制,访问内存和外设也受限,且无法访问系统计时器(System Timer)NVIC(Nested Vector Interrupt Controller)以及系统控制块(System Control Block)等硬件资源,不过可以通过SVC指令调用特权级程序;而特权级程序可使用所有指令,并访问所有的硬件资源。

 

> 特权级用户程序可通过将EPSR寄存器的T位设置为1来将CPU设置为Thumb State。若该位为0,则CPU工作在ARM State,此时若接收到Thumb指令,CPU将陷入自锁态(Lockup),只能通过Reset Exception来解除。

 

> Cortex-M4处理器采用ARMv7-M架构,仅支持Thumb-2指令集(从Cortex-M3系列开始,就勇敢地抛弃了ARM指令集),因此CPU只能工作在Thumb State下,在异常处理程序中亦如此。

 

> Thumb-2指令集是一套完善的精简指令集,同时存在16bits指令和32bits指令,完全兼容Thumb指令集,并具有丰富的拓展子集。这使得Thumb-2兼顾了Thumb指令集高存储密度、低功耗的优点和ARM指令集功能完善、高效的优点,是时下较为流行的指令集之一。它免除了繁杂的CPU状态切换操作,CPU得以完全工作在Thumb State之下。

 

Cortex-M4 的核心寄存器

【官方建议】

RTOS中的线程(或称“任务”)最好运行在Cortex-M4的Thread Mode下,这也是CPU在执行复位程序后默认返回的模式,此时CPU根据PSP寄存器来访问PS;而OS的内核(Kernel)异常处理程序(Exception Handler)则最好运行在CPU的Handler Mode下,可直接访问所有硬件资源,此时CPU根据MSP访问MS。

 

> OS内的每一个任务(线程)都有一个自己专属的过程栈,这些过程栈的指针都存放在对应任务的任务控制块(Task Control Block, TCB)的Task_SP成员上。当某个任务被调度(从就绪态转变为运行态)时,CPU将其TCB内Task_SP成员的值赋给CPU的核心寄存器SP(R13)的PSP,从而实现任务上下文切换(或现场恢复)。

 

【关于CMSIS】

Cortex微控制器应用程序接口标准(Cortex Micro-controller Software Interface Standard),定义(规范化、统一化)了Cortex系列CPU核心外设核心寄存器的标准称谓及其访问“方法”(既函数),以及“异常”向量的标准称谓。从而向开发者提供了屏蔽了寄存器地址级硬件信息RTOS内核开发接口核心外设功能开发接口