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

【经验分享】鬼魅一样的 Hard Fault

[复制链接]
STMCU小助手 发布时间:2022-2-26 15:42
问题:
1 p0 [) y* `) Y  [7 m) a( @7 P# a* g该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。9 q# t2 |! f! n0 W: @# ^

8 h+ q2 Z: r* b4 q& T! S# v调研:
4 J9 F6 O# h5 q观察其工程师现场演示,证实确有其所述现象存在。3 N6 Y/ |9 R9 T3 P1 R: ~
检查硬件设计:; U- V* f; L$ y% d- Y  @, M& F( D: W
1. 每一路 VDD,匀为 3.3V 供电且同源,并有 0.1uF 的退耦电容。' }! G, V% [" d* A" C
2. VDDA 为 3.3V 供电,与 VDD 同源,且有 0.1uF 的退耦电容。* w9 @" A# [8 K; l8 k
3. VBAT 为 3.3V 供电,与 VDD 同源,且有 0.1uF 的退耦电容。& A* a' D$ y  l, o
4. 设有芯片整体退耦电容,容值为 10uF。
+ c4 `& T( j& h& O5. 每一路 VSS 匀与电源地连接。2 L3 z+ |$ \  @6 z: l, Y4 d* I
6. VSSA 与电源地连接。. }& K% E6 M0 H( V1 |# w- J$ {" p
7. 实测硬件电路,证实与原理图一致。退耦电容临近管脚摆放,地平面较为完整。4 {- ]& I2 R2 a& S  O; g6 w2 `
8. 用示波器实测电源纹波,小于 50mV。
# ]* |& G9 n$ R$ ?/ V6 D6 V& c! m9 ~2 ^3 E. L+ H# }
检查软件设计:( y# i! O/ b+ I8 w. S6 c3 E
1. 通过打印跟踪程序中每个指针变量,发现有指针对存贮器范围之外的地址进行访问。核查相关代码,该指针的数值来自 I2C 接收的数据。& J. g' `3 O& S" y9 N6 V6 `9 p
2. 通过打印跟踪对 I2C 数据缓冲区的访问,发现有缓冲区溢出现象发生。0 ]+ M$ C  C5 r9 S* v' [* ~
3. 修改代码,将缓冲区加大,重新测试,未发生 Hard Fault 中断现象。3 s& b8 Y# l4 m, m9 F. Y8 s

! o# h; n  F( F$ C6 S5 y- x' S
+ {- ?( d8 L8 F; x4 Y结论:
  k+ e: Z  T2 h, q. a$ O7 G基本可以认为是缓冲区溢出,而造成某些指针取值错误,从而对非法地址进行了访问,进而引发出错保护中断发生。但对于此类问题,仍需进行长时间测试,才能有最终结论。
/ W! p: c2 v2 b6 J4 M, @0 B5 y7 ~; `, B  e9 |

% I( o" I# A& U; O. m处理:+ [  J" f: K* x4 i/ h+ ?2 ~, y
修改代码,根据实际需求设定 I2C 数据缓冲区大小,保证其足够的空间而不发生溢出。  ?" p/ u3 t* l8 [. h
" N( {9 C+ Z# l
4 |7 T2 Z4 H& d7 I8 m
建议:
' t% C) b/ |. Q5 \* r; THard Fault 中断是 Cortex-M 处理器为应急处理严重出错而设定的中断,它与 MemManage Fault 中断、Bus Fault 中断以及 Usage Fault 中断,共同构成了 Cortex-M 出错管理机制的硬件基础。其中Hard Fault 中断是出错的最终管理者,其优先级为-1 级,不可更改,而其它三种出错中断分别处理某方面的出错,它们优先级是可以设定的。MemManage Fault 中断与 MPU 有关,负责管理存贮器访问方面的出错,例如:
3 e2 O; \# F8 ~5 S  ?& x' `1. 访问了 MPU 覆盖范围之外的地址;! a6 ?, X4 }1 E; d4 {8 q
2. 访问了没有存贮器的空地址;
* z$ X$ r" Z$ N) q, v: o8 Y3. 向只读的区域写数据;/ E( X% I" C( S6 o9 |" v1 v, n
4. 越级访问某些区域;
$ s/ e' F$ \$ x( ?5 b! `/ K8 G- ]6 h5 B* J4 o
当发生了存贮器访问方面的出错,Cortex-M 将尝试产生一个 MemManage Fault 中断。如果出于某些原因,MemManage Fault 中断不能立即响应,则将出错升级为严重出错,尝试由 Hard Fault 中断接管该出错的处理。Usage Fault 中断负责管理指令系统方面的出错,例如:
$ K8 Q& f; z: [' w1. 执行了协处理器指令;* W6 G9 ^# d/ J
2. 执行了未定义的指令;0 K( {; `/ Q& i% `$ s% Q
3. 尝试进入 ARM 状态;4 Q$ I0 j8 ?+ L5 s1 R; G. q
4. 无效的中断返加码;0 l6 Z; ~4 F0 H/ m1 {
5. 使用 LDM 或 STM 指令时地址没对齐;
2 V; h9 S* y% W  Z# l4 j+ ?  A' j; q; l( M( M0 d# K8 w& ~2 H
当发生了指令使用方面的出错,Cortex-M 将尝试产生一个 Usage Fault 中断,如未能成功则同处理MemManage Fault 中断一样,将出错提升为严重出错,从而转交给 Hard Fault 中断来处理。Bus Fault 中断负责总线访问管理,当总线的应答信号返回错误时 Cortex-M 尝试产生一个 Bus Fault 中断来处理,未果则将出错提升为严重出错,转交给 Hard Fault 中断来处理。通常,总线应答信号返$ y) d& v( l8 [
回错误的诱因有以下几种:
2 k: W9 O7 m) _  v1. 企图访问无效的地址,该地址上没有任何的设备;
; u# [& S9 ^7 [! K1 t2. 设备还没有做好数据传输的准备,如尚未做初始化;
" Z3 Q% d# N4 f' ?3. 传输数据的尺寸不为设备所支持;
; b% @. E) D, \
" d2 g2 a+ y! Q7 e& j0 T; VHard Fault 中断用于处理严重出错。其它三种出错中断未能及时处理的出错都由 Hard Fault 中断来处理,它是 Cortex-M 处理出错的最后的机会。如果在 Hard Fault 的中断服务程序中又发生新的出错,或 Hard Fault 中断不能及时响应,则硬件系统将进入死锁状态,以避免故障扩散。在 Cortex-M复位之后,Hard Fault 中断是被允许的,而其它三种出错中断则被禁止。所以,在通常的应用中,无论出现哪种出错都表现为产生了 Hard Fault 中断。
) U2 h5 H1 U0 t3 o+ Q   ) D( B$ [/ e+ {3 W# x( _# B- h
一般来说,由于大多数型号的 STM32 中都未包含有 MPU,或应用软件未使能 MPU,所以内存管理方面的出错不为多见。而对于使用 C 语言编程的软件来说,如果不考虑编译器出错,除了由于函数指针使用不当,而造成尝试进入 ARM 状态以外,其它的指令使用方而的出错也不会遇到。于是,只有总线访问方面的出错才是我们主要面对的问题。导致总线访问出错的原因,可能在硬件方面,也可能在软件方面。在硬件方面常见的原因有:
# I$ G2 e  L- @8 D# C7 O1. 电源设计有错误,造成器件供电不平衡;* u7 g. V1 J0 M- m
2. 电源质量不好,纹波、噪声过大;7 U2 `& U( ~' w6 C
3. 器件接地不良;
$ H+ G9 Z0 t4 `1 V( q" f4. 对于带有 Vcap 引脚的器件来说,Vcap 引脚处理不当;
2 B$ e3 z) j0 X7 b( [$ W5. 电路中有强干扰源,对器件造成了干扰;
- V6 _% z4 M' O
* Q9 N0 F; k" C: f4 }: ~" Y软件方面的原因则是使用指针访问了非法地址。根据已往相关问题的调试的经验,造成指针取值出错的常见原因有:
0 `5 w. `0 D' r8 }: u1. 使用了空指针;
3 `0 J; e. }5 G' X2. 对地址偏移量的计算有误;
* v+ |, ]. Y0 S& \$ F4 t. a# ?3. 数组越界导致程序出错;( S& e  H4 k" k" t, W
4. 动态内存用不当,导致访问了已释放的内存地址;$ G6 E) A5 P9 i" z! J- Y
5. 通过地址访问了已失效的局部变量;3 X- F+ V  S# c: C
6. 对与中断服务程序共享的变量的进行“读修改写”操作而未加临界保护;
. j. v; @/ \$ o1 [+ g
5 X  B5 F2 ~) i% ^1 Y) @Cortex-M 为各种出错设计了状态寄存器,有时核查这些寄存器的取值,对定位问题原因有所帮助。附表如下:1 i) j2 F7 |4 Z7 r
Bus Fault 状态寄存器 BFSR,地址:0xE000ED29
2 f  h" I2 ?* K) }" v' M1 x$ F( q9 p( |2 h  S" d0 e
(STC)IE81_S7Z6_(CZMECW7.png
4 V0 P, R( f, Z# A
$ F7 p" `5 n1 o  C7 nMemManage Fault 状态寄存器 MFSR,地址:0xE000ED284 H+ u% \9 {  O# U$ H2 Z
+ C" o* C. |! x. g7 y4 E" y' n' e% M
- a2 [+ J! a8 z1 e- L+ q6 O- B" M
WWU3W)%]3OF@P_XLGV(UY10.png 8 r+ B  p7 v4 E# O
1 M+ e( _9 m+ [: m9 D
Usage Fault 状态寄存器 UFSR,地址:0xE000ED2A* R7 Y. X; q7 x. D

4 U2 j4 F( @$ h8 w! D4 h A$SE$MAL66OUZ8`C%]~2}%C.png
( l) u2 w6 u$ }0 l9 f: o
0 T# c* e9 k. i  v& JHard Fault 状态寄存器 HFSR,地址:0xE000ED2C) F8 j  }$ ]% u; K% r0 F2 z: F3 T

9 Z6 M$ w6 ^- t7 C% r
6 D& P" Y# {: P- D 0ABZSGVTXMKJMM_OH8(GIJA.png ! @6 g4 R/ Y% O- z, s2 \

  ]5 U0 R/ f* Y2 w$ b1 ^
赞 收藏 评论0 发布时间:2022-2-26 15:42

举报

0个回答

所属标签

相似技术帖

官网相关资源

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