在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult 0 n1 M) [$ |$ S- @ o 常见的导致单片机进入hardfult有以下原因: 堆栈溢出、数组越界、野指针、非对齐访问. P. G: g$ Z! k- p Y+ B9 D7 F% Y % i& D- Z1 y H- ? d 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题 定位错误 方法一 Show Caller Code 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。 方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert)* o/ _9 Z: Y8 l 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault) n8 L: v1 }; | 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈5 @5 B2 a7 g5 k/ h. @0 y( V 适配Cortex-M0/M3/M4/M7 MCU 支持IAR、KEIL、GCC编译器 ; A8 T3 S: Z- ^$ e( P. i9 q& p% m 下面我们以实例过程移植及使用(Keil) 1、下载源码,解压,如下图 # v& L3 e9 A# d g* n 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。$ L2 U2 o. ?) I* Z1 `5 l 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件 6 I, R9 o+ K0 o7 \- l# ]2 i 3、添加到工程中,添加头文件、勾选C99模式; b. ^1 X: u3 n) y! M 2 ?6 F* ^3 |) h1 g" C+ } # a& _& \# t/ e9 b 0 ~& U+ i9 c6 k 4、这时我们可以编译一下工程,编译后提示比较多错误 + o i1 ~4 l" D5 E: L 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:4 q$ t) ]( B7 Q : Q1 `( Z2 b6 v( G o 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了& |! N0 C2 y$ C, }2 v2 u4 @ 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽3 G- w, d+ X7 B* Q 6 u, n% ~4 \% w# N; X+ ?- c 8、这时我们重新编译,错误消除。 Z% x: C' Y* U 我们在main.c文件里编写需要测试的代码,如下: ( Z* l3 I( e6 {3 f" b4 m % O1 a' p2 l8 `9 k8 C$ P+ r( ^$ y" ^ 9、下载并运行程序: 2 `' P8 V. H" e+ _7 e, T4 S9 j0 v 10、可以看到串口输出的错误信息,我们根据提示运行命令:7 l: L8 O5 w' j. `. n5 D T! Y ~, p addr2line -e USART_TEST.axf -a -f 0800157e 080015ce, }0 h0 P( e# k8 I) c 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,. r: [* ` `, L% q, p + p8 V: ?) p$ \" v 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:( H2 I+ h, C( \2 U( k$ P5 j3 Z- o / ?" r9 j- [, A 12、在该文件夹中,我们按下shift键同时点击鼠标右键 : d- J* m9 I2 e4 {( m ' p, Z7 d4 _6 n: O$ v! O 13、在powershell中,输入 start cmd并回车运行( G8 L7 a7 ^( q4 c " a# T5 y: J; f) u & B$ z# t6 K+ \1 K# _: O7 u 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行$ Z) b( R1 a- E2 T- ]; [ 4 L# p( z: \, j8 b1 F- r1 n! [ 15、可以看到addr2line.exe工具给我们定位出的错误代码行数 、 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误6 `1 ]4 A1 e9 m 转载自:创客技术日记 如有侵权请联系删除# ~9 |: U: z9 u$ c) ` |
兔哥的杂谈【002】——如何性价比更高地去编译STM32
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
FreeRTOS学习笔记2
【NUCLEO-H533RE评测】+05 调试PWM
基于STM32在线升级OTA经验分享
【NUCLEO-C0评测】硬件OLED显示
【STM32C0测评】外部中断控制小灯
【STM32C0评测】1、开箱,芯片介绍以及后续的评测计划
基于STM32调试小技巧之不复位调试
基于STM32的不复位调试的经验分享