这不是“多写一次CRC”就能完全解决的问题,还关系到擦除单位、更新顺序和提交标记。
核心判断可靠保存参数的关键不是“写成功就算完成”,而是保证掉电后能选出一份完整、可验证的旧版本或新版本。
0101 / 为什么会出现半写入
多数嵌入式Flash存在最小编程单位和扇区/页擦除单位,更新参数可能涉及先擦除再写入;掉电发生在其中任一时刻,数据或元数据都可能处于中间状态。不能假定一次写入过程具备数据库式的原子性。
0202 / 一个可落地的双槽方案
准备A/B两份记录,各含magic、格式版本、递增序号、长度、数据、CRC及有效提交标志。先在非当前有效槽写入新数据和校验值,读回验证后再完成提交标记;启动时只在校验通过的有效记录中选最新版本。标记写法必须符合目标Flash的1→0编程约束。
0303 / 注意擦写寿命
如果参数每秒更新一次,不能只看“单次保存”是否正确;还需计算扇区耐久次数、写入频次和温度条件,必要时做轮换日志或磨损均衡,并设置写操作触发策略。
0404 / 面试参考回答
“我会先查芯片手册的擦除/写入粒度、供电下限和掉电行为,再设计双槽或追加日志;通过序号+CRC+提交标识选择最后一次完整记录,最后用任意相位断电试验覆盖关键写入窗口。”
CRC只能发现数据损坏,不能独自保证“写操作原子提交”。
追问如果写到有效标志的瞬间掉电,怎样确保不会把半写数据误判为有效?

扫码关注






























