打印

请教:串口异常会引起hardware fault吗?

[复制链接]
4021|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bobo5650|  楼主 | 2011-7-26 11:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天调试串口通讯的时候,突然上位机的sscom就死掉了,同时目标板stm32程序也跑进死循环了(有些定时翻转的I/O不翻转了)。我在不需要处理的中断里都是做死循环处理的,所以我怀疑进了那里,但是现在没复现,不能确定。
我跑去问丁丁sscom会不会因为串口故障而死掉了,又来这里问一下,串口异常会让stm32进hard fault中断吗?
沙发
香水城| | 2011-7-26 11:56 | 只看该作者
有可能。

使用特权

评论回复
板凳
bobo5650|  楼主 | 2011-7-26 14:07 | 只看该作者
香主,有没有一个文档列出了哪些原因可能导致hard fault?或者发生了hard fault之后,怎么能查明原因?

使用特权

评论回复
地板
ploto| | 2011-7-26 14:46 | 只看该作者
会嘛?一般是代码访问了无效的地址吧。

使用特权

评论回复
5
香水城| | 2011-7-26 14:51 | 只看该作者
香主,有没有一个文档列出了哪些原因可能导致hard fault?或者发生了hard fault之后,怎么能查明原因?
bobo5650 发表于 2011-7-26 14:07


一般讲,只要你的程序访问了不该访问的地方,就会产生Hardfault,ARM的Cortex-M3手册中有相应的说明,但没有单一的说明文档。

查明原因的方法通常是在Hardfault处理程序中放置断点,然后再通过堆栈的调用关系倒查是哪里的程序操作越界。

使用特权

评论回复
6
香水城| | 2011-7-26 14:57 | 只看该作者
本帖最后由 香水城 于 2011-7-26 14:58 编辑

严格地说,你的问题不是因为串口异常引起了Hard fault,而是因为Hard fault导致了串口异常。而根本原因是程序错误。

你把因果关系搞反了。

使用特权

评论回复
7
desomond| | 2011-7-26 15:10 | 只看该作者
数组越界或者指针越界,内在泄漏....很多人都这么说,我碰到过好几次,也是从这方面找原因

使用特权

评论回复
8
handlike| | 2011-7-26 17:02 | 只看该作者
7楼的说法,楼主重视一下,数组或指针跑了。

使用特权

评论回复
9
bobo5650|  楼主 | 2011-7-26 18:15 | 只看该作者
其实我是还没有确定程序是不是真死在hard fault的isr里啦,只是怀疑;
之所以怀疑先是硬件故障,是因为通讯用的上位机程序也同时死了,没想明白怎么会同时死,如果只是stm32程序死,应该上位机那边不至于死,只是通不了而已。
昨天出现了一次,今天一直做了一整天都还没重现。测试方法跟昨天用的是一样的,都是往stm32每隔1s发同一个命令,昨天发了半个小时不到就死了,今天发了10多个小时还没死。板子上的程序也都还没刷新过,怕刷了之后问题不重现,结果居然还是不出现,真是郁闷了。
内存越界之类的问题也考虑过,但是目前走读代码暂时还是没有发现有越界的地方。现在想到的只能是一边尝试复现,一边再完整的走读一遍代码咯。

使用特权

评论回复
10
香水城| | 2011-7-26 18:27 | 只看该作者
LZ是否用了OS?如果使用了OS,则有可能很难重现错误。否则可以在硬件方面找找原因。

使用特权

评论回复
11
bobo5650|  楼主 | 2011-7-26 19:34 | 只看该作者
用了OS了。
现在想到的办法是先在所有可疑的死循环里面都往备份寄存器里写东西,然后reset,再用串口读出备份寄存器里的东西。
因为我不可能一直在debug模式下面跑,而且程序一旦进去了死循环,串口通讯也会没法做,只能试试reset之后串口能不能恢复,能恢复的话就还能给我留点痕迹下来,如果reset之后串口都还不能恢复,那我就不知道怎么办了,只能一直debug跑着等复现了?

使用特权

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

本版积分规则

4

主题

279

帖子

1

粉丝