在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult& F @: h% ~$ t: Q3 j 常见的导致单片机进入hardfult有以下原因:, w5 k8 H. |7 a9 S ] 堆栈溢出、数组越界、野指针、非对齐访问6 L1 V; f. X' o- @6 e, m 接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题 定位错误 方法一 Show Caller Code( S* ?; p) C9 e 在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。 ; P+ w5 r5 l* U7 | 方法二 开源库CmBacktrace CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:& k8 J& ?8 A8 I" ?7 R2 b( d ) q4 \) A4 H0 J! L( l& V 支持的错误包括: 断言(assert) 故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault) 故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。 输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈 0 d5 b( c. J# ?4 ]" t" n 适配Cortex-M0/M3/M4/M7 MCU( _1 Y, u1 A$ D9 ~( c' Z' \8 i; N$ E & N6 l) K5 c* l 支持IAR、KEIL、GCC编译器 - n* ?. {9 H0 z7 b4 u% ^ 下面我们以实例过程移植及使用(Keil)6 n) X; x3 i5 @. @ 1、下载源码,解压,如下图/ q, Q5 G$ ?8 \% v# c O) X0 G d5 J& O( f; ?4 R5 H 其中cm_backtrace文件夹下就是核心文件,我们移植需要用到的。. q9 ?( R, w1 l' G- O , z* B' \& H6 X* A* V4 G% C, c 2、将cm_backtrace文件添加到工程目录下,由于我们是使用keil工程,所以需要在fault_handler文件内选择keil文件下的文件 4 f2 {/ B4 |" Q 3、添加到工程中,添加头文件、勾选C99模式 ' g7 K4 z1 w8 u9 b# P- H# ?" Q 4、这时我们可以编译一下工程,编译后提示比较多错误 2 c7 i' p/ _$ x2 Y/ | 5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下: : S K" q. e4 j9 G5 f/ F* V 6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了 0 H& y' f5 L1 y 7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽 ( D! G8 R8 ]; v( N7 i 0 b" w" J! a0 I. V 8、这时我们重新编译,错误消除。5 _* o0 H q% x& M 我们在main.c文件里编写需要测试的代码,如下: / M* i( K$ [; M0 v$ c 9、下载并运行程序: % F! O' p2 I! W0 C- ^; I6 j 10、可以看到串口输出的错误信息,我们根据提示运行命令: addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 5 @9 L/ `4 v' j8 y7 T7 d' f: S 运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内, ! N; D1 t7 u/ h4 \ 11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:4 v# b# X: Y! U5 B( ^9 ~7 N, r # f! h' E3 _1 K$ p% O. E ~$ r3 [ 12、在该文件夹中,我们按下shift键同时点击鼠标右键 d- i) z: D8 w 13、在powershell中,输入 start cmd并回车运行* c. B5 g y. ]" ]' z: l$ t + G9 K" V' a \! M 2 [+ I( o9 D. C$ R5 }+ Z/ o: j K 14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行$ S/ i. _. X6 v6 w: g 15、可以看到addr2line.exe工具给我们定位出的错误代码行数 、) G) @0 u) t6 q3 g5 @$ ^9 j 使用CmBacktrace库能帮助我们有效快速地定位HardFault错误 Z; R& E7 {$ Q" F& @ 转载自:创客技术日记0 Q2 e% Y3 U5 p7 F3 ^/ K 如有侵权请联系删除 |