一次“没有日志”的排查困境
先讲一个反面的案例。
某款便携式医疗设备,MCU 是 STM32L071,64KB Flash、20KB RAM,电池供电,要求待机电流低于 5μA。设备在客户现场偶尔会死机,概率很低,大概一个月一两次。客户重启之后就好了,但问题一直找不到根因。
我拿到这个项目时,问的第一个问题是:“有没有日志?”
回答是:“有,但是只能在调试串口上看。设备在现场,不可能接串口。”
第二个问题:“那设备死机之后,重启时有没有保留什么信息?”
回答是:“没有。我们试过写 Flash,但写一次要几十毫秒,而且会增加功耗,后来就去掉了。”
这就是问题所在。 一个在现场跑的设备,没有持久化日志,没有崩溃现场记录,出了问题只能靠猜。而日志系统本身,又因为“写 Flash 慢、功耗高”被砍掉了。
这个困境很典型:资源受限的系统里,日志系统往往被视为“奢侈品”,被第一个砍掉。但真出了问题,又最需要它。
这篇文章要解决的,就是这个问题。我会展示怎么设计一个在 64KB Flash、20KB RAM 的 MCU 上运行、不影响实时性、功耗可控、又能保留足够现场信息的日志系统。
核心是三个技术:环形缓冲区 + DMA + 低优先级日志任务。再加上一个关键的补充:崩溃现场的最小化保存。
一、日志系统的设计约束
资源受限系统的三个硬约束
在资源受限的 MCU 上设计日志系统,必须面对三个硬约束: