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