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

【STM32F303开发】+如何找到导致程序出现HardFault的代码 精华  

[复制链接]
creep 发布时间:2015-7-4 19:50
本帖最后由 creep 于 2015-12-5 17:17 编辑
2 p  z6 R1 j% g) g# L6 B3 d
7 Q$ ?; ?- A5 L9 X/ U8 B下午在社区群里和小伙伴聊天时谈到如果程序Fault时如何找到是哪句代码出现的问题,也就是说怎么找到程序运行到何处时出现Fault的。之前一直使用一种方法感觉不错,分享给有需要的同学。
% L2 \. w$ a& Z大致的思想是当程序出现Falut时会跳转到相应的Fault中断里面,此时压入到堆栈的信息应该就是出现问题代码运行出错Fault的信息,我们要做的就是找到此时压入堆栈的LR的值。为了模拟Fault,我们将0写到地址0里面,此时debug下全速运行,程序就会进入到Fault函数中。 faultjpg.jpg
( G4 u! @+ J+ `4 q2 w/ h我们在Fault中断函数中添加一个软断点,这样做的好处是debug模式下全速运行,当程序跑飞(Fault时)会自动停在这里,否则我们还要手动停止运行才能发现程序进入了Fault中断函数。
- `* z4 i. x+ a9 p faultjpg.jpg
7 w- y/ E7 I- m+ l/ G2 L为了方便查看程序程序的Fault时的相关信息,我们将错误信息打印到keil的debug Viewer窗口中,关于如何打印信息到keil的debug viewer窗口,可以参考我之前的发的帖子:【STM32F303开发】+ 使用SWO输出调试信息到Debug Viewer窗口1 _8 G8 i1 {% d. _! O
7 r3 r. l9 s( S$ u8 v& O
M3/M4内核的MCU的压栈的模式如下,我们根据下面的寄存器的存放顺序来取出压入到堆栈的寄存器的值。
9 Q7 v8 B& u5 Z$ c faultjpg.jpg / s7 o$ @, @$ V" ]0 b
同时将Fault中断时的函数重载如下,用来输出更多的信息,同时判断了是使用MSP还是使用PSP,; \+ R; D% X' C+ \2 q: B3 e
faultjpg.jpg - }! N* Z; c3 h- k3 K) [; r; B9 D
! U) m9 N6 n8 F  b
具体的void Hard_Fault_Handler(uint32_t stack[])函数根据寄存器SCB->CFSR判断并输出是那种Fault:
! K9 E/ X) B. t7 ?1 G& d  J faultjpg.jpg ) K7 @0 x/ g' Y+ V' R! ~' l; P8 ~  C8 k
最后使用函数stackDump(stack);输出出现Fault时的堆栈的值,取值的顺序是根据上面说的M3/M4内核压栈的顺序得到的:& |3 g8 P* u: S# @- K0 p

8 |9 U5 m1 y( k% }  }/ ] faultjpg.jpg 1 S! \! q5 C* |) V9 X

- c& Z  ^3 g( ~" k; q7 ~) P  |# D下面我们在debug模式下全速运行如下代码,main函数如下:其中的        *(uint32_t*)paddr = 0; 会导致Fault并进入中断,
9 m% _, |  o. j  B: p: e faultjpg.jpg
( g& M( j+ O9 E, X0 ?0 O: o在debug模式下全速运行,不要设置任何断点,最后程序程序会在debug viewer中输出出错Fault的相应的寄存器的值并停止在__ASM volatile("BKPT #01");,此处得到的LR的值就是我们要找的LR的。
; L/ u1 u# c8 f5 l% b. X! Y. h faultjpg.jpg 5 y4 Q. s, M2 u; `+ W  \2 m
此时打开汇编窗口,在汇编窗口里面右键show Disassembly at Address选项输入LR的值然后回车0 R5 Q% I6 F7 I% f6 Z* y
faultjpg.jpg % [: `6 A8 }9 }4 O7 s
调转到的汇编的地方就是导致程序出现Fault的地方,注意M3/M4内核使用Thumb指令,要求最低bit为1,9 t5 }8 p) b9 f: i1 i
faultjpg.jpg 2 [! ?) n6 \# O

4 A4 |, u. f/ Q- T! ~3 S上面的过程大致就是找到程序出现Fault跑飞时的方法,基本上能定位到出错的代码,使用OS时要注意判断是哪个SP在起作用。
8 i, F( Z! }& s* x4 I这个方法很早就看到过,但是今天查资料发现是国外的一个工程师在ARM举行的Technical Conference上做的一个分享,$ O0 R1 @8 F; d8 u# [
具体参考网页:Developing a Generic Hard Fault handler for ARM Cortex-M3/Cortex-M43 D8 |, K* z! b
如果有问题可在社区QQ群(427779516)讨论
* C: C7 m5 K+ p4 H上面用到的测试代码:
$ B5 g: N0 E, Q8 u' }3 o: L: W4 M F303RE_Fault_Handler.rar (396.61 KB, 下载次数: 344)

评分

参与人数 2 ST金币 +38 收起 理由
wofei1314 + 18
zero99 + 20

查看全部评分

1 收藏 36 评论40 发布时间:2015-7-4 19:50

举报

40个回答
creep 回答时间:2015-7-4 21:03:14
z00 发表于 2015-7-4 20:05
" S# w' N! i) d' c, N- M& h记得在《cortex m3 权威指南》也有过这方面的介绍
4 C0 A2 p3 t7 D: {! }
《cortex m3 权威指南》是本好书,值得多读几遍!
creep 回答时间:2015-7-4 21:45:49
yvonn 发表于 2015-7-4 21:247 D! N" l7 k4 `. e) {: k- `* m! w
ST的专门正对这个错误,出过指导,可能因为是英文的原因,没有被广泛传阅,让很多后来者,还在这里苦苦探索 ...

4 H' {6 t9 N6 J4 o5 A. d/ Q谢谢指导,不知道你说的ST的出的指导哪里可以找到,能不能给些提示或者连接!) N& `; r: r4 e* @- M0 M* t6 b
这里导致导致Bus Fault 的那句代码是我故意写的用于触发Fault的。5 j! Z( ?- }; y  U2 N
对地址0写0肯定是不允许的,这是为了模拟怎么找到错误代码的方法。) I0 g$ i5 u, ?, L5 w( t( [% @
因为在一个功能复杂代码很多的程序里去直接定位跑飞(Fault)的代码不是很容易,所以可以使用这个方法去定位问题!
党国特派员 回答时间:2015-7-10 09:32:00
楼主很强啊       blank.png blank1.png blank2.png blank3.png blank4.png blank5.png
博根 回答时间:2015-7-4 20:05:37
记得在《cortex m3 权威指南》也有过这方面的介绍
风子 回答时间:2015-7-4 20:21:28
谢谢分享,很有用的东西
Paderboy 回答时间:2015-7-4 20:34:40
多谢分享,,必须好好学习
mark0668 回答时间:2015-7-4 21:14:13

7 w5 z0 B8 Y: n9 l: F: G谢谢分享
yvonn 回答时间:2015-7-4 21:24:52
ST的专门正对这个错误,出过指导,可能因为是英文的原因,没有被广泛传阅,让很多后来者,还在这里苦苦探索,好大的坑,如果没记错的话二姨家应该就有,实在不行去官网下也行。方法好像有好几种,不过还是支持楼主的分享精神。
lkl0305 回答时间:2015-7-4 22:11:17
多谢分享!
你好我好大家好! 回答时间:2015-7-5 08:08:01
楼主很强啊            
yvonn 回答时间:2015-7-5 08:56:00
creep 发表于 2015-7-4 21:45
" S0 u# p& [5 F1 a" T9 V3 x' O- R谢谢指导,不知道你说的ST的出的指导哪里可以找到,能不能给些提示或者连接!5 S0 ~$ G3 W6 J3 m4 S
这里导致导致Bus Fault 的 ...

1 P" M8 Z, z; i+ s5 s0 Z. R二姨家,上面有些,21IC ST 论坛
肽宰1 回答时间:2015-7-5 10:30:07
; n% p, ^: U: Z
多谢分享!
qq859218009 回答时间:2015-7-5 10:46:30
谢谢楼主的分享,非常感谢。
JackieLaura 回答时间:2015-7-5 13:04:51
受教了,谢谢楼主分享
moyanming2013 回答时间:2015-7-5 15:11:10
yvonn 发表于 2015-7-5 08:56, e. Y( U  q# n; q% i4 l
二姨家,上面有些,21IC ST 论坛
% N- h, O. s" Y0 X
能不能给个具体点的URL?谢谢!
123下一页

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版