ARM Cortex-M3与Cortex-M4 权威指南
本文最后更新于:2025年9月12日 晚上
喵喵喵
4 架构
4.1 操作模式和状态
分清几个概念:操作状态、操作模式、特权等级。
操作状态,分为调试状态和Thumb状态。区别在于正常执行还是调试,注意Cortex-M系列不支持ARM状态,这点与经典的ARM处理器不同
操作模式,分为处理模式和线程模式。这里区别是,前者是在执行中断和异常处理,后者则是执行普通的应用。
处理模式一定处于特权访问级别,线程模式可以处于特权访问级别,也可以处于非特权访问级别。
4.2 寄存器
普通寄存器组
R0-R12是通用目的寄存器,均为32位
R13是栈指针,分为MSP和PSP,分别用于处理模式和线程模式。均为32位,且32位对齐。使用PUSH和POP指令实现栈存储的访问。
R14是链接寄存器,即LR,用于函数调用时保存返回地址。
R15是程序计数器,即PC,可读可写,保存即将执行的下一条指令的地址。写PC的操作会引起跳转行为。
特殊寄存器
特殊寄存器未经过存储器映射,MRS指令和MSR指令可以实现特殊寄存器的读取和写入。
程序状态寄存器PSR,包括应用PSR(APSR)、执行PSR(EPSR)、中断PSR(IPSR)。它们可以通过一个组合寄存器xPSR访问(不同的位范围对应不同的PSR),也可以单独访问。
软件代码(线程模式)无法直接使用MRS读取EPSR。而IPSR是只读的。
不同架构之间,PSR存在差异。关于状态寄存器,在后面4.3中详细分析。
——(我是分割线)——
每个异常都有一个优先级,数值小的优先级更高。
PRIMASK、FAULTMASK、BASEPRI寄存器用于异常或者中断屏蔽。它们基于优先等级屏蔽异常,只有特权访问等级才可以对它们进行操作。
这三个寄存器默认为全0,即屏蔽不起作用。
PRIMASK为1位宽的中断屏蔽寄存器,置位后,会将除了不可屏蔽中断以及HardFault异常之外的异常以及中断全部屏蔽。实质上,这里是把异常优先级提为了0。
FAULTMASK与PRIMASK类似,不过它可以屏蔽HardFault异常。也就是把异常优先级提到-1。
BASEPRI,可以更具优先等级屏蔽异常或中断,占据多个位。会屏蔽相同或者更低优先级的中断。
——(我是分割线)——
CONTROL寄存器
只能在特权级别修改,非特权级别只读。
规定了当前进程的特权级别(nPRIV)以及栈指针的选择(SPSEL)。这构成了四种组合,其中三种是常见的:
对于具有浮点单元的Cortex-M,有FPCA表示当前上下文是否使用浮点单元。
——(我是分割线)——
浮点寄存器
S0-S31,D0-D15
浮点状态和控制寄存器FPSCR
4.3 应用状态寄存器APSR
主要就是那一大堆运算位,这个看书就行了。
注意一下Q位是饱和
4.4 存储器系统
系统特性
32G线性地址空间
存储器映射
从最低地址开始是CODE,之后向上有SRAM等
栈存储
很常规的东西,类似于x86
存储器保护单元MPU
4.5 异常和中断
嵌套向量中断控制器,NVIC