适用人群:准备江波龙车规/消费存储岗,被问"写到一半断电了怎么办"“数据怎么保证不丢不错"只会答"加个电容"的同学。这是
17_存储专栏第五篇,车规(AEC-Q100)必考点。
读完你能得到:
① 为什么掉电是存储头号敌人(半截数据比没写更糟);
② 三个层次的保护:应用层双备份、FTL 层原子切换、硬件层 holdup 电容;
③ 事务写(transactional write)怎么"要么全成要么全不成”;
④ 数据完整性手段:CRC/ECC/校验和/元数据冗余;
⑤ 和你07_OTA双 bank 的关系。
一、为什么掉电是头号敌人
普通 bug 顶多程序崩,重启还能恢复。但存储写到一半掉电是另一回事:
要写 10 个配置项,写到第 5 个断电: 结果 = 前 5 个新值 + 后 5 个旧值(撕裂状态) 或更糟:某个扇区被擦了一半,整个块数据损坏半截数据往往比"没写"更危险——系统以为写成功了,实际是撕裂的不一致状态。所以掉电保护的目标不是"绝不丢",而是"要么旧版完整、要么新版完整,绝没有半成品"。
二、三层防御
| 层次 | 手段 | 解决 |
|---|---|---|
| 硬件层 | holdup 电容 + 电压检测(PVD) | 掉电后撑住、提前报警 |
| FTL 层 | 原子切换、映射表持久化 | 翻指针前回滚(见存储_03) |
| 应用层 | 双备份、CRC 校验、事务写 | 数据撕裂可检测可恢复 |
三层各管一段,组合才稳。
三、硬件层:holdup 电容 + PVD
思路:电源掉电不是瞬间 0V,有个跌落过程。在电源入口并一颗大电容(holdup cap),掉电后电容还能撑几毫秒到几十毫秒,够 firmware 把正在写的页写完、把映射表刷下去。
VCC ──┬── MCU / Flash │ [C_holdup] ← 掉电后放电,维持电压给"收尾"用 │ GND同时用PVD(可编程电压检测器)监控电压,低于阈值立刻进中断:
voidPVD_IRQHandler(void){/* 电压快掉到最低工作电压以下了 */emergency_flush_mapping_table();// 立刻把 FTL 映射表刷进 NANDfinish_current_write();// 把当前页补完/* 然后就任由电容放电,系统安全停下 */}呼应
核心概念_07的去耦电容——只不过那是"稳压小药丸",holdup 电容是"掉电续命大电池",目的不同。
四、FTL 层:原子切换(详见存储_03)
核心一句话:改数据时先写新版本,最后一步翻指针才生效。
旧数据在 A,要更新: 1. 写新数据到 B 2. 写新映射表(指向 B)到临时区 3. 翻"指向新映射"的指针 ← 原子操作,掉电只可能发生在翻之前或之后 翻之前掉电 → 回滚到 A(旧版完整) 翻之后掉电 → 新版本已生效 没有"半个 B"状态映射表本身也要定期持久化到 NAND 专用区,否则掉电后表丢了,数据虽然还在但找不到。
五、应用层:双备份 + 事务写
5.1 双备份(A/B 镜像)
你07_OTA的双 bank 思想直接用在这里:重要数据存两份(A、B),写时先写"非当前"那份,写完翻标志位选它。任何时刻至少有一份完整可用。
当前用 A。要更新: 写 B(新数据) 校验 B 的 CRC 通过 → 翻转标志:当前=B 若写 B 中途掉电 → 标志仍=A,A 完好,无影响5.2 事务写(Transactional Write)
把"一组写操作"当成一笔事务:要么全成、要么全不成。实现上就是"先写新、校验过、再切原子指针",和 FTL 原子切换同构。
begin_txn() 写数据到临时区 写元数据(长度/版本/CRC) commit_txn() ← 只有这里成功,事务才对外可见 翻指针 abort_txn() ← 掉电/校验失败,丢弃临时区,旧版不变5.3 CRC / 校验和 / 元数据冗余
- 每段数据存CRC(检错),读出时校验,发现错就回滚到备份;
- 关键元数据(长度、版本、地址)存多份冗余,防单点损坏。
六、数据完整性:错要能查、能纠
| 手段 | 层级 | 作用 |
|---|---|---|
| ECC | NAND 硬件/FTL | 比特翻转纠错(见存储_02) |
| CRC | 应用/传输 | 检测数据是否被改/损坏 |
| 校验和 | 元数据 | 快速一致性检查 |
| 冗余副本 | 应用 | 损坏可恢复 |
ECC 纠"翻转",CRC 检"撕裂/损坏",备份防"丢失"——三者职责不同,缺一不可。
七、车规要求(江波龙必提)
车规级(AEC-Q100)和工业级对掉电保护要求极严:
- 功能安全 ASIL:存储错误不能导致系统危险行为;
- 数据保持力:高温下存放 N 年不丢;
- 断电恢复:上电后能自动回到一致状态,不用人干预。
江波龙的工规/车规存储产品,面试时一定会问"你怎么保证掉电不丢数据"——把上面三层(硬件 holdup / FTL 原子 / 应用双备份+CRC)讲出来,就是满分答法。
八、和你 OTA 的关系
07_OTA的双 bank + 标志位切换,本质就是"应用层双备份 + 原子切换":
- 固件 A 在跑,写固件 B → 校验 B(CRC/签名)→ 翻标志指向 B;
- 中途掉电 → 标志仍指向 A,A 完好,设备正常启动;
- 这整套思想在
存储_05里被泛化成"任何关键数据的掉电安全写法"。
所以你之前的 OTA 知识,到这篇就升级成了"通用掉电安全存储"的方法论——面试时把 OTA 当例子讲,考官会觉得你真懂。
九、面试速答
考官:写到一半断电怎么办?
你:分三层。硬件上用 holdup 电容+PVD,掉电后撑住几毫秒把当前页和映射表写完;FTL 层用原子切换,先写新数据再翻指针,翻之前回滚旧版;应用层重要数据双备份+CRC,写新校验过再切。保证要么旧版完整、要么新版完整,没有半成品。
考官:ECC 和 CRC 区别?
你:ECC 在 NAND 层纠正比特翻转(静默损坏),CRC 在应用/传输层检测数据是否被改或撕裂,两者职责不同——ECC 纠错、CRC 检错、备份防丢。
十、总结
| 要点 | 内容 |
|---|---|
| 掉电危害 | 半截数据比没写更糟(撕裂状态) |
| 硬件层 | holdup 电容 + PVD 提前报警收尾 |
| FTL 层 | 先写新、翻指针才生效(原子切换) |
| 应用层 | 双备份 A/B + CRC + 事务写 |
| 完整性 | ECC 纠翻转、CRC 检损坏、备份防丢 |
| 车规 | AEC-Q100 / ASIL,掉电必恢复 |
一句话总结:掉电保护是"硬件撑住(holdup 电容)+ FTL 原子切换 + 应用双备份 CRC"三层合力,目标只有一个——要么旧版完整、要么新版完整,绝不留半成品,车规产品更是硬指标。
holdup 电容取值、PVD 阈值、CRC 多项式都以具体器件和车规等级为准。本文是掉电保护方法论,原子切换细节见
存储_03FTL,双备份实例见07_固件升级与OTA。
本站相关:存储_03(FTL 原子切换)、07_固件升级与OTA(双 bank)、核心概念_07(去耦电容)、测试_09(车规可靠性)。
下一篇:存储_06_嵌入式文件系统——FATFS_LittleFS_UBIFS怎么选