在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult0 f4 _& I; \. p( p. l ! M' x2 `% N8 f2 K; g* W 常见的导致单片机进入hardfult有以下原因:3 d+ N% f x& }- e! \( d; g 堆栈溢出、数组越界、野指针、非对齐访问 % W6 Q2 B+ h. Y6 T: [3 a& M 0 r- d& v# k, r$ u* h 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题8 v; J( i6 D) {# k , E4 p5 m; }6 T/ w" y 定位错误 方法一 Show Caller Code( e7 Q4 X+ }- N0 x! N3 R, n 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。) G4 Y9 M6 V5 Z8 x + ~8 o5 u0 X# {% y% F$ ~ # J1 r6 R1 p; a: R, p0 D3 d 方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert) 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault) 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。* i9 a# Q9 Q4 J - I/ V+ s7 ^$ K3 t) b9 l5 N 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈 9 @9 ^$ J7 f: p6 K$ U# X8 G 适配Cortex-M0/M3/M4/M7 MCU7 S t' F0 a3 k" ~3 i 支持IAR、KEIL、GCC编译器 X4 ~0 W$ K' m, N/ p 下面我们以实例过程移植及使用(Keil)' X6 V E9 F* h 1、下载源码,解压,如下图 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。 . j" _$ `+ g2 q0 Z' g# _ 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件3 C6 l* c9 f4 G& `9 W" x# m6 d 5 O, _4 c5 x6 y5 A& y3 j! D ! Y8 o" G- x9 p% L/ J 3、添加到工程中,添加头文件、勾选C99模式 4、这时我们可以编译一下工程,编译后提示比较多错误. W# u# `4 m+ T ! l3 `1 I3 \- T) T* G# T $ A. K8 A5 _# F. a( [/ |7 F( ~/ x 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了6 [0 x0 ]5 Y- x 7 D, t3 f; Z L$ P n2 [. G/ V0 [8 U5 Y, h# f+ h4 L( L 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽 2 C; O+ F2 t( L 8、这时我们重新编译,错误消除。+ x* z6 j5 l; ~& G% i5 \. D% Z 我们在main.c文件里编写需要测试的代码,如下:! ~- [: K- l; ?4 b& e( n) T# T) Q l& X. A7 p/ A7 N % i0 }; J' D0 O + ?# m' Z, J' U( I, {7 D 9、下载并运行程序:. K5 `" r5 |( X! u9 b; M9 _ 0 o7 ?4 P" A! w' G ) O: j A: W: [4 C3 V% _ 10、可以看到串口输出的错误信息,我们根据提示运行命令:+ S1 s4 T( R) X+ j/ @0 Q addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内, 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:+ R5 p) u9 w/ r u ) T X2 l9 b$ N+ w) d & c( A& v5 K! c8 c! V 12、在该文件夹中,我们按下shift键同时点击鼠标右键 # V& h2 w9 t$ y ]5 R5 i" | 13、在powershell中,输入 start cmd并回车运行; L8 i/ Y7 ]9 X% }. y & N8 x: u" x" k) ~+ q3 | 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行 15、可以看到addr2line.exe工具给我们定位出的错误代码行数" Z. H0 ]' t8 [$ _ 、0 `1 A V/ g; m4 L! Z2 a- D 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 转载自:创客技术日记# B6 l* D7 A- x- e 如有侵权请联系删除 |