
适用人群准备江波龙车规/消费存储岗被问写到一半断电了怎么办“数据怎么保证不丢不错只会答加个电容的同学。这是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 中途掉电 → 标志仍AA 完好无影响5.2 事务写Transactional Write把一组写操作当成一笔事务要么全成、要么全不成。实现上就是先写新、校验过、再切原子指针和 FTL 原子切换同构。begin_txn() 写数据到临时区 写元数据长度/版本/CRC commit_txn() ← 只有这里成功事务才对外可见 翻指针 abort_txn() ← 掉电/校验失败丢弃临时区旧版不变5.3 CRC / 校验和 / 元数据冗余每段数据存CRC检错读出时校验发现错就回滚到备份关键元数据长度、版本、地址存多份冗余防单点损坏。六、数据完整性错要能查、能纠手段层级作用ECCNAND 硬件/FTL比特翻转纠错见存储_02CRC应用/传输检测数据是否被改/损坏校验和元数据快速一致性检查冗余副本应用损坏可恢复ECC 纠翻转CRC 检撕裂/损坏备份防丢失——三者职责不同缺一不可。七、车规要求江波龙必提车规级AEC-Q100和工业级对掉电保护要求极严功能安全 ASIL存储错误不能导致系统危险行为数据保持力高温下存放 N 年不丢断电恢复上电后能自动回到一致状态不用人干预。江波龙的工规/车规存储产品面试时一定会问你怎么保证掉电不丢数据——把上面三层硬件 holdup / FTL 原子 / 应用双备份CRC讲出来就是满分答法。八、和你 OTA 的关系07_OTA的双 bank 标志位切换本质就是应用层双备份 原子切换固件 A 在跑写固件 B → 校验 BCRC/签名→ 翻标志指向 B中途掉电 → 标志仍指向 AA 完好设备正常启动这整套思想在存储_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。本站相关存储_03FTL 原子切换、07_固件升级与OTA双 bank、核心概念_07去耦电容、测试_09车规可靠性。下一篇存储_06_嵌入式文件系统——FATFS_LittleFS_UBIFS怎么选