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

6.存储器系统

6.


ARM Cortex-M3与Cortex-M4 权威指南
http://example.com/2025/07/28/Blog/IIE/Basic/ARM生态调研/ARM Cortex-M3与Cortex-M4 权威指南/
作者
Jmp.Cliff
发布于
2025年7月28日
许可协议