打印

难搞的hardfault

[复制链接]
2955|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyj8848|  楼主 | 2023-3-12 19:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创# #GD-FAQ#

问题:
该问题由某客户提出,发生在GD32F470上。根据客户工程师描述:在某产品上使用了GD32F470,在软件调试过程中,进行软复位,会概率性进入hardfault。在程序运行过程中,CAN通讯会中断,怀疑也是进入了hardfault。已经排查半月,没有定位到原因。在F450上跑差不多的程序不会发生这样的情况,怀疑是芯片差异问题。

问题分析:
现场观察工程师演示,确实能复现问题,调试模式下软件复位若干次,会进入hardfault。程序运行时,CAN通讯中断,使用Jcommander工具读取PC指针,程序停在hardfault中断。
检查硬件设计
1.    电源电路设计合理,VDD、VDDA、VBAT同源,有0.1uF和10uF退耦电容,VSS均与电源地相连。
2.    使用示波器实测运行时的电源,电源稳定。
检查软件设计:
1.    尝试增加栈的大小,问题并未解决。
2.    根据发送异常前的压栈数据,判断进入hardfault前的程序地址。结果发现进入异常前的PC指针有随机性。因此此方法也无法定位到问题所在。
3.    客户使用了OSEK实时操作系统,在每个中断,任务以及任务函数的进出口进入标志位。想找到进入hardfault前,程序运行到哪里。最后定位到在任务切换时进入的hardfault。
4.    将客户的程序进行裁剪,最终只剩下操作系统,问题还是会复现,那基本定位是因为操作系统的原因导致进入了hardfault。
5.    对裁剪后的代码进行检查,发现客户没有对PSP指针进行初始化。在启动代码中加入对PSP指针的初始化,重新测试,未发生进入hardfaullt的现象。

结论:
导致客户程序一直进入hardfault的原因就是PSP指针未进行初始化。因为客户使用了操作系统,需要切换PSP指向不同的任务栈,需要在OS初始化时初始化PSP指针,避免PSP指针指向非法地址导致程序进入hardfault。

处理:
如下图所示,在启动文件中,加入了PSP指针的初始化。
其他有关hardfault的解决方法可以参考以下应用文档:
https://www.gd32mcu.com/cn/download?kw=hard&lan=cn

使用特权

评论回复
沙发
地瓜patch| | 2023-3-12 22:05 | 只看该作者
这个厉害了!也经常遇到hardfault

使用特权

评论回复
板凳
zzele| | 2023-3-13 08:34 | 只看该作者
偶尔发生代码指针跑飞导致异常复位进入hardfault

使用特权

评论回复
地板
gaoyang9992006| | 2023-3-13 09:28 | 只看该作者
硬件配置错误会发生这个事情。

使用特权

评论回复
5
liaojihua2010| | 2023-3-13 14:25 | 只看该作者
能帮助解决实际问题,必须点赞

使用特权

评论回复
6
icecut| | 2023-3-13 17:54 | 只看该作者
这个是个例. 初学者都会遇到并且手足无措.
实际上很简单, 读一下错误堆栈, 去map文件里找,哪个文件报错的. 很容易发现问题.

硬错误不是火灾,不会破坏现场, 只是一个陷阱. 告诉程序员必须要处理了. 所有现场都在呢

使用特权

评论回复
7
cainiao518| | 2023-3-13 18:04 | 只看该作者
出现最多的好像是数组越界访问

使用特权

评论回复
8
莲子荷花| | 2023-3-17 15:27 | 只看该作者
这都找出来,厉害啊

使用特权

评论回复
9
AProgrammer| | 2023-12-20 11:20 | 只看该作者
值得学习。很NB的问题原因看起来还简单,但难搞!

使用特权

评论回复
10
18637690601| | 2023-12-20 13:58 | 只看该作者
你需要一个这个 CmBacktrace

使用特权

评论回复
11
药无尘| | 2024-1-30 22:36 | 只看该作者
正好需要,这个很有帮助,感谢大佬

使用特权

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

本版积分规则

5

主题

7

帖子

3

粉丝