1. 异常分析流程
LR寄存器,判断使用PSP还是MSP
获取PSP/MSP
读取栈指针指向的内存
分析异常发生时,栈的状态。栈帧中的PC可以获取异常发生的位置
结合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 架构系列中,通过MSR、MRS指令对 APSR 中应用层可写标志位的操作规则保持统一。
2.2.2. 中断程序状态寄存器(IPSR)
当处理器正在执行异常服务函数时,该寄存器存放当前正在处理的异常编号;其余情况下,IPSR 的值为 0。
2.2.3. 执行程序状态寄存器(EPSR)
用于存储执行状态位。
软件可通过 MRS、MSR 指令访问完整的 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 位用于保存两类可中断指令的现场状态: |
bit9 | EPSR.T | | EPSR 包含 T 位,该位置 1 代表处理器正在执行 Thumb 指令;同时内部复用重叠了 ICI/IT 位域,用于支持可中断续存加载 / 存储指令与 IT 条件执行指令。 |
[8:0] | IPSR.ExceptionNumber | | 处理器在进入异常、退出异常时自动写入 IPSR 寄存器。软件可通过MRS指令读取 IPSR,但处理器会忽略MSR指令对 IPSR 的写入操作。IPSR 内的异常编号字段定义如下: |