可靠性与故障恢复
本文性质声明:本机无开发板,全部内容未实测,为手册级框架。站内对照:dbg-crash(崩溃现场与 minidump 的本机实测)、dbg-log(日志级别与缓冲成本的实测)、emb-bootloader-ota(双 Bank 与回滚)、linux-ns(PID 1 与容器信号)。
一、看门狗:分层,不是一条狗
看门狗的本质是”没人来喂我就重启”。单一窗口看门狗解决不了”程序在跑但逻辑死了”(死循环里喂狗)。分层设计:
| 层 | 喂狗条件 | 抓什么 |
|---|---|---|
| 硬件看门狗(IWDG) | 只有主循环的固定窗口喂 | 一切软件死了——死循环、hardfault、栈溢出 |
| 任务级软件看门狗 | 每个关键任务定期”签到”(置位 + 检查) | 某个任务卡死/饿死(其他任务还活着) |
| 应用级心跳 | 业务状态机的推进记录 | 逻辑跑飞(在转圈但没干活) |
三个设计点:
- 窗口看门狗(WWDT)比独立看门狗强:喂得太早也算错——防”失控代码疯狂喂狗”。
- 超时值 > 最坏情况的循环时间 × 安全系数:Flash 擦写、长中断处理都要算进去——看门狗误触发的系统比没有看门狗更糟(无故重启且无现场)。
- 复位原因要留档:备份寄存器/独立 RAM 存”上次是不是看门狗复位的”——上电第一件事读它、打日志、决定是否进安全模式(emb-devtools 的串口日志从这里开始有答案)。看门狗重启 N 次还起不来 = 进降级模式或停止重试告警,别无限重启刷日志。
二、故障注入与压力测试
“平时都好,现场出怪事”的解药是主动制造平时:
- 故障注入清单(逐个做,每个都是真实场景的预演):随机拔电(覆盖掉电安全,第三节);总线拔线/半插(emb-fieldbus 的错误帧、超时);传感器返回野值/不动(emb-adc 的滤波与状态机);通信对端不发/乱发/发一半;EEPROM/Flash 写坏一位(校验能否发现)。
- 压力测试:最大负载持续运行(温度 + 最高波特率 + 所有任务满载)——嵌入式系统的 bug 多数在边界相遇时出现(DMA 和中断抢同一总线、任务栈在深调用时溢出)。 soak test 跑 72 小时是量产前的常规体检。
- 可观测性是前提:没有日志和计数器的系统,故障注入只是”看它崩没崩”——每次注入要能回答”系统做了什么”:状态机进了哪个错误态、计数器跳了多少、哪条日志最后打了什么(第四节)。
注入的纪律:一次只注入一个故障——同时断两路看谁先崩,归因不了。注入后必须验证恢复路径(不只是”没崩”——拔线重插后通信恢复了吗?掉电重启后配置还在吗?)。
三、掉电安全:持久化三件套
掉电是嵌入式最诚实的故障——不给你重试机会。安全持久化的三件套:
- 原子写:一个逻辑写操作要么全落盘要么全没落。实现:写临时区 → 校验 → 翻标志位(双备份结构:A/B 两份 + 序号/CRC,写 B 时 A 保持完整——读的时候取 CRC 对且序号新的那份)。直接原地改结构体 = 掉电在写一半时得到撕裂数据。
- CRC 兜底:每条关键记录带 CRC——读时校验,坏了走恢复路径(备份区/默认值)。默认值也是设计项:配置全坏时系统要能带默认值起来并告警,不是躺平。
- 写频率与磨损:Flash 有擦写寿命(万级到十万级)。每次循环都写日志/计数到同一地址 = 几个月写穿——环形写、聚合后写、只写变化(本站 dbg-benchmark 量过”污染真正打击的是等待型与 IO 型测量”——写延迟对循环周期的影响要实测)。
掉电测试的做法:示波器监测电源轨,脚本控制继电器随机时刻断电,反复几百次,每次上电后跑一致性检查(对账:记录数、CRC、状态机连续性)——这是嵌入式唯一不能省的测试,也是第一节注入清单的第一项。
四、日志与现场取证
崩溃后”它为什么崩”的答案在掉电前最后留下的痕迹里。设计:
- 分级 + 环形缓冲:ERROR 必打,INFO 按编译开关;日志进 RAM 环形缓冲(本站 dbg-log 量过:级别短路放在格式化之前 0.2ns/行、之后 181.2ns,900 倍——先判级别再拼串)。
- 关键事件同步落盘:环形缓冲在掉电中丢了不可惜——状态跃迁、错误码、异常发生这几类必须立即写 Flash(受第三节的磨损约束,聚合写)。
- 崩溃快照:HardFault 的 handler 里,趁还有栈:把栈帧(R0-R3/R12/LR/PC/xPSR)、故障寄存器(CFSR/HFSR)、环形缓冲的尾部、写进备份 RAM/保留 Flash 区——下次启动第一件事 dump 到串口。本站 dbg-crash 在 Windows 侧量过同族设计:栈溢出 handler 里写 dump 的路线和坑(自救路线可能全失败——MCU 侧的备份 RAM 是更可靠的载体)。
- 崩溃计数器:上电自增一个”连续崩溃计数”,N 次内起不来就停止自动重启、锁在安全模式等人工介入——无限重启刷爆日志会把现场冲掉(第一节第 3 点)。
五、排障索引
| 症状 | 入口 |
|---|---|
| 现场设备周期性重启 | 看门狗误触发(超时值没覆盖最坏路径);读复位原因留档定位 |
| 跑几周后参数错乱 | 掉电写撕裂——上原子写 + CRC(第三节) |
| Flash 写几年后失效 | 磨损——环形写/聚合写(第三节) |
| 崩了不知道原因 | 崩溃快照没做(第四节);备份 RAM 的现场 dump |
| 重启后起不来 | 无限重启冲掉现场——连续崩溃计数 + 安全模式(第四节) |
| 故障注入总归因不了 | 一次注了多个(第二节纪律) |
六、未实测清单
- 本文所有可靠性机制——无开发板,未测。
- 掉电测试与写磨损的实际数字——未部署。
- 崩溃快照的汇编实现——未测(框架给足,Windows 侧实测见 dbg-crash)。
- 用户 Linux 开发机上的项目现场——该机不可达,未涉及。