请直接帮我定位并修复当前 Cortex-M 工程偶发 HardFault 后自动复位的问题。
你可以检查和修改工程代码,执行构建、烧录和调试;必须以与目标板上固件完全匹配的 ELF、Fault 状态寄存器和保存的异常栈帧为依据。不要猜测寄存器值、PC 地址、调用栈或根因;无法复现时请保留现场记录能力,并明确下一轮需要采集的证据。
目标 MCU:STM32F4 系列 Cortex-M4。
当前行为:设备在高负载通信和传感器采集同时进行时,偶发停止响应并由看门狗或系统复位恢复。启动日志只显示“reset”,未保留 Fault 信息。
工程包含 HardFault_Handler;若存在 MemManage、BusFault、UsageFault 处理函数,请检查其启用状态和现有实现。以项目中的启动文件、链接脚本、系统时钟和实际构建配置为准。
- 找到异常向量表、HardFault_Handler、系统复位/看门狗处理、断言、日志和链接脚本相关代码;确认是否启用了 MemManage、BusFault、UsageFault,并说明其对根因定位的影响;
- 实现或修复最小的异常现场保存:记录 SCB->CFSR、HFSR、DFSR、AFSR、MMFAR、BFAR、SHCSR、ICSR、控制寄存器,以及异常入栈的 R0-R3、R12、LR、PC、xPSR;记录时不得依赖动态内存、阻塞锁或可能失效的外设;
- 正确区分 MSP/PSP,依据 EXC_RETURN 选择异常栈帧;若 FPU 扩展栈帧可能存在,明确处理方式或记录其限制;
- 将现场放到不会被启动流程立即覆盖的 RAM 保留区或项目既有的持久化诊断区,并在下次启动时以限频日志输出版本标识、复位原因和现场摘要;
- 使用与板上二进制严格匹配的 ELF 配置 probe-rs 调试。对于可稳定复现的问题,在可疑边界设置少量断点;发生异常后暂停并读取真实 Fault 寄存器与堆栈,不要用不匹配 ELF 解析符号;
- 用 addr2line、调试器或等价的符号解析方式将真实 PC/LR 映射到源文件与行号,同时检查对应函数的边界、指针、数组、栈使用和中断上下文限制;
- 将可证实根因与待验证假设分开,实施最小修复,保留不会影响正常运行的诊断能力;
- 重新构建、烧录并复测至少 30 分钟的高负载场景,记录 Fault 次数、看门狗复位次数和诊断记录完整性。
验收标准:每次异常均可保留可解析的真实现场;若定位到根因,修复后高负载测试中不再发生该 Fault;若未复现,也需交付已验证的 ELF/现场保存链路、当前排除项和下一次异常可直接使用的证据。