|
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult # T) n9 y, r, S 常见的导致单片机进入hardfult有以下原因: 堆栈溢出、数组越界、野指针、非对齐访问 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题# Y% b7 r2 p( B; V& C: H 定位错误 方法一 Show Caller Code; P8 C3 U0 x* j7 P* H 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。
方法二 开源库CmBacktrace# U9 A6 ^+ n$ o, ?* L# e CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 0 [6 b' _. g3 Q* E# }( n+ g 支持的错误包括:4 d5 a/ S/ q: C 断言(assert)/ z* H8 f, p$ q7 I p& T 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault) 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。& w# B/ t+ n2 E/ H7 e; k0 D 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈 + h. a0 o, ^" s, C7 x% U9 w, ^5 n6 e 适配Cortex-M0/M3/M4/M7 MCU7 b& Q5 A, @, Z% q ; k4 W2 q$ V' z8 e: O6 I 支持IAR、KEIL、GCC编译器" s7 T6 x# a1 U7 [/ d + K/ l( c: l l( ^5 ^ 下面我们以实例过程移植及使用(Keil)" L: @4 Y; j2 x: X) B 1、下载源码,解压,如下图
* N: s) Z5 ]" D ^2 t, p 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。& V" l. z5 ?2 X0 T; y 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件
# M0 g) N) H4 W2 w/ ^ 3、添加到工程中,添加头文件、勾选C99模式: b) {7 i. l6 J1 _$ N8 N
* ~& T9 S, Z; A: ~6 m4 Y
4、这时我们可以编译一下工程,编译后提示比较多错误2 T: [$ {3 ]; _1 z" P) l; H 3 O0 C: p. N/ ?$ t4 s
}) ?6 [8 v! U 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:6 I* m5 b3 q4 S2 Y $ b& S" G6 s6 X N/ U9 P
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了 $ M Q, L7 \, F5 {7 N# K: V
0 ]; m: _: A% D) ^+ F5 V 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽 - ]! `$ G5 ^5 w R
4 K% R$ U8 |# v" u; A; X 8、这时我们重新编译,错误消除。 我们在main.c文件里编写需要测试的代码,如下:$ p' O8 R+ N7 U; }
$ r4 j% ~$ N9 H; B6 k/ c / @! f4 y( q" V9 f7 t3 r 9、下载并运行程序: * L A5 T! U6 p3 R2 m. [( b8 c/ x
x$ ^- ?5 P$ A% \ 10、可以看到串口输出的错误信息,我们根据提示运行命令: addr2line -e USART_TEST.axf -a -f 0800157e 080015ce6 `* m+ C5 y' y" H $ I1 g% S; n* o% K. D' r* n+ R 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,/ ^7 ~3 B0 N0 Q 8 j& N. F. ], c" U5 q) t1 f
( |# F: U$ A m) k5 i b) K 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:
12、在该文件夹中,我们按下shift键同时点击鼠标右键
! ^' R/ _) M' {7 M1 p 13、在powershell中,输入 start cmd并回车运行 / ^1 B9 Z& u& {% `/ k r
14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行$ y9 a0 W# x0 ~" T
15、可以看到addr2line.exe工具给我们定位出的错误代码行数
、2 X! S, t6 t. }0 p 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误0 x/ P/ \; j' `8 c* j 转载自:创客技术日记% Y( f- D8 f- ^4 K { 如有侵权请联系删除. f i0 {; V$ |% f; b |
《STM32CubeMX2 实战课程》学习笔记5+CubeMX2生成的Uart初始化代码中没有使能
《STM32CubeMX2 实战课程》学习笔记4+FreeRTOS中的SysTick错误及改正
使用stm32C542做的低功耗密码锁示例
《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运行工程配置说明
微信公众号
手机版