在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult$ R9 h, F+ D4 g: Q- o; B+ ` 常见的导致单片机进入hardfult有以下原因:3 T3 o6 y% y3 b) d 堆栈溢出、数组越界、野指针、非对齐访问4 v$ e3 C0 F2 U' E 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题/ z' u* x3 `6 k# y* o5 F 定位错误6 c9 i$ Z: c# U8 A 方法一 Show Caller Code- L* a5 x8 U( `! L4 ] 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。- T& z- V- O: v# {9 c; e2 y ! v8 p+ N7 A% N 方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括:3 `/ r% S* O3 l 断言(assert)" [8 g) h. @0 B1 u) y6 K8 q. c5 } 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)6 Z4 L3 z& P Q3 S1 U2 \& K, I5 F 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈' w! C( n' d4 O' p* I$ v % @8 { ^: w( Y: Z+ _8 O4 @. d 适配Cortex-M0/M3/M4/M7 MCU 支持IAR、KEIL、GCC编译器; H$ t0 Z1 o& @9 Y+ e( @ 下面我们以实例过程移植及使用(Keil) 1、下载源码,解压,如下图 3 F: E: i: ]9 [. N& t" E7 u 0 p% D! @% l$ I4 Y! _3 o 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。1 t) ~0 [2 B" e 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件 4 q# s; W0 X) Q6 I 3、添加到工程中,添加头文件、勾选C99模式 # f6 X5 W$ D& Q! q( f5 y 4、这时我们可以编译一下工程,编译后提示比较多错误* t1 `$ H1 }1 y4 z9 f 8 ^9 b3 v& V% p) p' V6 X 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: ! e+ O1 J; M- {" Y& W8 R; Q8 p / K( S1 M1 ^! D 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了) ^$ c: J0 _2 t7 b' {& |' ]* a7 O ( Z/ ^* Y7 q, \4 B- Q/ h" P, q 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽 8、这时我们重新编译,错误消除。 # G0 s. i; ^' z/ @ 我们在main.c文件里编写需要测试的代码,如下:7 G, b) \$ x) l. T" }# |4 O % ?3 W2 S$ `2 T " T: Q/ w2 y& g 9、下载并运行程序: ) N$ U8 ~: I2 i1 B 10、可以看到串口输出的错误信息,我们根据提示运行命令:8 N# w: ^ r0 c! A: g% M# o2 O* j3 k addr2line -e USART_TEST.axf -a -f 0800157e 080015ce - S: }0 @; b. c 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,) w |! ~% R, I+ H# _% G. q0 P # @( i e, z4 H8 \ 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中: 9 U8 E9 o N2 S( H$ x3 G6 I . z8 I/ |- K% }9 f ]* s 12、在该文件夹中,我们按下shift键同时点击鼠标右键2 D" e, `1 T& s6 K E * Z4 ~" Z% ~8 p& ?, V) R4 J 13、在powershell中,输入 start cmd并回车运行/ ]% r" `: p" r( S+ ]2 [, ?% C ( z( E5 S$ a ?. a0 z& x 5 d" O+ a8 N- \/ R" ~+ T$ \ 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行 ' \7 o& k. _6 R m$ ?! s4 \ ) a- D$ h: M( S$ |9 Q2 p* \ 15、可以看到addr2line.exe工具给我们定位出的错误代码行数+ O' p8 T" O* P! Y7 x% m) r" g* {9 { . M7 Z5 f0 S: X2 ^4 C. v- g 、2 a9 V8 x8 Z; R2 g* l 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误9 m7 `; ~& Q; |5 K' k: u& | 8 @- [& Q8 B1 k* z 转载自:创客技术日记 R# p7 t4 t1 k$ s" e3 n+ {& F& F* P 如有侵权请联系删除 |
兔哥的杂谈【002】——如何性价比更高地去编译STM32
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
FreeRTOS学习笔记2
【NUCLEO-H533RE评测】+05 调试PWM
基于STM32在线升级OTA经验分享
【NUCLEO-C0评测】硬件OLED显示
【STM32C0测评】外部中断控制小灯
【STM32C0评测】1、开箱,芯片介绍以及后续的评测计划
基于STM32调试小技巧之不复位调试
基于STM32的不复位调试的经验分享