软件执行的处理器模式和特权级别
处理器模式有:
- 线程模式:用来执行应用软件。处理器从复位状态出来后进入线程模式。
- 处理模式:用于处理异常。处理器在完成所有异常处理后返回到线程模式。
软件执行的特权级别:
- 无特权:对MSR和MRS指令的访问受限,不能使用CPS指令。
不能访问系统定时器,NVIC或系统控制块
可能限制了对内存或外设的访问
非特权软件在非特权模式执行 - 有特权:该软件可以使用所有的指令并访问所有的资源
特权软件在特权级别执行
在线程模式下,控制寄存器控制软件的执行是特权还是非特权的。在Handler模式,软件执行总是有特权的。
只有特权软件才能写入CONTROL寄存器以更改线程模式下软件执行的特权级别。
非特权软件可以使用SVC指令进行主管调用,将控制权转移给特权软件。
处理器使用一个满减堆栈。这意味着堆栈指针保存着内存中最后一个堆叠顶的地址。
当处理器将一个新项压入堆栈时,它将堆栈指针减1,然后将该项写到新的内存位置。
处理器实现了两个堆栈,主堆栈和进程堆栈,每个堆栈都有一个指针保存在独立的寄存器中。
线程模式下,控制寄存器控制处理器是使用主栈还是进程栈。
在Handler模式下,处理器总是使用主栈。
寄存器
通用寄存器
R0-R12是用于数据操作的通用寄存器。
堆栈寄存器
堆栈寄存器(SP)是寄存器R13。
在线程模式下,控制寄存器的位[1]表示要使用的堆栈指针:
- 0=主堆栈指针。这是复位值
- 1=线程栈指针
在复位时,处理器加载地址为0x0000000的值的MSP。
链接寄存器
链接寄存器(LR)是寄存器R14。它存储子例程、函数调用和异常的返回信息。复位时,处理将LR值设为0xFFFFFFFF。
程序计数器
程序计数器(PC)是寄存器R15,它包含当前程序地址。
在复位时,处理器用复位向量的值加载PC,该值位于0x00000004.
程序状态寄存器
PSR包含:
•应用程序状态寄存器(APSR)•中断程序状态寄存器(IPSR)•执行程序状态寄存器(EPSR)。
这些寄存器是32位PSR中互斥的位域。
位赋值为:
使用寄存器名作为MSR或MRS指令的参数,单独访问这些寄存器或作为任意两个或全部三个寄存器的组合访问这些寄存器。
例如:
- 使用PSR和MRS指令读取所有寄存器
- 使用带有MSR指令的APSR_nzcvq写入APSR N, Z, C, V和Q位。
应用程序状态寄存器APSR
APSR包含来自先前指令执行的条件标志的当前状态,
中断程序状态寄存器
IPSR包含当前中断服务例程(ISR)的异常类型编号。
执行程序状态寄存器
EPSR包含Thumb状态位以及执行状态位:
- If-Then(IT)指令
- 可中断-可持续指令(ICI)自动,用于中断的加载多条或存储多条指令。
使用MSR指令直接通过应用软件读取EPSR的尝试总是返回零。在应用软件中使用MSR指令写入EPSR的尝试将被忽略。
Interruptible-continuable instructions
当在执行LDM、STM、PUSH或POP指令期间发生中断时,当FPU执行VLDM、VSTM、VPUSH或VPOP指令时,处理器:
- 暂时停止加载多条指令或存储多条指令操作
- 将多重操作中的下一个寄存器操作数存储到EPSR位[15:12]
处理完中断后,处理器:
- 返回位指向的寄存器[15:12]
- 恢复多重加载或存储指令的执行
当EPSR保持ICI执行状态时,位[26:25,11:10]为零。
If-Then块
If-Then块在一条IT指令之后最多包含4条指令。
块中的每条指令都是有条件的,指令的条件要么是相同的,要么是相反的。
Thumb状态
Cortex-M4处理器只支持在Thumb状态下执行指令。以下命令可以将T位清除为0:
- 指令BLX、BX和POP{PC}
- 在异常返回时从堆叠的xPSR值恢复
- 异常进入或复位时的向量值[0]位
试图在T位为0时执行指令会导致错误或锁定。
异常掩码寄存器
异常掩码寄存器禁用处理器对异常的处理。禁用可能影响定时任务的异常。
要访问异常掩码寄存器,使用MSR和MRS指令,或CPS指令来改变PRIMASK或FAULTMASK的值。
优先级掩码寄存器
PRIMASK寄存器防止激活所有具有可配置优先级的异常。
故障掩码寄存器
FAULTMASK寄存器防止激活除NMI(Non-Maskable Interrupt)之外的所有异常。
基本优先掩码寄存器
BASEPRI寄存器定义异常处理的最小优先级。
当BASEPRI设置为非零值时,它会阻止与BASEPRI值相同或更低优先级的所有异常。
控制寄存器
当处理器处于线程模式时,CONTROL寄存器控制所使用的堆栈和软件执行的特权级别,如果实现,则指示FPU状态是否处于活动状态。
- FPCA:当实现浮点时,该位表示上下文浮点当前是否激活:0=不激活浮点上下文;1=激活浮点上下文。Cortex-M4使用这个位来决定在处理异常时是否保留浮点状态。
- SPEL:定义当前活动堆栈指针:在Handler模式下,该位读取为零并忽略写入。Cortex-M4在异常返回时自动更新此位:0——MSP是当前堆栈指针;1——PSP是当前堆栈指针。
- nPRI:定义线程模式特权级别:0——特权;1——非特权。
处理程序模式下总是使用MSP,因此处理器在处理程序模式下忽略对CONTROL寄存器的活动堆栈指针位的显示写入。
在操作系统环境中,ARM建议以线程模式运行的线程使用进程堆栈,而内核和异常处理程序使用主堆栈。
缺省情况下,线程模式使用MSP。要将线程模式中使用的堆栈指针切换为PSP,可以:
- 使用MSR指令将激活堆栈指针设置为1.
- 使用适当的EXC_RETURN值执行异常返回到线程模式。
异常和中断
Cortex-M4处理器支持中断和系统异常。
处理器和NVIC优先处理所有异常。
异常会改变软件控制的正常流程。处理器使用Handler模式处理除复位之外的所有异常。
NVIC寄存器控制中断处理。
数据类型
处理器,支持以下数据类型:
- 32位字
- 16位半字
- 8位字节
以小端或大端方式管理所有数据内存访问。
指令存储器和专用外设总线(PPB)访问总是以小端方式进行。
Cortex微控制器软件接口标准
对于Cortex-M4微控制器系统,Cortex微控制器软件接口标准(CMSIS)定义:
- 常用的方式:访问外设寄存器;定义异常向量
- 起名:核心外设的寄存器;核心异常向量
- 用于RTOS内核的与设备无关的接口,包括调试通道
CMSIS包括Cortex-M4处理器核心外设的地址定义和数据结构。
通过支持模板代码的重用和来自各种中间件供应商的符合CMSIS的软件组件的组合,CMSIS简化了软件开发。
软件供应商可以扩展CMSIS以包含他们的外设定义和这些外设的访问功能。