VSC HardFault 调试

VSC的调试HardFault和普通寄存器没区别,所以挨个看.

SCB->HFSR; // HardFault Status Register
SCB->CFSR; // Configurable Fault Status Register - 由[UFSR:BFSR:MMFSR]组成
SCB->MMFAR; // MemManage Fault Address Register
SCB->BFAR; // MemManage Fault Address Register
SCB->AFSR; // Auxiliary Fault Stauts Register - 部分内核没有
SCB->DFSR; // Debug Fault Status Register - 部分内核没有

一般来说,堆栈是可以直接看到的,所以也不需要提取r0~r3,r12,lr,pc,psr寄存器.

字段意思:

// HFSR: Hard Fault Status Register (0xE000ED2C ,SCB->HFSR)
[31] DEBUGEVT		- 如果为1,则表示发生了一个调试事件.
[30] FORCED		- 如果为1,则表示该Hard Fault 是由MemManage Fault、Bus Fault 或Usage Fault 引起的.
[1] VECTTBL		- 如果为1,则表示取中断向量时出错.

// UFSR: Usage Fault Status Register (Upper half-word in SCB->CFSR)
[25] DIVBYZERO	- 如果为1,则表示企图执行除 0 操作.
[24] UNALIGNED	- 如果为1,则表示企图执行非对齐访问.
[19] NOCP	- 如果为1,则表示企图执行不受支持的协处理器指令.
[18] INVPC	- 如果为1,则表示将非法或无效的EXC_RETURN值加载到PC.
[17] INVSTATE	- 如果为1,则表示试图切换到 ARM 状态.
[16] UNDEFINSTR	- 如果为1,则表示企图执行未定义指令. 

// BFSR: Bus Fault Status Register (2nd byte in SCB->CFSR)
[15] BFARVALID		- 如果为1,则表示BFAR寄存器存储的BusFault 寻址值有效.
[13] LSPERR		- 如果为1,则表示惰性保存浮点状态时发生错误.
[12] STKERR		- 如果为1,则表示入栈时发生错误.
[11] UNSTKERR		- 如果为1,则表示出栈时发生错误.
[10] IMPRECISERR	- 如果为1,则表示不精确的数据总线错误.
[9] PRECISERR		- 如果为1,则表示精确的数据总线错误.
[8] IBUSERR		- 如果为1,则表示指令提取错误. 

// MMFSR: MemManage Fault Status Register (lowest byte in SCB->CFSR)
[7] MMARVALID	- 如果为1,则表示MMFAR寄存器存储的MemManageFault寻址值有效.
[5] MLSPERR	- 如果为1,则表示惰性保存浮点状态时发生错误.
[4] MSTKERR	- 如果为1,则表示在中断或异常入栈时企图访问不被允许的区域.
[3] MUNSTKERR	- 如果为1,则表示在中断或异常出栈时企图访问不被允许的区域.
[1] DACCVIOL	- 如果为1,则表示企图从不允许访问的区域读、写数据.
[0] IACCVIOL	- 如果为1,则表示企图从不允许访问的区域取指令. 

// MMFAR: MemManage Fault Address Register (0xE000ED34, SCB->MMFAR)
[31:0] ADDRESS	- 当MMARVALID 的值为1时,MMFAR 记录在访问哪个地址时发生了MemManage Fault. 

// BFAR: Bus Fault Address Register (0xE000ED38, SCB->BFAR)
[31:0] ADDRESS	- 当BFARVALID的值为1时,BFAR 记录在访问哪个地址时发生了Bus Fault. 

// AFSR: Auxiliary Fault Status Register (0xE000ED3C, SCB->AFSR)
[31:0] Implementation Defined	- 允许芯片设计人员添加自己的故障状态信息.

// DFSR: Debug Fault Status Register (0xE000ED30 ,SCB->DFSR)
[4] EXTERNAL		- 如果为1,则表示因外部调试请求触发了调试事件.
[3] VCATCH		- 如果为1,则表示因发生向量捕获触发了调试事件.
[2] DWTTRAP		- 如果为1,则表示因数据监测点匹配触发了调试事件.
[1] BKPT		- 如果为1,则表示因执行BKPT 指令触发了调试事件.
[0] HALTED		- 如果为1,则表示调试器请求处理器进入暂停模式.

只有HFSR->FORCED有效,才属于我们真正的FAULT,其他FAULT不常见,之后实际分析CFSR.

希望有人做一个插件直接提取这些寄存器看多好,获取信息后调试方法和正常的Fault就没区别了.

发表评论

您的电子邮箱地址不会被公开。