NvM 块管理策略深入 Q1:Redundant 块怎么判断「哪一份是好的」?NvM 用什么机制判断数据完整性?

原始 Flomo:https://v.flomoapp.com/mine/?memo_id=MjU1MjU1NTgw

NvM 块管理策略深入 Q1:Redundant 块怎么判断「哪一份是好的」?NvM 用什么机制判断数据完整性?

NvM 判断完整性主要靠 CRC 校验 + Block 状态标记(可能加序列号)。

机制:

  1. CRC / 校验:每个 NvM Block 存储时附带 CRC(NvM 的 Block 配置可开 CRC),写入时算 CRC、读时校验。

  2. Redundant 双副本读写:

    • 写入:把数据写两份(主副本 + 冗余副本)。
    • 读取:NvM 先校验主副本的 CRC——通过就返回;失败则尝试冗余副本。若两份都失败,判定块损坏,NvM 走默认值 / 恢复逻辑(如回写默认值、触发 DET / DEM 记录)。
  3. Block 状态 / 序列号:

    • Block 附带状态标记(如 BLOCK_STATE)和可能的序列号 / 计数器,防止读到旧数据(用来区分哪份是最新、哪份是有效)。

所以「哪一份是好」的判定流程:CRC 校验优先,主副本失败切冗余副本,双失败视为坏块(用默认值 / 恢复)。

补充:NvM 还依 MemIf / Fee 保证底层数据一致性(掉电时 Block 完整性);NvM 的 CRC 是针对「NvM 数据块 + 冗余副本」级别,不是底层 Flash 校验。

上一题:https://v.flomoapp.com/mine/?memo_id=MjU1MjU1NTEz
总表:https://v.flomoapp.com/mine/?memo_id=MjMxMTQ2NDk4

AUTOSAR

机制边界补充

冗余块的有效性判断应以所用 AUTOSAR NvM 版本及 Fee/Ea 实现为准。不能把“块状态/序列号比较”当作所有 NvM Redundant Block 的通用机制;典型实现会结合两个副本的可用状态、NvM 配置的 CRC 校验和底层存储作业结果决定读取/恢复行为。

还需区分:

  • NvM CRC 用于检测数据块内容损坏,不等于密码学认证,不能防恶意篡改。
  • Fee 的写入一致性、垃圾回收和掉电恢复属于底层实现,不能仅凭 NvM Redundant 配置推断 Flash 在任意掉电时刻都绝对原子。
  • 两份副本都不可用时,是否使用 ROM 默认值、RAM 初始值、回调恢复或报告错误,取决于块配置和应用策略。

验证方法: 对主副本/冗余副本分别注入 CRC 错误、模拟写入中断和底层作业失败,观察 NvM 请求结果、错误状态、恢复值与 Dem/DET 报告。