zyj8848 发表于 2023-3-12 19:56

难搞的hardfault

#申请原创# #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

硬件配置错误会发生这个事情。

liaojihua2010 发表于 2023-3-13 14:25

能帮助解决实际问题,必须点赞

icecut 发表于 2023-3-13 17:54

这个是个例. 初学者都会遇到并且手足无措.
实际上很简单, 读一下错误堆栈, 去map文件里找,哪个文件报错的. 很容易发现问题.

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

cainiao518 发表于 2023-3-13 18:04

出现最多的好像是数组越界访问

莲子荷花 发表于 2023-3-17 15:27

这都找出来,厉害啊

AProgrammer 发表于 2023-12-20 11:20

值得学习。很NB的问题原因看起来还简单,但难搞!

18637690601 发表于 2023-12-20 13:58

你需要一个这个 CmBacktrace

药无尘 发表于 2024-1-30 22:36

正好需要,这个很有帮助,感谢大佬
页: [1]
查看完整版本: 难搞的hardfault