xPSR
在 ARM Cortex-M3 中,xPSR(组合程序状态寄存器) 是核心的状态控制寄存器,由三个子状态寄存器合并而成,用于记录处理器的运算状态、中断状态和执行环境。以下是其深度解析:
🔍 一、xPSR 结构(32 位)
位域 | 字段 | 功能 |
---|---|---|
31:27 | N/Z/C/V/Q | APSR:运算标志位(负/零/进位/溢出/饱和) |
26:24 | ICI/IT | EPSR:中断连续指令状态(用于条件执行块) |
15:10 | 保留 | 恒为 0 |
9 | T | EPSR:Thumb 状态位(恒为 1 ,若为 0 则触发 UsageFault ) |
8:0 | ISR_NUMBER | IPSR:当前中断/异常号(0=线程模式,1-15=系统异常,16+=外设中断) |
⚠️ 二、关键位详解
1. APSR 标志位(运算状态)
- N(负标志):运算结果为负时置
1
- Z(零标志):运算结果为零时置
1
- C(进位/借位):加法进位或减法无借位时置
1
- V(溢出标志):有符号运算溢出时置
1
- Q(饱和标志):SSAT/USAT 指令触发饱和时置
1
(需手动清除)
2. EPSR 执行状态
- T 位(Bit 9):
- 必须为
1
(Thumb 状态),若被意外清零会触发UsageFault.INVSTATE
(常见于非法跳转)。
- 必须为
- ICI/IT 位(Bits 26:24):
- 用于 IT 指令块(If-Then 条件执行),记录剩余条件指令数及条件码。
- 若异常发生在 IT 块内,硬件自动保存此状态,异常返回后恢复执行。
3. IPSR 中断状态
- 值域
0-255
:0
:线程模式(无异常)1-15
:内核异常(如1=Reset
,2=NMI
,3=HardFault
,4=MemManage
)≥16
:外设中断号(如 IRQ0=16)
- 诊断用途:在异常处理中读取
IPSR
可确认当前异常源(如IPSR=3
表示 HardFault)。
🛠️ 三、xPSR 在异常处理中的作用
1. 异常进入时
- 硬件自动将 xPSR、PC、LR、R0-R3、R12 压入堆栈(8 寄存器帧)。
- xPSR 保存异常发生时的状态(包括 IT 块状态),确保返回后恢复执行环境。
2. 异常返回时
- 从堆栈恢复 xPSR,关键行为:
- T 位恢复为
1
:强制保持 Thumb 状态。 - ICI/IT 位恢复:继续执行被中断的 IT 条件块。
- IPSR 清零:退出异常后恢复线程模式。
- T 位恢复为
3. 手动修改风险
- 禁止直接写 xPSR!
- 修改
T
位会触发UsageFault
; - 错误设置
ICI/IT
会导致条件执行紊乱; - 修改
IPSR
无意义(硬件自动管理)。
- 修改
🔧 四、调试实战:通过 xPSR 诊断错误
场景 1:检测非法指令状态
void trigger_invstate() {asm("mov r0, #0");asm("bx r0"); // 尝试切换到 ARM 状态(T=0)
}
- 结果:触发
UsageFault
,CFSR.INVSTATE=1
- xPSR 表现:异常发生时
xPSR[9]=0
(非法 T 位状态)。
场景 2:中断中断 IT 条件块
void IT_block_example() {asm volatile ("IT EQ\n" // 条件执行块"moveq r0, #1\n"// 此处发生中断);
}
- 行为:中断发生时,硬件保存
ICI/IT
状态到 xPSR,返回后继续执行剩余条件指令。
💎 总结:xPSR 核心要点
- 三位一体:
APSR
管运算,IPSR
管异常,EPSR
管执行环境。
- Thumb 状态锁:
- T=1 是硬性要求,任何破坏行为均触发
UsageFault
。
- T=1 是硬性要求,任何破坏行为均触发
- 异常上下文保存:
- 与
PC
、LR
共同构成异常现场恢复链。
- 与
- 调试关键线索:
IPSR
定位异常类型,ICI/IT
分析被中断代码流,T
位验证指令集状态。
操作口诀:
xPSR 状态勿手调,
T 位恒 1 是铁条;
运算中断双记录,
异常恢复全靠它!