打印

请教香版如何快速解决hardfaultexception问题

[复制链接]
5601|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xsq5360|  楼主 | 2010-11-11 14:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xsq5360 于 2010-11-11 16:02 编辑

在某次调试时发现程序运行一段时间后系统会进入hardfaultexception,看了论坛里很多相关的帖子,大致有所了解
想请教的是,出现这种情况时如何调试找到问题的根源?怎样获知程序运行到哪一步后发生错误进入hardfaultexception中断?如何能看出进入该中断前程序运行的过程?

未命名.JPG (123.88 KB )

未命名.JPG
沙发
香水城| | 2010-11-11 15:03 | 只看该作者
在hardfaultexception处设断点,调试停在断点处后看堆栈,一般都能找到从哪里进入的。

使用特权

评论回复
板凳
xsq5360|  楼主 | 2010-11-11 15:15 | 只看该作者
本帖最后由 xsq5360 于 2010-11-11 15:21 编辑

2# 香水城

按照你说的操作了下,但查看call stack,内容就如我第一帖中的附图,看不出是从哪里进入到该中断
还是我没理解对?
仔细看下了程序,发现有处蓝色光标,附图中的蓝色光标代表什么意思?

蓝色光标处?.JPG (36.23 KB )

蓝色光标处?.JPG

使用特权

评论回复
地板
香水城| | 2010-11-11 15:46 | 只看该作者
蓝色光标一般表示程序指针指向的地方,但要看什么时候出现的。

使用特权

评论回复
5
xsq5360|  楼主 | 2010-11-11 16:00 | 只看该作者
本帖最后由 xsq5360 于 2010-11-11 16:02 编辑

4# 香水城

这次最近一次调试的截图,堆栈中出现了不同的函数,具体应该怎样分析呢?

新堆栈截图.JPG (113.49 KB )

新堆栈截图.JPG

使用特权

评论回复
6
香水城| | 2010-11-11 16:04 | 只看该作者
分析堆栈中出现的最后一个函数,从PC指针指向的位置查,看看哪里有溢出等问题。

使用特权

评论回复
7
xsq5360|  楼主 | 2010-11-12 10:12 | 只看该作者
6# 香水城
我还是有点不大明白
如图中标注所示:
1处:
显示caller是0x08100670,但是查到该处代码是MOVS r0,r0
这说明什么问题?
2处:
程序进入hardfaultexception死循环时通用寄存器值如图,有没有异常?能说明什么问题?
3处:
堆栈中显示函数调用关系,

堆栈调用截图1标注.JPG (229.66 KB )

堆栈调用截图1标注.JPG

使用特权

评论回复
8
vigia| | 2010-11-12 10:22 | 只看该作者
在出现Hardfault之后,再去看CallStack是没有意义的,CallStack记录的已经是出错以后的地址了。

所以,应该是根据CoreRegister中的R13(SP),找到当前使用的堆栈地址,通过该地址直接查看堆栈中保存的内容。堆栈中应该保存有最后一次的函数调用地址,和一些变量的值,仔细分辨,0x08开头的就是函数调用地址,这是最后一次正确的函数调用地址。

你可以在这个函数处加一个断点,然后再单步调试,你就会发现是哪一句指令导致的HardFault。

使用特权

评论回复
9
xsq5360|  楼主 | 2010-11-12 10:52 | 只看该作者
谢谢vigia指点!!
你在最后提到断电调试,可是我现在的情况是一开始测试是正常的,经过一段时间后才发生该故障,如果我一开始设断点,程序仍是正常运行的,故障点就出不来了。

使用特权

评论回复
10
vigia| | 2010-11-12 11:01 | 只看该作者
首先,你仍然可以用我说的方法,把出问题的地方大致定位出来,然后仔细检查相关代码,运气好的话,你就能发现问题。

要是运气不好,就多加测试手段了,比如在相关地方通过I/O口输出波形,能进一步缩小问题范围,或者记录所有相关变量的值,特别是数组和指针变量的值,出了问题就去检查所有这些保存下来的数值是否有可疑的地方。调试办法很多,自己想想吧。

使用特权

评论回复
11
xsq5360|  楼主 | 2010-11-12 11:10 | 只看该作者
10# vigia
多谢vigia大侠指引!我试试。

使用特权

评论回复
12
xsq5360|  楼主 | 2010-11-12 16:51 | 只看该作者
按照香主和vigia大侠的思路进行调试,还是没发现故障点。
通过堆栈查看寄存器值。
1处:先前PC指针为0x08004471,这个地址好像有点奇怪,在汇编代码窗口中定位到该处代码,入口应该是0x08004470?
2处:先前LR寄存器值,定位到该处,汇编代码为MOVS r0,r0

堆栈内容4标注.JPG (182.52 KB )

堆栈内容4标注.JPG

使用特权

评论回复
13
aaa2742| | 2011-4-10 13:51 | 只看该作者
有没有按照cortex-m3权威指南上说的方法调试的,不过不知其所以然,还请大家指教之类问题

使用特权

评论回复
14
wsxiong| | 2015-5-7 11:40 | 只看该作者
https://bbs.21ic.com/icview-205081-1-1.html

你好 这个问题解决了么 我也碰到这个问题 请麻烦你指导指导

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

57

帖子

1

粉丝