
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult8 J5 R3 O% B3 s/ |$ K% L 常见的导致单片机进入hardfult有以下原因: 堆栈溢出、数组越界、野指针、非对齐访问( I n5 d4 Q) l# e8 X9 q8 w: \1 V 5 V# x. \" E9 C$ K+ n 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题9 U' j- s5 G% {1 U " k8 F( o. }# P: T. W1 | 定位错误 方法一 Show Caller Code: J; l5 s& Z* G/ B% |1 N/ m 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。 # @) r! h" d% \2 }7 \2 c* ]& U ![]() ! P1 n! X/ f' _ 方法二 开源库CmBacktrace4 y4 d; u* e2 Y: z: q CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:9 ~( v3 F4 D2 T, A5 M P) G5 b4 D ; t# v* T6 Z$ F ^/ z7 U2 h7 O 支持的错误包括: 断言(assert) 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)9 P5 t0 G5 U, n# B% Y 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 ! e5 i9 S/ g, z 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈8 x/ n1 m7 E: F* C6 ~ 适配Cortex-M0/M3/M4/M7 MCU 支持IAR、KEIL、GCC编译器 / C5 C& s! r+ y7 m6 ]- ~* n# a7 k 下面我们以实例过程移植及使用(Keil) 1、下载源码,解压,如下图1 E" w7 @) O2 }; @% r & W+ X0 w3 T0 B6 | ![]() , j1 }3 ?' R F! Q: M8 d 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。* {4 m2 W' t E( t( Y7 p& r 3 c0 U1 {* ~9 S. W y5 z y 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件0 S: M$ X; u1 W' h 1 H, q5 ~+ F4 ] y0 u3 p ![]() 6 P! Z$ B$ ]! I& b 3、添加到工程中,添加头文件、勾选C99模式1 z3 z# N" D- d6 F {; J9 } ![]() ![]() . x4 l G# R& \( L4 h- V9 t 4、这时我们可以编译一下工程,编译后提示比较多错误* c: [# U3 M/ k H; @* D ![]() & l/ ^0 }2 \. w" s 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:! z! W; v, p! b0 m ![]() 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了 ![]() 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽 ![]() B, C0 l! e5 v+ H- O& ] 8、这时我们重新编译,错误消除。5 ^' r- ~+ _* z& O! [2 v% q 我们在main.c文件里编写需要测试的代码,如下: / }% T! l6 {/ X) @+ g ![]() - y+ P" S" Z; S/ a# e \. I 8 {" O# k' K2 a 9、下载并运行程序: / o" X! x# o- D, ~) V. o) \* _ ![]() " B7 M+ X1 `) ~) P) W+ F 10、可以看到串口输出的错误信息,我们根据提示运行命令:9 H9 k" h6 Q4 B+ S2 `* ] addr2line -e USART_TEST.axf -a -f 0800157e 080015ce : ]1 ? ^" p: T" X 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内, ![]() 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中: 6 V3 @; Q6 ~- z ![]() 12、在该文件夹中,我们按下shift键同时点击鼠标右键* G b- `1 m! h9 G ![]() 13、在powershell中,输入 start cmd并回车运行 ![]() " ]! V: a4 X. Q" y 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行 2 B6 a: i3 l6 ` ![]() 1 H6 }' b. D7 L7 g4 L/ K 15、可以看到addr2line.exe工具给我们定位出的错误代码行数 + H8 ?" O9 k! {, G7 g ![]() 、% w8 j( _. }( @. d4 s% T& D* _ 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 5 T, U4 h/ S% P! Q; U 转载自:创客技术日记 如有侵权请联系删除+ @4 p& c- B, P. S2 ?0 c0 \/ @% V * P" u( r- _2 e' ~% a( x& U- v" m |
兔哥的杂谈【002】——如何性价比更高地去编译STM32
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
FreeRTOS学习笔记2
【NUCLEO-H533RE评测】+05 调试PWM
基于STM32在线升级OTA经验分享
【NUCLEO-C0评测】硬件OLED显示
【STM32C0测评】外部中断控制小灯
【STM32C0评测】1、开箱,芯片介绍以及后续的评测计划
基于STM32调试小技巧之不复位调试
基于STM32的不复位调试的经验分享