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指针排查
  • 首先在网上查了下解决方案,有说增加线程栈空间的,然后将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,源代码经过验证不会有问题,多从应用层方面找原因
  • 最后是出现问题按照启动流程进行断点调试,定位可以更精准一些,不必在汇编中绕来绕去,以免耽误几个小时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值