学习笔记 · Obsidian

NVS、OTA 和恢复:让设备能够长期运行

ESP-IDFC / C++

NVS 先从一个配置开始

NVS 用于保存小型键值数据。第一轮保存“采样周期”即可:读取时验证范围和配置版本,缺失时使用明确默认值;更改后检查写入与 nvs_commit 结果,最后通过重启验证持久化。ESP-IDF NVS

不要每次采样都写一次 Flash。把“当前读数”和“需要长期保存的配置”分开;相同配置无需反复写入。NVS 有磨损均衡,也仍需合理控制写入频率。

初始化失败时先分类原因和恢复影响。直接擦除整个 NVS 会丢失保存内容,不应作为任何异常都执行的常规逻辑。多个键也不能未经验证就当作一笔数据库事务;相关配置可设计版本化记录和恢复策略。

OTA 先设计失败如何启动

应用 OTA 通常需要至少两个应用槽位和 OTA data 分区:把新固件写到非当前启动槽,校验后切换下一次启动目标。启用回滚机制后,新固件首次运行需要完成自检并确认有效,否则可回退。ESP-IDF OTA

下载候选版本 → 校验 → 写入备用槽 → 切换并重启
                                           ↓
                                    首次启动自检
                                     ↙         ↘
                                确认有效       回滚

“下载成功”不是升级完成。分区配置、镜像尺寸、启动验证、配置兼容和设备恢复,都属于一次升级。

本项目建议的升级验收

  1. 检查镜像与实际型号、Flash 分区布局匹配,升级来源可信。
  2. 升级前记录旧固件版本和配置版本。
  3. 新固件启动后检查必要外设、主循环/任务和配置读取;不要把临时云端故障无条件作为固件失效依据。
  4. 在受控实验中验证下载中断、校验失败、新固件自检失败及回滚。
  5. 确认回滚后的旧固件还能读取配置,或存在兼容读取/迁移策略。

上述是本课程的实验设计,并未在设备执行。固件签名、Secure Boot、Flash/NVS 加密在产品化阶段结合具体威胁和供应流程设计;本轮不进行 eFuse 等不可逆配置。

最少的可观察信息

信息用来判断什么
固件版本、启动原因、运行时长设备是否反复重启
配置版本、当前采样周期命令是否真正生效
最近成功采样时间、错误码旧读数是否已失效
网络状态、最近重连原因故障在哪一层
空闲内存最低值、队列溢出计数是否存在资源压力
OTA 阶段与结果是否完成或需要恢复

日志记录可定位问题的摘要,不记录凭据和完整认证材料。实验结论保留脱敏的关键结果,不把整段串口日志复制到 Vault。

过关标准:断电、断网、错误配置和坏版本都有清楚的恢复结果;如果还没做故障演练,状态保持“待实机验证”。


返回学习入口 · 来源与版本