HardFault_Handler处理Bug

出现HardFault的原因

HardFault 的本质是 "内核执行过程中检测到异常状态",具体原因多与非法操作相关,常见场景包括:

内存访问错误

  • 访问空指针 (如int *p = NULL; *p = 10;):试图读写地址0x00000000及附近的无效内存。
  • 数组 / 缓冲区越界访问 (如定义int arr[5];却访问arr[10]):读写超出内存范围的地址。
  • 访问未对齐的内存(部分 Cortex-M 内核不支持非对齐访问,如 32 位数据存在奇地址)。

执行非法指令

  • 调用无效的函数指针 (如指针未初始化或指向错误地址,void (*p)(void) = 0x12345678; p();)。
  • 程序代码被意外篡改(如栈溢出覆盖了代码区,导致执行错误指令)。
  • 运行了内核不支持的指令(如 Cortex-M0 不支持某些 Cortex-M3 的指令)。

总线错误

  • 访问不存在的外设地址(如错误配置外设寄存器地址,读写了芯片物理上不存在的地址)。
  • 外设访问冲突(如同时通过 DMA 和 CPU 读写同一外设,导致总线访问异常)。

栈溢出或栈损坏

  • 函数递归过深、局部变量过大,导致栈空间耗尽,进而覆盖了栈外的关键数据(如函数返回地址),内核执行返回时获取到错误地址,触发 HardFault。

除数为零(部分配置下)

  • 虽然 Cortex-M 内核默认允许整数除法为零(结果不确定),但某些编译器配置或库函数可能将其视为错误,间接触发 HardFault。

如何使用HardFault去排查Bug

HardFault发生时,硬件会自动把一些寄存器值推入栈,我们可以根据栈中保留的数值还原"犯罪现场"

重点关注LR和PC寄存器.

如果LR寄存器的0xFFFFFFF9,则去查看MSP的地址。然后在MSP地址向下数6个的long地址。0x08开头的就是发生错误的程序地址。

日后功力深厚了再更新。

相关推荐
sg_knight17 小时前
Bug 定位实战:把报错丢给 Codex,它是怎么修的
chatgpt·llm·bug·openai·agent·ai编程·codex
8年车载测试2 天前
汽车五大域详解:动力、底盘、车身、座舱与智驾域
汽车·bug·jira·uds诊断·ecu刷写测试·canoe工具
ะัี潪ิื4 天前
Redisson Bug回顾
bug
猫咪很可爱5 天前
MySQL 5.7 备份恢复后函数与存储过程丢失:原因分析与正确备份姿势
数据库·mysql·bug·shell
李永奉6 天前
杰理可视化SDK开发-【BUG】AC7006F8芯片开启一拖二和双麦DNS通话算法后,大概率通话时蓝牙自动断连,RAM空间爆了问题处理
单片机·嵌入式硬件·mcu·物联网·电脑·bug
8年车载测试8 天前
车载测试中如何通过 Jira 平台提交 Bug:操作步骤与关键要点
bug·jira·uds诊断·hil测试·uds自动化测试·ecu刷写测试·canoe工具
硅基手札9 天前
SPI技术系列 13 · SPI 调试与排查
linux·运维·stm32·单片机·嵌入式硬件·bug
李永奉9 天前
杰理可视化SDK开发-【BUG】AC7006F8芯片开启一拖二和双麦通话语音算法后,设置触摸音在唤醒语音助手和通话时触摸音没作用问题
单片机·嵌入式硬件·mcu·物联网·电脑·bug
kyle~11 天前
机器人通信 --- FANUC TCP 并发请求-响应错位 Bug 复盘
tcp/ip·机器人·bug
鬼手点金13 天前
Harness 工程:模型之外的竞争力
服务器·人工智能·深度学习·机器学习·bug