中断里做耗时操作,CPU 卡死定位记
现象
设备偶尔整机卡死,串口无输出,看门狗也没软复位,只能断电重启。出现概率很低,一天一两次。
排查
先排除了内存越界和栈溢出,加日志定位到卡死前最后停在 UART 发送中断里。原来我在 UART 的 TX 发送完成中断里,直接调用了发送函数继续透传下一包数据,而这个透传又走了一遍调用链,层层嵌套,中断里执行时间远超预期,最终优先级更高的定时中断一直被打断不到,系统就”僵”在这里了。
根因
中断服务函数里做了耗时的、会再次触发中断的操作,破坏了中断优先级和嵌套时的实时性。
解决
把中断里要干的事压缩到最小——只置标志位,把真正的数据处理放到主循环或者低优先级的任务里处理。改完后跑了三天没再卡死。
> 教训:中断函数里只做「记账」,不做事。