你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32 hardfault问题分析经验分享

[复制链接]
攻城狮Melo 发布时间:2024-7-29 13:50
在平时项目开发的时候,我们难免会遇到单片机程序进入hardfult
4 C$ v+ p+ d, w; J. T- E* j. V# Z3 a# I( \% l1 L$ Z
常见的导致单片机进入hardfult有以下原因:8 X0 B! I- ^( _5 f/ B
堆栈溢出、数组越界、野指针、非对齐访问
# Q9 ]% B1 m( t6 z6 V3 M. _3 R! q  g5 E) _* s

' ~7 ]& E7 g2 e& S3 y* h接下来,我就跟大家详细介绍两种定位错误的方法,帮助大家尽快找到问题根源并解决问题
0 q; U% n% @$ T5 X
' M1 x% Z2 v7 p" O  _8 o* P- S定位错误
8 N* Y% f& O' {3 d9 D* L( u6 Q方法一  Show Caller Code5 h/ P: @* N) k1 x: I
在hardfult中断处加入断点,当进入hardfult,我们在Call Stack+Locals信息框中,右键,选择show caller code可查到进入hardfault时运行前的代码,但这不一定准。. k+ _, O# {) B: ]" k

+ B; X/ p, D0 H. e. `' Z
微信图片_20240729134833.png

, E; ^! S! u  W, D
* l8 X/ J' Q5 d" ^; V7 x方法二  开源库CmBacktrace  C$ I4 W+ G# O: @7 R6 k
CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
; W" F. C7 [1 G' x$ @
) f/ x) x9 D. {4 G' b2 J# M支持的错误包括:
' Q5 ~" J3 Z: q, T- n3 j断言(assert)' ?& R4 v" z; f7 C, J
故障(hard fault,memory Management Fault,Bus Fault、Usage Fault、Debug Fault)
! O" X; L4 Z  N# ^故障原因 自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器。
* b" s; J# `- s7 {/ L  E$ ]5 V( G  L( m5 T$ N, q# o
输出错误现场的函数调用栈(需配合addr2line工具进行精确精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、准确。也可以在正常状态下使用该库,获取当前的函数调用栈9 \  @" a7 _! d% A* H* K8 {4 k

8 T" }: A: A6 d% L0 A6 \* M& Y适配Cortex-M0/M3/M4/M7 MCU
5 ~- q& k7 _8 Z+ C( o9 i5 {
5 [* w+ o3 ]* o$ o: ]$ q# D' n支持IAR、KEIL、GCC编译器
1 _8 y& F9 \; Z% T- F% T2 I4 ^. x4 s6 o4 t, F2 W4 w0 _' J1 r
下面我们以实例过程移植及使用(Keil)
! C7 {' E9 O# }1、下载源码,解压,如下图
- x- l1 k  ?4 m% F: w9 z
$ F7 S% G) o# a% _) g# ?
微信图片_20240729134829.png
" n: Z# y) j7 x5 ?5 R; m

6 S1 Z3 w  l! J2 u其中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
微信图片_20240729134826.png

+ w$ B4 y: T% C0 d- U5 Q7 R

& S# s2 h$ U( l7 a/ L$ `$ }3、添加到工程中,添加头文件、勾选C99模式
  g0 w# ~; U+ t- S0 J! k  `. c' G( k$ Q
8 ^8 N$ h, q3 N# N) I# U/ [( K
微信图片_20240729134823.png

! P9 R# r$ o8 w" s1 ^! M0 \, ?7 s, a2 I5 X! J! E2 K) \0 k
微信图片_20240729134820.png

- o5 n5 `( ?! ^# b- t

* J: Q" V& r+ M  ~# k) H4、这时我们可以编译一下工程,编译后提示比较多错误
  h# {9 F8 h- N; p- t- ?2 F0 \
6 S3 j2 M" @3 f; O
微信图片_20240729134817.png
, A3 b+ e( u1 U3 P( p  [
: g' X7 o! {. O  C
5、从错误看出,有一些宏定义和预处理没找到,那是因为cmb_cfg.h的文件我们还没修改,该文件需要设置,我们设置如下:
/ k2 M/ x# i7 v7 C2 G# e" m8 d4 u. j; W
微信图片_20240729134814.png
9 b( `. d$ _7 g- A* u: q3 o* R8 G
2 b7 r8 }3 m4 j# @* C
6、修改完cmb_cfg.h宏定义后,我们重新编译一下工程,提示还有一个错误,cmb_fault.c和stm32f10x_it.c文件的HardFault_Handler函数重定义了
5 t" }0 u3 e  N0 \/ W) s4 y
# f! A8 N; U+ R7 q% F. {
微信图片_20240729134811.png

1 H$ m& y8 o( A; \5 C8 ?7 K
: F) n% {( c! {7、在stm32f10x_it.c文件中,找到HardFault_Handler函数并将其屏蔽" w( @+ ^, j$ ~1 N
; \) F# E' X' N2 i* F
微信图片_20240729134808.png

$ J4 x/ g& F6 n- z* Z/ F! x
- n. K! ?! X, Z0 M- f+ ]6 f
8、这时我们重新编译,错误消除。
5 t/ p, p5 v6 W3 s' r
/ h+ _- ~, F& j% u( [我们在main.c文件里编写需要测试的代码,如下:
0 t; {* d2 A: L, r7 K. Y8 W" M
, J8 ?, t% o2 g+ F1 P: J
微信图片_20240729134805.png
, W' p( S3 J$ W* @* ~0 [0 m

' n5 z6 @' O. _0 X
% T0 D2 `7 z/ R/ l; Z  G8 B
  W( s1 z4 d# I& x
9、下载并运行程序:
7 }3 s2 G4 S# g
( G3 `! r+ R& S1 ~1 l0 M' {2 H' f
微信图片_20240729134801.png
% V- b1 @) C! S) t7 K

, L* ], K1 \& q2 _: C( I$ m; g10、可以看到串口输出的错误信息,我们根据提示运行命令:
6 \8 E' F6 P% Laddr2line -e USART_TEST.axf -a -f 0800157e 080015ce1 M! p8 }$ Z3 F' y8 R! p

* [. n. M* l* a% f" o6 H/ u0 U运行命令需要运行工具addr2line,该工具在CmBacktrace源文件tool文件夹内,, P! @+ S6 {, Q& }- ]

% v7 w/ F5 a5 V" d2 x8 F8 t( x
微信图片_20240729134758.png

( h8 |7 _) l: t1 f4 {
3 M# Y2 ?4 j3 r4 Q* n7 E1 [/ k11、根据系统版本,我们将addr2line.exe文件复制到工程目录下.axf所在的文件夹中:! C$ y1 g# [) d# P# t; |
$ {, K( M* i2 \3 \; \- P; B
微信图片_20240729134755.png

' S9 v  e) w9 |  a+ {" I  R% u' K  [5 C% m1 k/ J: {& F: _3 d6 O0 Q
12、在该文件夹中,我们按下shift键同时点击鼠标右键
. s) S" j) J$ j
! n5 Z% ~# _& @1 J; f# }3 x; V0 h  d
微信图片_20240729134752.png
  ^8 _" n0 o8 m" P9 [% T. N" u+ R
0 q. b9 K  C8 D# X; o4 E! K. }
13、在powershell中,输入 start cmd并回车运行
3 ?0 U: ^+ w& s/ L) S9 f$ G+ A2 ^2 g- j, f/ a
微信图片_20240729134749.png " f, G2 Q4 x4 v& [$ Q
7 l0 e! u6 j/ O0 F8 Y6 H; [

7 T! T4 J% p$ M14、这时会弹出cmd.exe的界面,我们输入addr2line -e USART_TEST.axf -a -f 0800157e 080015ce 命令,并运行; S. \& m9 \; j6 G4 [7 i

' x* t# l% r) D5 j8 J# }
微信图片_20240729134746.png

, x1 I: Z2 \0 S' b, L

9 Q7 e" T  s; H2 f5 v$ I! q15、可以看到addr2line.exe工具给我们定位出的错误代码行数5 M$ X- J5 S- ~' @' u3 [7 p. m

& b, Q, Z* p0 N, s5 z: Q0 N3 e
微信图片_20240729134743.png

& S5 M5 j4 T2 e

9 E" }2 {, o1 G! }; \4 {7 G使用CmBacktrace库能帮助我们有效快速地定位HardFault错误
1 t  J% d2 e+ f. m. @  ?; W7 V8 r. T1 Q
转载自:创客技术日记
1 l8 O: ^% d2 `0 d/ ?如有侵权请联系删除( C8 j: }" v3 d

! I9 f7 f! s6 O/ b7 S
收藏 评论0 发布时间:2024-7-29 13:50

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版