在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult% G7 F% A4 d1 h* H- x 常见的导致单片机进入hardfult有以下原因:) ^: K) ]( v' t4 r, R0 m 堆栈溢出、数组越界、野指针、非对齐访问 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题 0 R7 a/ D- B1 Q; ]: g% b 定位错误 方法一 Show Caller Code3 P2 `3 G; F5 l: ]$ r& r 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。 0 l5 C( a( F: ~0 m ' g' q: k- K3 [# N% y5 h 方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert) 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault) 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈4 E* {4 u$ h$ A9 a. j1 k$ ^ 适配Cortex-M0/M3/M4/M7 MCU0 h4 p! k8 w( S, ?2 x 支持IAR、KEIL、GCC编译器 ; L9 h( ~/ m3 A1 i- H1 p$ T6 Z6 _ 下面我们以实例过程移植及使用(Keil) 1、下载源码,解压,如下图" C) w( q8 j3 R/ q% R + n* H; o5 T- M+ r# h# f! v# @& F1 g 8 Y- A; Y! H$ c2 a! ?2 ?+ Y 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。' i5 {9 e9 ]# | , M& E$ C/ Y5 V! L. z 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件 3、添加到工程中,添加头文件、勾选C99模式 ! o+ C" T; G* M4 \2 \8 {1 _ & u" S/ Q+ x0 S9 w: S8 l 9 \; j, ?' Z% n 4、这时我们可以编译一下工程,编译后提示比较多错误' c5 Z: s9 z( \: D% t 6 y& R2 h( {7 d2 w( {2 e8 e$ U 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: 2 C/ ]$ y. k' z % B, E5 n+ E, G6 p9 L V1 N 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了4 o$ q! n. X% m' X 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽 8、这时我们重新编译,错误消除。 4 m0 y2 w; E# O J! j3 {' s 我们在main.c文件里编写需要测试的代码,如下:2 e( P) e c7 {( A- E7 I$ Y 1 B5 r- q) r5 M3 H- ^& h7 r 9、下载并运行程序:% k. w" X& k& _ ( z& ~! ]) v7 s4 r* Y & i8 \% e- f# x4 Z( a9 _$ n2 M 10、可以看到串口输出的错误信息,我们根据提示运行命令: addr2line -e USART_TEST.axf -a -f 0800157e 080015ce# m( ?4 Y5 C5 p- ~/ ~2 D 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内, 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中: # K' J; S( g! k: A9 n" E+ ~ 12、在该文件夹中,我们按下shift键同时点击鼠标右键; E! X0 Q3 l7 P ' A# y% N, B# p) B2 {( X- ~ 13、在powershell中,输入 start cmd并回车运行 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行 8 U S4 T. ~( Q" v' ]9 X" ]8 \ 15、可以看到addr2line.exe工具给我们定位出的错误代码行数( f6 H- A& R- Y% Z4 r/ ~# k ! q6 h: n z0 Q2 N1 t; ]0 O 、 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误2 Z0 q1 R P6 o* m; d1 a! A 转载自:创客技术日记- i5 R* K6 J9 N% K( [ 如有侵权请联系删除9 U! Y- W, m+ x$ C( o' E: R |