|
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult # Z3 a# I( \% l1 L$ Z 常见的导致单片机进入hardfult有以下原因:8 X0 B! I- ^( _5 f/ B 堆栈溢出、数组越界、野指针、非对齐访问 6 V3 M. _3 R! q g5 E) _* s 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题 定位错误 方法一 Show Caller Code5 h/ P: @* N) k1 x: I 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。. k+ _, O# {) B: ]" k
方法二 开源库CmBacktrace C$ I4 W+ G# O: @7 R6 k CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert)' ?& R4 v" z; f7 C, J 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault) 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 $ ]5 V( G L( m5 T$ N, q# o 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈9 \ @" a7 _! d% A* H* K8 {4 k 适配Cortex-M0/M3/M4/M7 MCU 支持IAR、KEIL、GCC编译器 . x4 s6 o4 t, F2 W4 w0 _' J1 r 下面我们以实例过程移植及使用(Keil) 1、下载源码,解压,如下图
其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。4 ]3 z; @( N% U( X ) W: b' ~) R! ~' g& v% M 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件% g# ^% H9 A. t* V% G3 c ' b1 b! y4 B- e" v5 n" V5 _. G5 b) C
3、添加到工程中,添加头文件、勾选C99模式
0 \, ?7 s, a2 I5 X! J! E2 K) \0 k
4、这时我们可以编译一下工程,编译后提示比较多错误
: g' X7 o! {. O C 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: 2 G# e" m8 d4 u. j; W
2 b7 r8 }3 m4 j# @* C 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了 # f! A8 N; U+ R7 q% F. {
7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽" w( @+ ^, j$ ~1 N ; \) F# E' X' N2 i* F
- n. K! ?! X, Z0 M- f+ ]6 f 8、这时我们重新编译,错误消除。 我们在main.c文件里编写需要测试的代码,如下: , J8 ?, t% o2 g+ F1 P: J
W( s1 z4 d# I& x 9、下载并运行程序:
10、可以看到串口输出的错误信息,我们根据提示运行命令: addr2line -e USART_TEST.axf -a -f 0800157e 080015ce1 M! p8 }$ Z3 F' y8 R! p 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,, P! @+ S6 {, Q& }- ]
11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:! C$ y1 g# [) d# P# t; | $ {, K( M* i2 \3 \; \- P; B
[5 C% m1 k/ J: {& F: _3 d6 O0 Q 12、在该文件夹中,我们按下shift键同时点击鼠标右键
0 q. b9 K C8 D# X; o4 E! K. } 13、在powershell中,输入 start cmd并回车运行 / L) S9 f$ G+ A2 ^2 g- j, f/ a
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行; S. \& m9 \; j6 G4 [7 i
15、可以看到addr2line.exe工具给我们定位出的错误代码行数5 M$ X- J5 S- ~' @' u3 [7 p. m
、 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 . @ ?; W7 V8 r. T1 Q 转载自:创客技术日记 如有侵权请联系删除( C8 j: }" v3 d |
《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开发板与硬件浮点运算性能测试对比
微信公众号
手机版