Tianya
发布于 2026-07-14 / 2 阅读
0
0

Cortex-M异常

1. 异常分析流程

  1. LR寄存器,判断使用PSP还是MSP

  2. 获取PSP/MSP

  3. 读取栈指针指向的内存

  4. 分析异常发生时,栈的状态。栈帧中的PC可以获取异常发生的位置

  5. 结合map文件、反编译文件,确定异常发生的原因。

2. 通用寄存器

2.1 LR(链接寄存器)

位段

名称

取值

功能说明

[31:5]

Reserved

恒为 1

固定填充 0x1FFFFFF,用于识别这是异常返回码,不是普通地址

bit4

Mode

0/1

返回目标模式:0:返回 Handler 模式(嵌套异常,极少出现)1:返回 Thread 线程模式(99% HardFault 场景)

bit3(SPSEL)

Stack Select

0/1

异常栈帧所在堆栈(定位崩溃现场最关键):0:栈帧存在 MSP 主堆栈(裸机 / 主线程 / 中断内崩溃)1:栈帧存在 PSP 进程堆栈(RTOS 任务内崩溃)

bit2(FTYPE)

Frame Type

0/1

M7 独有,浮点上下文标识:0:扩展浮点帧,栈中包含 S0~S15、FPSCR(发生故障时 FPU 正在使用)1:基础整数帧,仅压入 R0~R3/R12/LR/PC/xPSR,无浮点寄存器

bit1

Reserved

恒为 0

硬件强制 0,保留位

bit0

Thumb

恒为 1

Cortex-M 仅支持 Thumb2,固定为 1,不可修改

2.2. xPSR(专用程序状态寄存器)

程序状态寄存器(PSR)是一个 32 位寄存器,包含三个子寄存器:

2.2.1. 应用程序状态寄存器 APSR

存储可由应用层软件(即非特权软件)读写的状态标志位。 在全部 Armv7 架构系列中,通过MSRMRS指令对 APSR 中应用层可写标志位的操作规则保持统一。

2.2.2. 中断程序状态寄存器(IPSR)

当处理器正在执行异常服务函数时,该寄存器存放当前正在处理的异常编号;其余情况下,IPSR 的值为 0。

2.2.3. 执行程序状态寄存器(EPSR)

用于存储执行状态位。

软件可通过 MRSMSR 指令访问完整的 PSR 寄存器,或是单独 / 组合访问其中一个或多个子寄存器。xPSR 是程序状态寄存器(PSR)的通用统称。

位段

名称

取值

功能说明

bit31

APSR.N

0/1

负数标志位.结果为负数时 N=1;结果为正数或 0 时 N=0。

bit30

APSR.Z

0/1

零标志位。指令运算结果为 0 时该位置 1,否则置 0;比较指令结果为 0,通常代表两个操作数相等。

bit29

APSR.C

0/1

进位标志位。指令运算产生进位时该位置 1,例如无符号加法发生溢出。

bit28

APSR.V

0/1

若指令运算产生有符号溢出时,该位会置 1,例如加法运算发生有符号数溢出。

bit27

APSR.Q

0/1

SSAT(有符号饱和)或USAT(无符号饱和)指令为将输出限制在有符号 / 无符号数值范围而修改输入值时,该位置 1。 搭载 DSP 扩展指令集的处理器中,部分乘法运算溢出时也会将该位置 1。将 Q 标志置 1 的现象称为饱和运算

[19:16]

APSR.GE[3:0]

大于等于标志(Greater than or Equal flags)SIMD 单指令多数据运算指令会更新这 4 位标志,用于记录运算中每个字节 / 半字通道的比较结果。 软件可借助该组标志控制后续SEL通道选择指令。关于SEL指令的详细说明参见 A7-351 页。未搭载 DSP 扩展指令集的处理器,该 4 个位为硬件保留位。

[15:10]

EPSR.ICI/IT

ICI/IT 位用于保存两类可中断指令的现场状态:

  • 作为 ICI 位使用:记录被中断的多周期批量加载 / 存储指令未完成的寄存器列表信息;

  • 作为 IT 位使用:保存 IT 指令块内条件执行指令序列的上下文,保证中断返回后可从正确位置恢复执行;

bit9

EPSR.T

EPSR 包含 T 位,该位置 1 代表处理器正在执行 Thumb 指令;同时内部复用重叠了 ICI/IT 位域,用于支持可中断续存加载 / 存储指令与 IT 条件执行指令。

[8:0]

IPSR.ExceptionNumber

处理器在进入异常、退出异常时自动写入 IPSR 寄存器。软件可通过MRS指令读取 IPSR,但处理器会忽略MSR指令对 IPSR 的写入操作。IPSR 内的异常编号字段定义如下:

  • 线程模式(Thread mode)下,该字段值为 0;

  • 处理模式(Handler mode)下,该字段存放当前正在执行的异常对应的异常编号。


评论