1、发现出现hardfault,
2、按照网上的方法确认LR位置的返回值0xFFFFFFFD ,并查看psp位置
3、打开memory 查看此地址0x20002ED8 ,打开一看全是零 ,一脸懵逼,
4、查看call stack + local 右键查看 show caller code 发现是 Cannot access Memory (@ 0xfffffffc, Read, Acc Size: 4 Byte) 访问不该访问的地址;
5、后续查找出错的地方 BSP_OS_TimeDly(100 * TickMsNum ); //100ms 死在延时函数中,
继续跟进发现到此函数CPU_INT_EN()后,就会进入hardfault,后续翻阅别的修改记录
说
pendsv优先级有问题,继续跟进发现自己的设置没问题,至此思路完全没有,
6、回归问题本身 Cannot access Memory (@ 0xfffffffc, Read, Acc Size: 4 Byte)就是说还是访问不允许访问的地址才出现的错误,即、只是恰好在这个函数时用到了那个地址导致问题发生,数据本省已经被更改,只是在BSP_OS_TimeDly函数中刚好用到了那个flash数据导致出现hardfault;
7、联系代码上下文,看看有没有修改地址的地方,找到了有个memset清零操作,其中有个宏定义在移植代码过程中未修改导致一部分flash地址数据被更换,用到此地址数据时才出现hardfault;修改宏(清零操作的大小)的范围,至此问题解决。
8、只能说出问题的时候,还是要找代码上下文,特别时敏感操作;
记录此过程,后续查hardfault问题时使用;