1.问题原因:
在初始化时,调用 vTaskDelay,在此之前并未启用任务调度器vTaskStartScheduler
2.解决方案
将需要延迟的部分加到启用任务调度器之后
3.解决流程
1.在HardFault_Handler 打断点

2.查看寄存器和错误信息
在错误输出窗口查看PC值

3.定位问题代码,打断点
此处两种方式定位
方式1.根据Call Stack定位代码行,直PendSV_Hander+0x3d]
定位的位置时汇编文件,查询得知这部分位于xPortPendSVHandler是任务切换用的.

方式2.在Disassembyl输入PC的值

4.关闭任务,定位哪个任务出的问题
最后单步调试发现vTaskDelay,之后就跑飞了,进入vTaskDelay,继续定位

最终找到下列代码,查询得知,由于任务调度器未启用,导致任务切换出现错误,程序跑飞

4.总结
为什么寄存器窗口的PC、LR和Fault信息显示窗内内的PC 、LR不同?


寄存器窗口的PC/LR是异常处理时的实时值,Fault工具显示的是触发异常前硬件自动压栈的原始值,差异由异常入口流程导致:
-
PC差异
- 寄存器PC(0x080031FE):当前执行的异常处理函数地址(如
HardFault_Handler)。 - Fault PC(0x0800206e):触发异常的指令地址,位于栈中
SP+0x18(0x200075A8+0x18=0x200075C0),。
- 寄存器PC(0x080031FE):当前执行的异常处理函数地址(如
-
LR差异
- 寄存器LR(0xFFFFFFF1):异常模式标识码(表示使用MSP且从线程模式进入异常)。
- Fault LR(0x080007D3):异常发生时的返回地址,位于栈中
SP+0x14(0x200075A8+0x14=0x200075BC)
所以直接用 Fault窗口内的PC 即可
3085

被折叠的 条评论
为什么被折叠?



