|
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult 6 D* i7 d, f. m; [: u7 ] 常见的导致单片机进入hardfult有以下原因: 堆栈溢出、数组越界、野指针、非对齐访问% [( M0 y7 M' s5 Z+ i1 G 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题 , t- ~0 R/ F" T ]- H 定位错误/ V! a* F2 D' b 方法一 Show Caller Code0 {7 c, {1 R9 X0 ^ 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。9 P" E% q. }3 I8 u2 y3 w! t6 |
方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下: 支持的错误包括: 断言(assert)( T1 k2 Z1 f+ T5 L4 J# \ 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)" z. |+ ~3 f! F8 Z 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈5 V6 b! \. m. Z' i0 Y8 ]7 s: j 适配Cortex-M0/M3/M4/M7 MCU( H% w7 s2 B+ ^3 D/ f' H 支持IAR、KEIL、GCC编译器3 H& I: g9 |, l. {3 Y- ^) D; ~: S8 v ) ^ R4 ]& o @+ v) \" ~- q 下面我们以实例过程移植及使用(Keil)( i. `# @7 q8 Y' v, K' M 1、下载源码,解压,如下图: b7 {' F8 M. `9 O4 u( H9 K& W) G* p
: t( n/ U- }7 W5 K7 Z9 X 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。 . z! |4 [: B& Y. ]( A 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件 4 X2 M0 t0 ^+ X$ ~5 X" c
3、添加到工程中,添加头文件、勾选C99模式
* i4 J9 ?0 k" ]1 a# J
4、这时我们可以编译一下工程,编译后提示比较多错误
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
0 R6 F; O5 {4 y0 H' {6 I+ k 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了4 V* f6 M2 |" N8 ^
; B3 Q O4 e& S# \# x1 I- | 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽
6 L; _) G8 @8 y 8、这时我们重新编译,错误消除。 我们在main.c文件里编写需要测试的代码,如下: t, B% F `) u1 p1 r
3 L) f, \, N6 a# B+ d! q ( f3 w( }3 S9 S4 f8 F 9、下载并运行程序:8 w; g5 f0 C" E 3 s0 j# X) t8 a
10、可以看到串口输出的错误信息,我们根据提示运行命令:$ j, P4 ^3 N/ o" G& J5 P3 J addr2line -e USART_TEST.axf -a -f 0800157e 080015ce- z! I! U( J. f7 g3 y" K" } . i4 w5 F% I& G 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,3 g0 V7 L6 B: X( r5 a& ^" O" B
7 }* d3 N& b+ N' [0 z 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中: 4 D& ~; t6 [/ }
* N* D3 F) E) b; n 12、在该文件夹中,我们按下shift键同时点击鼠标右键, ?# ]% Z$ ^4 n& @$ {. _. u & K1 G) h0 x8 B3 n
8 f) y* U2 p6 c. z, e* K( V 13、在powershell中,输入 start cmd并回车运行 $ M+ M/ l: Z- c Y9 `2 h2 p
7 e4 o9 [$ \/ K0 t* n" g: \ 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行 0 A2 C2 h/ `7 f- z! D, Y4 D
15、可以看到addr2line.exe工具给我们定位出的错误代码行数
、9 @0 ~" J! ]; i. N4 u( ` 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 3 h- _- C" y) V 转载自:创客技术日记 如有侵权请联系删除 / ?( u' x* {! H |
《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运行工程配置说明
微信公众号
手机版