|
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult5 Y' ?4 i+ t3 o. d0 ~7 A, Z: U T( I4 R$ w3 [0 V 常见的导致单片机进入hardfult有以下原因:+ B6 m5 P" T) u8 Q- n9 E4 B. G9 N; T 堆栈溢出、数组越界、野指针、非对齐访问 # L. X/ _, }! H2 x 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题 : R* D* D+ b8 T" J0 `% [1 e 定位错误 方法一 Show Caller Code0 t* P4 z( z7 ?9 x/ H$ P# J4 G 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。+ y; }$ o+ P+ e. ?$ C, V3 I9 J 9 K* W1 Z: @* K
方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert)# R2 d4 D& g; a: a0 j 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault); y8 i. _" F6 r) }0 \7 Q( A 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 9 ]* C( A$ U) P9 y9 a( x/ X: o 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈 9 O# Q y9 z. Q 适配Cortex-M0/M3/M4/M7 MCU# {+ G0 \2 a0 E$ Z/ ~& q0 a 0 `) b/ n: a8 c; P4 b2 @$ @0 a 支持IAR、KEIL、GCC编译器 下面我们以实例过程移植及使用(Keil)# N0 h2 s; P; H9 e$ Y O' p: z5 m 1、下载源码,解压,如下图
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。 W3 {- P! \1 p) H2 h, g0 K 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件+ s2 k2 b- H3 G % c" E- f. E: I) }( p" [1 W
3、添加到工程中,添加头文件、勾选C99模式8 n! G$ j+ w0 V& S! Y 7 F; ?) B5 K$ z0 o
% h z( I `+ Y4 t! G2 E+ X' H+ H 4、这时我们可以编译一下工程,编译后提示比较多错误
! A4 u/ J. c- K( `9 }# k 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: 8 m% ]3 ~% d: ^' O* I, v
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了* Y* ~% ?6 m/ x7 x . M1 m3 j4 l4 e3 w% D
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽( k$ {3 A( I- o8 |/ \+ p& I/ } w Y+ E8 s* I& v* c
' V% `( L$ c T: d- y1 E6 S" y 8、这时我们重新编译,错误消除。 9 S& [- K, r3 ^" l6 R2 i 我们在main.c文件里编写需要测试的代码,如下:! G+ _0 i; L+ [) r" B3 S % A) F* B$ i& z/ W o+ \
) Y0 X* w8 C+ L 9、下载并运行程序:- w: ], S( M- a; q* s* [
; Z. t T9 |# E# I0 f N' s 10、可以看到串口输出的错误信息,我们根据提示运行命令: addr2line -e USART_TEST.axf -a -f 0800157e 080015ce* G8 o- |% R! s, n. U( _6 \. d* [ 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,& g/ G/ M5 Q7 |- z8 v 3 A7 {( I1 e! h4 s
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:" }3 H3 m2 T7 ? * T9 X: K6 e% k/ w! Y; ^
3 p$ x: p& r5 ~3 j2 b) p 12、在该文件夹中,我们按下shift键同时点击鼠标右键0 B( ^0 J' k* z0 n4 E
8 U1 Z1 R+ G* h0 S8 t 13、在powershell中,输入 start cmd并回车运行: ~( F) @5 t9 D* M5 W1 N5 N + O Q+ w, z" I/ A$ i
8 L1 l) J: A0 d( ?* ]5 U( l2 c 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行 , J* v- j6 {, I
15、可以看到addr2line.exe工具给我们定位出的错误代码行数% ?0 l$ y0 ^- ~: s4 e" T . B5 ^0 Z1 H% ?2 q+ J
、 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误( z) a/ T/ b, g' Z! w * u) _% c- E( ^( o 转载自:创客技术日记 如有侵权请联系删除* z$ u1 {6 l0 _/ N0 ]8 w * B, q% z! M2 B |
《STM32CubeMX2 实战课程》学习笔记1+由MX2生成MDK5项目并打开
《STM32CubeMX2 实战课程》学习笔记3.+sleep/stop/standby低功耗模式的入口
《STM32CubeMX2 实战课程》学习笔记2+MX2生成的MDK5工程中添加已存在文件(*.c / *.h)
【STM32MP257-DK】01开发板开箱、ST MPU 生态资源使用、环境搭建以及镜像更新
基于STM32在线升级OTA经验分享
【STM32C0测评】Nucleo-C092开发板驱动DS1302实验
Keil下的STM32N6之RAM运行工程配置说明
兔哥的初代M33【002】-H503Nucleo 内部flash操作
兔哥的杂谈【002】——如何性价比更高地去编译STM32
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
微信公众号
手机版