一、单片机 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 说明
|