2026-07-14.md 1.1 KB

2026-07-14 工作日志

tidle0 线程崩溃根因分析与修复

问题现象

  • 设备运行过程中频繁重启,日志记录多次 "线程错误:tidle0" 导致 IWDG 复位
  • 07/08 发生大规模 boot loop(约 115 次循环重启,间隔 ~30s)
  • LR 值: 0x08021DC1(3次), 0x08021501, 0x08021521, 0x08021581

根因分析

  1. IDLE_THREAD_STACK_SIZE = 256 过小: RT_DEBUG + RT_USING_HEAP + RT_USING_IDLE_HOOK 同时启用,256 字节栈在 RT_DEBUG_NOT_IN_INTERRUPT 调用链中极易溢出
  2. HardFault 处理器 while(1) 死循环: cpuport.c:431 无异常钩子,默认 while(1) 导致系统挂起,syswatch 无法运行喂狗,IWDG 超时复位
  3. IWDG 配置: Prescaler=256, Reload=0xFFF, LSI=32kHz → 超时 32.768s,对应 ~30s 重启周期
  4. LR 地址映射: 全部指向 rt_thread_idle_excute (idle.c) 或 rt_interrupt_get_nest (irq.o)

修复内容

  1. rtconfig.h: IDLE_THREAD_STACK_SIZE 256 → 1024
  2. cpuport.c: ecode 详情增加 PC 值记录; while(1) 改为忙等待 + rt_hw_cpu_reset()
  3. 建议后续检查 ISR enter/leave 平衡性,排查内存破坏源