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