HardFault_Handler 处理笔记

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工具显示的是触发异常前硬件自动压栈的原始值,差异由异常入口流程导致:

  1. PC差异

    • 寄存器PC(0x080031FE):当前执行的异常处理函数地址(如HardFault_Handler)。
    • Fault PC(0x0800206e):触发异常的指令地址,位于栈中SP+0x180x200075A8+0x18=0x200075C0),。
  2. LR差异

    • 寄存器LR(0xFFFFFFF1):异常模式标识码(表示使用MSP且从线程模式进入异常)。
    • Fault LR(0x080007D3):异常发生时的返回地址,位于栈中SP+0x140x200075A8+0x14=0x200075BC

所以直接用 Fault窗口内的PC 即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值