打印
[文档下载]

单片机Hard fault 产生原因和错误跟踪的方法

[复制链接]
1477|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
saservice|  楼主 | 2024-7-19 08:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、单片机 Hard fault产生的原因

Hard fault产生的原因有两方面,硬件方面和软件方面。

①硬件方面常见原因:

电源设计有错误,造成器件供电不稳;

电源质量不好,纹波,噪声过大;

器件接地不良;

对于带有 Vcap 引脚的器件,管脚处理不当;

电路中有强干扰源,对器件造成干扰;

②软件方面常见原因:

使用了空指针;

对地址偏移量的计算有误;

数组越界导致程序出错;

动态内存使用不当,导致访问了已释放的内存地址;

通过地址访问了已失效的局部变量;

一般因为硬件造成 Hard Fault 错误的可能性较低,大多数都是软件原因造成的。所以遇到硬件中断错误,基本就是通过软件来排查。

二、CmBacktrace软件包

CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:

①支持的错误包括:断言(assert) 故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)

②故障原因自动诊断 :可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;

③输出错误现场的 函数调用栈(需配合 addr2line 工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、精准。也可以在正常状态下使用该库,获取当前的函数调用栈;

④支持裸机及以下操作系统平台:RT-Thread UCOS FreeRTOS(需修改源码)

⑤根据错误现场状态,输出对应的 线程栈 或 C 主栈;

⑥故障诊断信息支持多国语言(目前:简体中文、英文);

⑦适配 Cortex-M0/M3/M4/M7 MCU;

⑧支持 IAR、KEIL、GCC 编译器;

如何移植

准备工作

①查看 \demos 目录下有没有合适自己的 Demo ,如有类似,则建议在其基础上修改 ;

②明确操作系统/裸机平台及 CPU 平台 ;

③将 \src 下的全部源文件添加至产品工程中,并保证源码目录被添加至头文件路径 ;

④cmb_fault.s 汇编文件(点击查看)可以选择性添加至工程,添加后需要把项目原有的 HardFault_Handler 注释掉

⑤把 cm_backtrace_init 函数放在项目初始化地方执行

⑥将 cm_backtrace_assert 放在项目的断言函数中执行,具体使用方法参照下面的 API 说明


使用特权

评论回复
沙发
Carina卡| | 2024-10-23 17:18 | 只看该作者
单片机中的Hard Fault是一种严重的错误状态,通常表示系统遇到了无法处理的异常情况

使用特权

评论回复
板凳
Alina艾| | 2024-10-23 18:23 | 只看该作者
Hard Fault 产生原因可能是堆栈溢出导致的,堆栈空间不足,导致堆栈溢出。解决方法:增加堆栈大小,优化代码以减少堆栈使用。

使用特权

评论回复
地板
Belle1257| | 2024-10-23 19:29 | 只看该作者
尝试访问未分配的内存区域或写入只读内存。解决方法:检查代码中的指针操作,确保所有内存访问都是合法的

使用特权

评论回复
5
Emily999| | 2024-10-23 20:35 | 只看该作者
在代码中执行了除以零的操作。解决方法:在除法操作前检查除数是否为零

使用特权

评论回复
6
Betty1299| | 2024-10-23 21:37 | 只看该作者
断优先级配置不当,导致中断嵌套或抢占问题。解决方法:检查中断优先级配置,确保合理的中断优先级设置

使用特权

评论回复
7
Candic12e| | 2024-10-23 22:42 | 只看该作者
硬件故障,如电源问题、时钟问题等。解决方法:检查硬件电路,确保电源和时钟信号正常

使用特权

评论回复
8
Charlene沙| | 2024-10-24 08:30 | 只看该作者
使用未初始化的指针进行内存访问。解决方法:确保所有指针在使用前都已正确初始化

使用特权

评论回复
9
Annie556| | 2024-10-24 09:41 | 只看该作者
使用调试器当Hard Fault发生时,调试器会自动停在错误发生的位置。检查调用堆栈(Call Stack)和寄存器状态,分析错误原因

使用特权

评论回复
10
B1lanche| | 2024-10-24 10:05 | 只看该作者
在代码中实现Hard Fault中断处理程序(HardFault_Handler)。在处理程序中读取和记录关器(如PC、LR、SP等)的值。分析记录的寄存器值,确定错误发生的位置和原因

使用特权

评论回复
11
Estelle1999| | 2024-10-24 12:16 | 只看该作者
使用调试器加载调试信息,分析错误发生时的程序状态。检查变量值、内存内容等,找出错误的根源。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

1303

帖子

2

粉丝