软件由GD32F303RET6移植到GD32F303ZGT6上,由64pin改为100pin,软件基于rtthread4.0.5
底层驱动均已相应优化,startup.s文件也由hd替换为了xd。
根据rtthread BSP移植说明,同时将sct文件rom和ram空间进行更改,同时对board.c文件ram空间进行更改。
然后系统报错如下usage fault
以下提供一下排查解决问题思路
1、PC及LR指针排查
- 首先在网上查了下解决方案,有说增加线程栈空间的,然后将rtconfig.h里面几个栈加大,未果
- 在dis文件以及单步调试过程看了下这两个指针,基本指向main函数,然后准备单步调试
2、单步调试
跟踪到如下函数
结果按如下步骤单步调试分别运行1、2,到了2返回后就出现卡死现象
然而查看该段汇编代码结合rtthread启动流程,该步应该直接进入main_thread_entry,查看main_thread_entry线程栈,其进行了正常初始化
所以正常流程应该是先关闭中断挂起pendsv,再开启1中中断时应该正常运行图3 pendsv中断内容
继续查找pendsv处理流程,打断点发现可以正常进入,因此有时涉及到汇编时不能完全相信单步调试,要结合断点来使用
这里能正常进那就直接看main_thread_entry,然后挨个排查自动初始化流程
最终发现罪魁祸首,图示运行完返回就进hardfault,错误可复现,malloc应该是发生践踏直接进了hardfault,将其注释掉正常启动,本次排查完毕
3、复盘
- 首先是换了芯片,ram、rom空间这些要相应改到
- 其次是要相信rtos,源代码经过验证不会有问题,多从应用层方面找原因
- 最后是出现问题按照启动流程进行断点调试,定位可以更精准一些,不必在汇编中绕来绕去,以免耽误几个小时