【简介】
在开发过程中出现hardfault 错误时很普遍的现象,我们今天介绍下在Ozone 环境下如何调查hard fault 错误。在使用OZONE 时触发hardfault时会有如下信息输出。
从call stack 窗口可以看出使用的栈帧 及 pc/lr 信息可以看到异常的触发调用栈信息。
除了直接使用上述的 call stack 产看到异常调用栈,我们也还可以通过查看寄存器信息来定位异常的触发位置。触发Hard Fault 错误时在cortex M架构时LR 寄存器会被赋值一个特定的数值EXC_RETURN我们可以根据此数值来获取一异常前使用的栈是MSP/PSP。
从我们触发异常时候的LR 寄存器值为0XFFFFFFFD 可以知道触发hardfault 时使用的栈为PSP,我们可以通过PSP 的值来确认异常触发时的的寄存器栈帧信息。触发异常时内核会把寄存器栈帧压入到PSP中。对应压栈顺序如下
根据异常时的PSR 我们可以产看对应的栈信息根据上述的压栈规则从栈中找到异常时的寄存器信息
我们debug 断点放到触发hard fault 处的代码时可以看出寄存器信息和我们上述根据压栈规则获取的信息也是一致的
除了上述的寄存器信息外还可以查看SCB 下的异常状态寄存器来确认原因,从异常状态寄存器可以知道本地触发异常原因为非对齐访问触发的hard fault.
以下时M0~M4 架构下的异常状态寄存器的支持情况
HFSR 寄存器的bit 说明如下
DFSR 寄存器的bit 定义说明如下
AFSR 寄存器定义说明如下
以下链接为SEGGER 对hardfault 处理的描述
https://kb.segger.com/Cortex-M_Fault