这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【调试】使用OZONE调试Cortex-M hardfault

共1条 1/1 1 跳转至

【调试】使用OZONE调试Cortex-M hardfault 40

高工
2025-09-19 14:46:42     打赏

【简介】

       在ARM-M 系列芯片中默认的busfault/memory fault /usage fault 不进行配置的话默认都会触发hard fault 异常,从下图可以形象的看出对应的关系。

           image.png

以下代码是可以打开对应的 busfault/memory fault /usage fault  exception 的异常ISR 服务如果这几个异常需要单独处理的场景开启对应的exception  就不会上报成hard fault 异常。

image.png

busfault/memory fault /usage fault  exception 的异常优先级是可以配置的,hardfault  默认开启并且优先级不可以配置。

image.png

           有了上面的铺垫,我们现在进入主题介绍下在Ozone 环境下如何调查hard fault 错误。在使用OZONE 时触发hardfault时会有如下信息输出。

image.png

从call stack 窗口可以看出使用的栈帧 及 pc/lr 信息可以看到异常的触发调用栈信息。

image.png

除了直接使用上述的 call stack 产看到异常调用栈,我们也还可以通过查看寄存器信息来定位异常的触发位置。触发Hard Fault 错误时在cortex M架构时LR 寄存器会被赋值一个特定的数值EXC_RETURN我们可以根据此数值来获取一异常前使用的栈是MSP/PSP。

image.png

image.png

EXC_RETURN 返回数值定义说明如下

image.png

从我们触发异常时候的LR 寄存器值为0XFFFFFFFD 可以知道触发hardfault 时使用的栈为PSP,我们可以通过PSP 的值来确认异常触发时的的寄存器栈帧信息。触发异常时内核会把寄存器栈帧压入到PSP中。对应压栈顺序如下

image.png

根据异常时的PSR 我们可以产看对应的栈信息根据上述的压栈规则从栈中找到异常时的寄存器信息

image.png

我们debug 断点放到触发hard fault 处的代码时可以看出寄存器信息和我们上述根据压栈规则获取的信息也是一致的

image.png


除了上述的寄存器信息外还可以查看SCB 下的异常状态寄存器来确认原因,从异常状态寄存器可以知道本地触发异常原因为非对齐访问触发的hard fault.

image.png

以下时M0~M4 架构下的异常状态寄存器的支持情况

image.png

image.png

HFSR 寄存器的bit 说明如下

image.png

DFSR 寄存器的bit 定义说明如下

image.png

AFSR 寄存器定义说明如下

image.png

以下链接为SEGGER 对hardfault 处理的描述

https://kb.segger.com/Cortex-M_Fault

异常类型说明可以参照此表格

image.png





共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]