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就没区别了.