# NVRAM 管理器规范 > **文档标题**: Specification of NVRAM Manager > **AUTOSAR CP Release**: 4.4.0 > **文档编号**: 033 > **文档类型**: SWS (Software Specification) --- ## 文档标识 | 项目 | 内容 | |------|------| | Document Title | Specification of NVRAM Manager | | Document Owner | AUTOSAR | | Document Responsibility | AUTOSAR | | Document Identification No | 033 | | Document Status | Final | | Part of AUTOSAR Standard | Classic Platform | | Part of Standard Release | 4.4.0 | --- ## 文档变更历史 | 日期 | 版本 | 变更者 | 变更描述 | |------|------|--------|----------| | 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 移除 NvM_GetActiveService API;完全移除 EcuMfixed;变更单/多块回调 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 写保护和擦除请求对 NvMWriteBlockOnce 块的更正;数据集块隐式恢复的澄清 | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 新增 NvM_FirstInitAll 和 NvM_GetActiveService 功能;NvM_SetRamBlockStatus 也适用于显式同步块;澄清 NvM 与 BswM 之间的交互 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 澄清恢复块默认数据和处理 MEMIF_BLOCK_INVALID 作业结果的行为;增加块状态相关附加信息(章节 7.2.2.14 及相关子章节);更新 NvM_Init 和 NvM_ValidateAll 函数原型;调试支持标记为过时 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 详细的生产错误通过/失败条件;增加 NvM_ValidateAll 功能;更新 Init 和 SingleBlock 回调的返回值 | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 移除显式同步在配置的重试次数后失败时的作业延后;更新服务接口表;重命名配置参数 NvMRamBlockHeaderInclude 为 NvMBlockHeaderInclude | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 增加 NvMRamBlockHeaderInclude 和 NvMMainFunctionPeriod 配置参数;修复 NvMWriteVerificationDataSize 和 NvMNvramBlockIdentifier 参数的错误 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 增加 NvM_ReadPRAMBlock、NvM_WritePRAMBlock 和 NvM_RestorePRAMBlockDefaults API;生产错误和扩展生产错误分类;显式同步机制澄清;服务建模:引入服务接口的形式化描述 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | 增加 NvM_CancelJobs 行为;增加 NvM 和 BswM 交互;增加 NvM_SetBlockLockStatus API 功能描述 | | 2010-09-30 | 3.1.5 | AUTOSAR Administration | 指定防止关机期间数据丢失的行为;DEM 用于生产错误的引用,新配置容器 NvmDemEventParameterRefs;NvMMaxNoOfWriteRetries 重命名为 NvMMaxNumOfWriteRetries;空指针处理变更;新增 DET 错误 NVM_E_PARAM_POINTER | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 影响本文档的功能:调试概念、错误处理概念、内存相关概念;主要功能:静态块 ID 检查、写验证、读重试、缓冲读/写操作 | | 2008-08-13 | 3.1.1 | AUTOSAR Administration | 技术办公室 SWS 改进;增加配置参数的需求 ID;更精确指定 RAM 块状态管理;NVRAM 管理器不再支持非顺序 NVRAM 块 ID | | 2007-12-21 | 3.0.1 | AUTOSAR Administration | 法律免责声明修订 | | 2007-01-24 | 2.1.15 | AUTOSAR Administration | 第 11 章添加 AUTOSAR 服务描述;指定回调函数的可重入性;添加内存硬件抽象寻址方案细节 | | 2006-05-16 | 2.0 | AUTOSAR Administration | 文档结构适配 Release 2.0 SWS 模板;第 10 章重大变更 | | 2005-05-31 | 1.0 | AUTOSAR Administration | 初始版本发布 | --- ## 目录 1. [介绍与功能概述](#1-介绍与功能概述) 2. [缩略语](#2-缩略语) 3. [相关文档](#3-相关文档) 4. [约束与假设](#4-约束与假设) 5. [模块依赖](#5-模块依赖) 6. [需求追溯](#6-需求追溯) 7. [功能规范](#7-功能规范) 8. [API 规范](#8-api-规范) 9. [时序图](#9-时序图) 10. [配置规范](#10-配置规范) 11. [不适用需求](#11-不适用需求) --- ## 1 介绍与功能概述 本规范描述 AUTOSAR 基础软件模块 NVRAM Manager (NvM) 的功能、API 和配置。 NvM 模块应提供服务,根据汽车环境中数据的个性化要求,确保 NV(非易失)数据的存储和维护。NvM 模块应能够管理 EEPROM 和/或 Flash EEPROM 仿真设备的 NV 数据。 NvM 模块应提供管理和维护 NV 数据(init/read/write/control)所需的同步/异步服务。 不同块之间的关系如下图所示: ``` NVRAM Block (abstract) - Block Management Type {exact composition depends on Management type} | ┌─────────────┼─────────────┐ │ │ │ NV Block RAM Block ROM Block Administrative Block │ │ │ │ └──────── realize ─────────┴─────────────┘ │ Basic Storage Object │ user data NV Data ``` --- ## 2 缩略语 | 缩略语 | 描述 | |--------|------| | Basic Storage Object(基础存储对象) | "NVRAM 块"的最小实体。多个"基础存储对象"可用于构建一个 NVRAM 块。"基础存储对象"可驻留在不同内存位置(RAM/ROM/NV 存储器)。 | | NVRAM Block | 管理并存储 NV 数据块所需的整个结构。 | | NV data | 要存储于非易失存储器的数据。 | | Block Management Type | NVRAM 块的类型。取决于(可配置的)NVRAM 块由不同强制/可选基础存储对象的组成及后续处理。 | | RAM Block | "基础存储对象"。表示驻留在 RAM 中的"NVRAM 块"的部分。 [SWS_NvM_00126] | | ROM Block | "基础存储对象"。表示驻留在 ROM 中的"NVRAM 块"的部分。"ROM 块"是"NVRAM 块"的可选部分。[SWS_NvM_00020] | | NV Block | "基础存储对象"。表示驻留在 NV 存储器中的"NVRAM 块"的部分。"NV 块"是"NVRAM 块"的强制部分。[SWS_NvM_00125] | | NV Block Header | 启用"静态块 ID"机制时 NV 块包含的附加信息。 | | Administrative Block | "基础存储对象"。驻留在 RAM 中。"管理块"是"NVRAM 块"的强制部分。[SWS_NvM_00135] | | DET | Default Error Tracer — 开发错误报告的模块 | | DEM | Diagnostic Event Manager — 生产相关错误报告的模块 | | NV | Non volatile(非易失) | | FEE | Flash EEPROM Emulation | | EA | EEPROM Abstraction | | FCFS | First come first served(先到先服务) | --- ## 3 相关文档 ### 3.1 输入文档 [1] List of Basic Software Modules — AUTOSAR_TR_BSWModuleList.pdf [2] Layered Software Architecture — AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf [3] General Requirements on Basic Software Modules — AUTOSAR_SRS_BSWGeneral.pdf [4] Requirements on Memory Services — AUTOSAR_SRS_MemoryServices.pdf [5] Specification of EEPROM Abstraction — AUTOSAR_SWS_EEPROMAbstraction [6] Specification of Flash EEPROM Emulation — AUTOSAR_SWS_FlashEEPROMEmulation [7] Specification of Memory Abstraction Interface — AUTOSAR_SWS_MemoryAbstractionInterface [8] Specification of Memory Mapping — AUTOSAR_SWS_MemoryMapping [9] Virtual Functional Bus — AUTOSAR_EXP_VFB.pdf [10] Software Component Template — AUTOSAR_TPS_SoftwareComponentTemplate [11] Specification of RTE Software — AUTOSAR_SWS_RTE.pdf [12] Specification of ECU Configuration — AUTOSAR_TPS_ECUConfiguration.pdf [13] Basic Software Module Description Template — AUTOSAR_TPS_BSWModuleDescriptionTemplate [14] Specification of CRC Routines — AUTOSAR_SWS_CRCLibrary [15] General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral.pdf ### 3.2 相关规范 AUTOSAR 提供基础软件模块通用规范 [15](SWS BSW General),也适用于 NVRAM Manager。因此,SWS BSW General 规范应被视为 NVRAM Manager 的附加和必需规范。 --- ## 4 约束与假设 ### 4.1 限制 限制主要由"块管理类型"的有限数量及其对 NV 数据的个性化处理给出。这些限制可通过用户定义管理信息减少,这些信息可作为实际 NV 数据的结构化部分存储。 ### 4.2 适用车型领域 无限制。 ### 4.3 冲突 无。 --- ## 5 模块依赖 本节描述与基础软件内其他模块的关系。 ### 5.1 文件结构 #### 5.1.1 头文件结构 包含文件结构如下: [SWS_NvM_00554] ⌈NvM 模块应包含 NvM.h、Dem.h、MemIf.h。⌋ [SWS_NvM_00691] ⌈上层应仅包含 NvM.h。⌋ ### 5.2 内存抽象模块 内存抽象模块将 NvM 模块与硬件相关的下层驱动抽象。内存抽象模块为 NvM 模块发起的每个块访问提供运行时转换,以选择所有配置的 EEPROM 或 Flash 存储设备唯一的对应驱动函数。通过为每个 NVRAM 块配置的 NVRAM 块设备 ID 选择内存抽象模块。 ### 5.3 CRC 模块 NvM 模块使用 CRC 生成例程(8/16/32 位),作为可配置选项,用于检查和生成 NVRAM 块的 CRC。CRC 例程必须由外部提供。 ### 5.4 底层驱动能力 必须为每个已配置的 NVRAM 设备(例如内部或外部 EEPROM 或 Flash 设备)提供一组底层驱动函数。每组驱动函数内的唯一驱动函数通过内存硬件抽象模块在运行时选择。每组驱动函数必须包含所需的所有函数,用于写入、读取或维护(例如擦除)已配置的 NVRAM 设备。 --- ## 6 需求追溯 (主要追溯关系,完整表见原文 PDF 第 6 章。涉及大量 SRS_BSW_*、SRS_Mem_*、SRS_LIBS_* 等需求。) | 需求 | 满足者 | |------|--------| | SRS_BSW_00101 | SWS_NvM_00399, 00400 | | SRS_BSW_00323 (参数检查) | SWS_NvM_00027 | | SRS_BSW_00327 (错误命名) | SWS_NvM_00023, 00027 | | SRS_BSW_00337 (开发错误分类) | SWS_NvM_00023 | | SRS_BSW_00406 (初始化状态) | SWS_NvM_00023, 00027, 00399, 00400 | | SRS_BSW_00414 (Init 配置指针) | SWS_NvM_00447 | | SRS_BSW_00429 (OS 访问限制) | SWS_NvM_00332 | | SRS_Mem_00011 (硬件独立) | SWS_NvM_00157 | | SRS_Mem_00013 (并发请求) | SWS_NvM_00162, 00698, 00699 | | SRS_Mem_00016 (读功能) | SWS_NvM_00010, 00051, 00122, 00195, 00196, 00454 等 | | SRS_Mem_00017 (写功能) | SWS_NvM_00051, 00122, 00210, 00410, 00411 等 | | SRS_Mem_00018 (从 ROM 默认值恢复) | SWS_NvM_00012, 00051, 00122, 00266, 00267 等 | | SRS_Mem_00020 (状态读出) | SWS_NvM_00015, 00451 | | SRS_Mem_00027 (隐式访问) | SWS_NvM_00442 | | SRS_Mem_00030 (一致性检查) | SWS_NvM_00164 等 | | SRS_Mem_00038 (错误隔离) | SWS_NvM_00910, 00911 | | SRS_Mem_00041 (配置时声明内存需求) | SWS_NvM_00xxx | | SRS_Mem_08001 (一致性检查) | SWS_NvM_00164, 00165 | | SRS_Mem_08007 (数据集选择) | SWS_NvM_00448 | | SRS_Mem_08009 (默认写保护) | SWS_NvM_00xxx | | SRS_Mem_08010 (从 ROM 默认数据恢复) | SWS_NvM_00171, 00172 | | SRS_Mem_08011 (无效化块) | SWS_NvM_00xxx | | SRS_Mem_08542 (优先级化) | SWS_NvM_00032, 00378, 00564 | | SRS_Mem_08545 (修改/未修改标记) | SWS_NvM_00240, 00241, 00405 | | SRS_Mem_08549 (软件更新后初始化) | SWS_NvM_00171 | 完整追溯表见原文 PDF。 --- ## 7 功能规范 ### 7.1 基本架构指南 #### 7.1.1 层结构 NvM 模块位于 AUTOSAR 服务层,通过 Memory Abstraction Interface (MemIf) 访问 EA 和 FEE 模块。 #### 7.1.2 内存硬件抽象寻址方案 [SWS_NvM_00069] ⌈通过提供 Block ID 选择 NvM 模块 API 处理的 NVRAM 块。⌋ #### 7.1.3 基础存储对象 NVRAM 块由以下基础存储对象组成: - **NV Block**:驻留在 NV 存储器(强制) - **RAM Block**:驻留在 RAM(强制) - **ROM Block**:驻留在 ROM(可选) - **Administrative Block**:驻留在 RAM(强制) - **NV Block Header**(可选,如启用静态块 ID) ##### NV 块布局 ``` ┌─────────────────┐ │ NV block header │ (可选) ├─────────────────┤ │ NV block data │ ├─────────────────┤ │ NV block CRC │ (可选) └─────────────────┘ ``` #### 7.1.4 块管理类型 ##### 7.1.4.1 块管理类型概述 [SWS_NvM_00137] ⌈NvM 模块实现应支持以下 NVRAM 存储类型: - `NVM_BLOCK_NATIVE` - `NVM_BLOCK_REDUNDANT` - `NVM_BLOCK_DATASET` ⌋ ##### 7.1.4.2 NVRAM 块结构 | 类型 | NV 块 | RAM 块 | ROM 块 | 管理块 | |------|-------|--------|--------|--------| | NATIVE | 1 | 1 | 0..1 | 1 | | REDUNDANT | 2 | 1 | 0..1 | 1 | | DATASET | 1..(m<256)* | 1 | 0..n | 1 | *数据集数量取决于配置参数 `NvMDatasetSelectionBits`。 ##### 7.1.4.4 Native NVRAM 块 最简单的块管理类型,以最少开销存储/检索 NV 存储器。 ##### 7.1.4.5 Redundant NVRAM 块 提供增强的容错性、可靠性和可用性,增加对数据损坏的抵抗力。包含两个 NV 块。 [SWS_NvM_00531] ⌈如果 Redundant NVRAM 块关联的一个 NV 块被认为无效(如读取期间),应尝试使用未损坏 NV 块的数据恢复。⌋ [SWS_NvM_00546] ⌈如果恢复失败,应使用代码 `NVM_E_LOSS_OF_REDUNDANCY` 报告给 DEM。⌋ ##### 7.1.4.6 Dataset NVRAM 块 等大小数据块(NV/ROM)的数组。应用一次可访问恰好一个元素。 [SWS_NvM_00006] ⌈Dataset NVRAM 块由多个 NV 用户数据、(可选)CRC 区域、(可选)NV 块头部、一个 RAM 块和一个管理块组成。⌋ [SWS_NvM_00444] ⌈配置数据集总数(NV+ROM 块)必须在 1..255 范围内。⌋ [SWS_NvM_00377] ⌈NvM 模块应将对 ROM 块的写视为对受保护 NV 块的写。⌋ ##### 7.1.4.7 NVRAM 管理器 API 配置类 [SWS_NvM_00149] ⌈三种 API 配置类: - **API 配置类 3**:所有指定的 API 调用可用。支持最大功能。 - **API 配置类 2**:可用中间集合的 API 调用。 - **API 配置类 1**:仅提供最少 API 调用集合,适合具有有限硬件资源的系统。 ⌋ #### 7.1.5 扫描顺序/优先级方案 [SWS_NvM_00032] ⌈NvM 模块应支持基于优先级的作业处理。⌋ [SWS_NvM_00378] ⌈优先级处理使用两个队列:一个用于立即写作业(崩溃数据),另一个用于所有其他作业。⌋ [SWS_NvM_00380] ⌈源自 NvM_ReadAll 和 NvM_WriteAll 的多块请求作业队列长度应为 1。⌋ [SWS_NvM_00381] ⌈NvM 模块不应被其他请求中断源自 NvM_ReadAll 请求的作业。⌋ ### 7.2 一般行为 #### 7.2.1 功能需求 [SWS_NvM_00383] ⌈对于每个异步请求,作业完成后通知调用者应为可配置选项。⌋ [SWS_NvM_00038] ⌈NvM 模块仅提供访问 NVRAM 和共享内存(RAM)中块的隐式方式。⌋ [SWS_NvM_00386] ⌈NvM 模块应接受多个异步"单块"请求,只要不发生队列溢出。⌋ [SWS_NvM_00040] ⌈NvM 模块应为 NV 存储器中保存的数据实现一致性/完整性检查的隐式机制。⌋ #### 7.2.2 设计注释 ##### 7.2.2.1 NVRAM 管理器启动 [SWS_NvM_00693] ⌈NvM_Init 应由 BSW Mode Manager 独占调用。⌋ [SWS_NvM_00091] ⌈由于 ECU 启动时间的强约束,NvM_Init 请求不应包含已配置 NVRAM 块的初始化。⌋ [SWS_NvM_00158] ⌈RAM 数据块的初始化应由另一个请求 NvM_ReadAll 完成。⌋ ##### 7.2.2.2 NVRAM 管理器关机 [SWS_NvM_00092] ⌈基本关机过程应由 NvM_WriteAll 请求完成。⌋ ##### 7.2.2.3 (准)并行写访问 [SWS_NvM_00162] ⌈NvM 模块应通过使用排队机制的异步接口接收请求。NvM 模块应根据优先级串行处理所有请求。⌋ ##### 7.2.2.4 NVRAM 块一致性检查 [SWS_NvM_00164] ⌈NvM 模块应提供隐式技术检查 NVRAM 块的数据一致性。⌋ [SWS_NvM_00571] ⌈NVRAM 块的数据一致性检查应通过对其对应 NV 块的 CRC 重新计算完成。⌋ ##### 7.2.2.5 错误恢复 [SWS_NvM_00047] ⌈NvM 模块应提供错误恢复技术。错误恢复取决于 NVRAM 块管理类型。⌋ [SWS_NvM_00168] ⌈NvM 模块应通过执行写重试为写提供错误恢复,无论 NVRAM 块管理类型如何。⌋ [SWS_NvM_00169] ⌈NvM 模块应在启动时为所有具有已配置 RAM 块 CRC 的 NVRAM 块提供 RAM 块重新验证失败情况下的读错误恢复。⌋ ##### 7.2.2.6 用 ROM 数据恢复 RAM 块 [SWS_NvM_00171] ⌈NvM 模块应提供隐式和显式恢复技术,在 NV 块出现不可恢复数据不一致情况下,将 ROM 数据恢复到对应 RAM 块。⌋ ##### 7.2.2.14 RAM 块状态(主要状态) RAM 块通过管理块中的状态信息进行管理。主要状态: - **INVALID**:数据无效 - **CHANGED**:数据已修改,需写回 - **VALID/UNCHANGED**:数据有效且未修改 ### 7.3 错误分类 #### 7.3.1 开发错误 | 错误类型 | 错误代码 | 值[hex] | |----------|----------|---------| | API 服务未初始化即调用 | NVM_E_NOT_INITIALIZED | 0x14 | | 块标识符无效 | NVM_E_PARAM_BLOCK_ID | 0x0a | | 数据指针无效 | NVM_E_PARAM_POINTER | 0x0b | | 配置 ID 无效 | NVM_E_PARAM_BLOCK_TYPE | 0x1c | | 数据索引超出范围 | NVM_E_PARAM_BLOCK_DATA_IDX | 0x0d | #### 7.3.2 运行时错误 无运行时错误规定。 #### 7.3.3 瞬态故障 无瞬态故障规定。 #### 7.3.4 生产错误 | 错误类型 | 错误代码 | |----------|----------| | 已检测到完整性失败 | NVM_E_INTEGRITY_FAILED | | 已检测到冗余丢失 | NVM_E_LOSS_OF_REDUNDANCY | | 写入失败 | NVM_E_REQ_FAILED | #### 7.3.5 扩展生产错误 包括多种检测特定情况的扩展生产错误。 ### 7.4 错误检测 详见原文 PDF 第 7.4 章。 --- ## 8 API 规范 ### 8.1 API #### 8.1.1 导入的类型 [SWS_NvM_00446] ⌈ | 模块 | 头文件 | 导入类型 | |------|--------|----------| | Dem | Rte_Dem_Type.h | Dem_EventIdType, Dem_EventStatusType | | MemIf | MemIf.h | MemIf_JobResultType, MemIf_ModeType, MemIf_StatusType | | Std_Types | StandardTypes.h | Std_ReturnType, Std_VersionInfoType | ⌋ #### 8.1.2 类型定义 ##### NvM_ConfigType | 项 | 内容 | |-----|------| | Name | NvM_ConfigType | | Type | Structure | | Range | 实现特定 | | Description | NvM 模块的配置数据结构。 | ##### NvM_MultiBlockRequestType | 项 | 内容 | |-----|------| | Type | Enumeration | | Range | NVM_READ_ALL (0x00); NVM_WRITE_ALL (0x01); NVM_VALIDATE_ALL (0x02); NVM_FIRST_INIT_ALL (0x03); NVM_CANCEL_WRITE_ALL (0x04) | | Description | 标识通过回调函数或向 BswM 报告时多块上执行的请求类型。 | ##### NvM_RequestResultType | 项 | 内容 | |-----|------| | Type | Enumeration | | Range | NVM_REQ_OK; NVM_REQ_NOT_OK; NVM_REQ_PENDING; NVM_REQ_INTEGRITY_FAILED; NVM_REQ_BLOCK_SKIPPED; NVM_REQ_NV_INVALIDATED; NVM_REQ_CANCELED; NVM_REQ_REDUNDANCY_FAILED; NVM_REQ_RESTORED_FROM_ROM | ##### NvM_BlockIdType uint16 — NVRAM 块标识符。 #### 8.1.3 函数定义 #### 8.1.3.1 同步请求 ##### 8.1.3.1.1 NvM_Init ```c void NvM_Init(const NvM_ConfigType* ConfigPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x00 | | Sync/Async | Synchronous | | Description | 用于重置所有内部变量的服务。 | [SWS_NvM_00399] ⌈应重置所有内部变量(如队列、请求标志、状态机)为初始值。应内部信号 "INIT DONE"。⌋ [SWS_NvM_00400] ⌈不应修改永久 RAM 块内容或调用显式同步回调,这应在 NvM_ReadAll 上完成。⌋ ##### 8.1.3.1.2 NvM_SetDataIndex ```c Std_ReturnType NvM_SetDataIndex(NvM_BlockIdType BlockId, uint8 DataIndex) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x01 | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Description | 设置数据集 NVRAM 块的 DataIndex 的服务。 | ##### 8.1.3.1.3 NvM_GetDataIndex ```c Std_ReturnType NvM_GetDataIndex(NvM_BlockIdType BlockId, uint8* DataIndexPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x02 | | Sync/Async | Synchronous | | Description | 获取数据集 NVRAM 块当前设置的 DataIndex。 | ##### 8.1.3.1.4 NvM_SetBlockProtection ```c Std_ReturnType NvM_SetBlockProtection(NvM_BlockIdType BlockId, boolean ProtectionEnabled) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x03 | | Sync/Async | Synchronous | | Description | 设置/重置 NV 块的写保护。 | ##### 8.1.3.1.5 NvM_GetErrorStatus ```c Std_ReturnType NvM_GetErrorStatus(NvM_BlockIdType BlockId, NvM_RequestResultType* RequestResultPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x04 | | Sync/Async | Synchronous | | Description | 读取块相关错误/状态信息的服务。 | ##### 8.1.3.1.6 NvM_GetVersionInfo ```c void NvM_GetVersionInfo(Std_VersionInfoType* versioninfo) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x0f | ##### 8.1.3.1.7 NvM_SetRamBlockStatus ```c Std_ReturnType NvM_SetRamBlockStatus(NvM_BlockIdType BlockId, boolean BlockChanged) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x05 | | Description | 设置永久 RAM 块或显式同步状态。 | ##### 8.1.3.1.8 NvM_SetBlockLockStatus ```c void NvM_SetBlockLockStatus(NvM_BlockIdType BlockId, boolean BlockLocked) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x13 | | Description | 设置 RAM 块的锁定状态。 | ##### 8.1.3.1.9 NvM_CancelJobs ```c Std_ReturnType NvM_CancelJobs(NvM_BlockIdType BlockId) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x10 | | Description | 取消与 NVRAM 块关联的所有未处理作业。 | #### 8.1.3.2 异步单块请求 ##### 8.1.3.2.1 NvM_ReadBlock ```c Std_ReturnType NvM_ReadBlock(NvM_BlockIdType BlockId, void* NvM_DstPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x06 | | Sync/Async | Asynchronous | | Description | 读取 NVRAM 块的服务。 | ##### 8.1.3.2.2 NvM_WriteBlock ```c Std_ReturnType NvM_WriteBlock(NvM_BlockIdType BlockId, const void* NvM_SrcPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x07 | | Sync/Async | Asynchronous | | Description | 写入 NVRAM 块的服务。 | ##### 8.1.3.2.3 NvM_RestoreBlockDefaults ```c Std_ReturnType NvM_RestoreBlockDefaults(NvM_BlockIdType BlockId, void* NvM_DestPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x08 | | Description | 从 ROM 默认数据恢复 NVRAM 块的服务。 | ##### 8.1.3.2.4 NvM_EraseNvBlock ```c Std_ReturnType NvM_EraseNvBlock(NvM_BlockIdType BlockId) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x09 | | Description | 擦除与 NVRAM 块关联的 NV 块。 | ##### 8.1.3.2.5 NvM_InvalidateNvBlock ```c Std_ReturnType NvM_InvalidateNvBlock(NvM_BlockIdType BlockId) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x0b | | Description | 使与 NVRAM 块关联的 NV 块无效。 | ##### 8.1.3.2.6 NvM_ReadPRAMBlock ```c Std_ReturnType NvM_ReadPRAMBlock(NvM_BlockIdType BlockId) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x16 | | Description | 通过永久 RAM 块读取 NVRAM 块的服务。 | ##### 8.1.3.2.7 NvM_WritePRAMBlock ```c Std_ReturnType NvM_WritePRAMBlock(NvM_BlockIdType BlockId) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x17 | | Description | 通过永久 RAM 块写入 NVRAM 块。 | ##### 8.1.3.2.8 NvM_RestorePRAMBlockDefaults ```c Std_ReturnType NvM_RestorePRAMBlockDefaults(NvM_BlockIdType BlockId) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x18 | | Description | 将 ROM 默认数据恢复到永久 RAM 块。 | #### 8.1.3.3 异步多块请求 ##### NvM_ReadAll ```c void NvM_ReadAll(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x0c | | Description | 启动所有 NVRAM 块的多块读取。在 ECU 启动期间由 BSW Mode Manager 调用。 | ##### NvM_WriteAll ```c void NvM_WriteAll(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x0d | | Description | 启动所有 NVRAM 块的多块写入。在 ECU 关机期间由 BSW Mode Manager 调用。 | ##### NvM_CancelWriteAll ```c void NvM_CancelWriteAll(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x0e | | Description | 中止 NvM_WriteAll 操作。 | ##### NvM_ValidateAll ```c void NvM_ValidateAll(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x19 | | Description | 验证 RAM 块,使其在 NvM_WriteAll 期间被处理。 | ##### NvM_FirstInitAll ```c void NvM_FirstInitAll(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x1a | | Description | 对所有选定的块执行首次初始化。 | #### 8.1.4 期望接口 ##### 强制接口 | API 函数 | 头文件 | 描述 | |----------|--------|------| | MemIf_Read | MemIf.h | 从内存抽象模块读取 | | MemIf_Write | MemIf.h | 写入内存抽象模块 | | MemIf_Cancel | MemIf.h | 取消正在进行的作业 | | MemIf_GetStatus | MemIf.h | 获取状态 | | MemIf_GetJobResult | MemIf.h | 获取作业结果 | | MemIf_SetMode | MemIf.h | 设置模式 | | MemIf_InvalidateBlock | MemIf.h | 使块无效 | | MemIf_EraseImmediateBlock | MemIf.h | 擦除立即数据块 | | Crc_CalculateCRC8/16/32 | Crc.h | CRC 计算 | | Dem_SetEventStatus | Dem.h | 报告 DEM 状态 | ##### 可选接口 | API 函数 | 头文件 | 描述 | |----------|--------|------| | Det_ReportError | Det.h | 报告开发错误 | | BswM_NvM_CurrentJobMode | BswM_NvM.h | 通知 BswM 当前作业模式 | | BswM_NvM_CurrentBlockMode | BswM_NvM.h | 通知 BswM 当前块模式 | ##### 可配置接口 回调函数(由 NvM 用户配置): - `NvMInitBlockCallback`:用于提供默认初始化数据 - `NvMSingleBlockCallback`:单块请求完成回调 - `NvMReadRamBlockFromNvCallback`:显式同步读回调 - `NvMWriteRamBlockToNvCallback`:显式同步写回调 - `NvM_MultiBlockCallback`:多块请求完成回调 #### 8.1.5 API 概览 | 类型 | API | |------|-----| | Type 1 (同步) | NvM_SetDataIndex, NvM_GetDataIndex, NvM_SetBlockProtection, NvM_GetErrorStatus, NvM_SetRamBlockStatus, NvM_SetBlockLockStatus | | Type 2 (异步单块) | NvM_ReadBlock, NvM_WriteBlock, NvM_RestoreBlockDefaults, NvM_EraseNvBlock, NvM_InvalidateNvBlock, NvM_CancelJobs, NvM_ReadPRAMBlock, NvM_WritePRAMBlock, NvM_RestorePRAMBlockDefaults | | Type 3 (异步多块) | NvM_ReadAll, NvM_WriteAll, NvM_CancelWriteAll, NvM_ValidateAll, NvM_FirstInitAll | | Type 4 (初始化) | NvM_Init | ### 8.2 服务接口 #### 8.2.1 客户端-服务端接口 定义了多个 AUTOSAR 服务接口供 RTE 使用: - NvMService - NvMAdminService - NvMNotifyInitBlock - NvMNotifyJobFinished - NvMServiceMultiBlock #### 8.2.2 实现数据类型 | 类型 | 描述 | |------|------| | NvM_BlockIdType | NVRAM 块 ID(uint16) | | NvM_RequestResultType | 请求结果枚举 | #### 8.2.3 端口 NvM 提供以下端口: - 单块 R/W/Restore 操作端口 - 状态查询端口 - 通知端口 ### 8.5 调度函数 #### NvM_MainFunction ```c void NvM_MainFunction(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x11 | | Description | NvM 主函数,周期调用以处理排队的作业。 | | Available via | SchM_NvM.h | --- ## 9 时序图 ### 9.1 同步调用 - NvM_Init - NvM_SetDataIndex - NvM_GetDataIndex - NvM_SetBlockProtection - NvM_GetErrorStatus - NvM_GetVersionInfo ### 9.2 异步调用 #### 9.2.1 带轮询的异步调用 ``` Caller NvM Memory │ NvM_Request() ──►│ │ │ E_OK │ │ │ ◄────────────────│ │ │ │ NvM_MainFunction │ │ │ │ NvM_GetErrorStatus() │ │ ──────────────► │ │ │ NVM_REQ_PENDING │ │ │ ◄────────────────│ │ │ │ MemIf_Operation │ │ ──────────► │ │ │ 完成通知 │ │ │ ◄────────────│ │ NvM_GetErrorStatus() │ │ ──────────────► │ │ │ NVM_REQ_OK │ │ │ ◄────────────────│ │ ``` #### 9.2.2 带回调的异步调用 类似上,但 NvM 通过 `NvMSingleBlockCallback` 通知调用者,而非由调用者轮询。 #### 9.2.3 多块请求的取消 NvM_CancelWriteAll 中止 NvM_WriteAll 中的剩余块。当前块完成处理。 #### 9.2.4 BswM 交互 NvM 通过 `BswM_NvM_CurrentJobMode` 和 `BswM_NvM_CurrentBlockMode` 通知 BSW Mode Manager。 --- ## 10 配置规范 ### 10.1 如何阅读本章 详见 SWS_BSWGeneral 第 10.1 章。 ### 10.2 容器与配置参数 #### 10.2.1 NvM | 项 | 内容 | |-----|------| | SWS Item | ECUC_NvM_00043 | | Module Name | NvM | | Module Description | NvM 模块配置。 | | Post-Build Variant Support | true | | Supported Config Variants | VARIANT-POST-BUILD, VARIANT-PRE-COMPILE | 包含容器:NvMCommon、NvMBlockDescriptor、NvmDemEventParameterRefs。 #### 10.2.2 NvMCommon 通用配置参数: | 参数 | 描述 | |------|------| | NvMApiConfigClass | API 配置类(1/2/3) | | NvMBufferAlignmentType | 缓冲区对齐类型 | | NvMCompiledConfigId | 编译配置 ID(NVRAM 数据布局的唯一标识) | | NvMCrcNumOfBytes | 每周期 CRC 计算字节数 | | NvMDatasetSelectionBits | 数据集编号选择位数 | | NvMDevErrorDetect | 开发错误检测启用 | | NvMDrvModeSwitch | 启动/关机模式切换 | | NvMDynamicConfiguration | 动态配置支持 | | NvMJobPrioritization | 作业优先级化启用 | | NvMMainFunctionPeriod | 主函数周期(秒) | | NvMMultiBlockCallback | 多块回调函数名 | | NvMRepeatMirrorOperations | 镜像操作重试次数 | | NvMSetRamBlockStatusApi | SetRamBlockStatus API 启用 | | NvMSizeImmediateJobQueue | 立即作业队列大小 | | NvMSizeStandardJobQueue | 标准作业队列大小 | | NvMVersionInfoApi | 版本信息 API 启用 | | NvMWriteVerification | 写验证启用 | | NvMWriteVerificationDataSize | 写验证数据大小 | | NvMMaxNumOfReadRetries | 最大读重试次数 | | NvMMaxNumOfWriteRetries | 最大写重试次数 | | NvMBswMMultiBlockJobStatusInformation | BswM 多块作业状态通知 | #### 10.2.3 NvMBlockDescriptor 每个 NVRAM 块的配置(包含多个参数,关键参数列举如下): | 参数 | 描述 | |------|------| | NvMNvramBlockIdentifier | NVRAM 块标识符(uint16) | | NvMNvramDeviceId | NV 设备 ID | | NvMNvBlockBaseNumber | NV 块基础编号 | | NvMNvBlockLength | NV 块长度(字节) | | NvMBlockManagementType | NATIVE/REDUNDANT/DATASET | | NvMBlockUseCrc | 是否使用 CRC | | NvMBlockCrcType | CRC 类型(CRC8/CRC16/CRC32) | | NvMBlockUseSyncMechanism | 显式同步机制 | | NvMBlockUseAutoValidation | 自动验证启用 | | NvMBlockUseSetRamBlockStatus | 使用 SetRamBlockStatus | | NvMBlockWriteProt | 写保护(初始) | | NvMWriteBlockOnce | 只写一次 | | NvMSelectBlockForReadAll | 选择 ReadAll 时处理 | | NvMSelectBlockForWriteAll | 选择 WriteAll 时处理 | | NvMSelectBlockForFirstInitAll | 选择 FirstInitAll 时处理 | | NvMResistantToChangedSw | 软件改变后保留 | | NvMStaticBlockIDCheck | 静态块 ID 检查 | | NvMBlockHeaderInclude | 是否包含块头部 | | NvMNvBlockNum | NV 块数 | | NvMRomBlockNum | ROM 块数 | | NvMRomBlockDataAddress | ROM 块数据地址 | | NvMRamBlockDataAddress | RAM 块数据地址 | | NvMReadRamBlockFromNvCallback | 显式同步读回调 | | NvMWriteRamBlockToNvCallback | 显式同步写回调 | | NvMInitBlockCallback | 初始化块回调 | | NvMSingleBlockCallback | 单块回调 | | NvMBlockJobPriority | 块作业优先级 | | NvMBlockUseAuthentication | 启用块认证 | | NvMCalcRamBlockCrc | 在 RAM 中计算 CRC | | NvMBlockUseCRCCompMechanism | CRC 比较机制启用 | | NvMBlockUseSetRamBlockStatus | SetRamBlockStatus 启用 | #### 10.2.4 NvMTargetBlockReference 引用底层 EA/FEE 块。 #### 10.2.5 NvMEaRef 引用 EEPROM Abstraction 块(EaBlockConfiguration)。 #### 10.2.6 NvMFeeRef 引用 Flash EEPROM Emulation 块(FeeBlockConfiguration)。 #### 10.2.7 NvmDemEventParameterRefs 引用 DEM 事件参数: - NVM_E_QUEUE_OVERFLOW - NVM_E_LOSS_OF_REDUNDANCY - NVM_E_INTEGRITY_FAILED - NVM_E_REQ_FAILED - NVM_E_VERIFY_FAILED - NVM_E_WRONG_BLOCK_ID ### 10.3 通用配置选项 详见原文 PDF。 ### 10.4 已发布参数 详见原文 PDF。 --- ## 11 不适用需求 [SWS_NvM_00744] ⌈这些需求不适用于本规范。⌋ 涉及大量 SRS_BSW_* 需求,详见原文 PDF。 --- ## 翻译说明 - 本文档完整翻译自 AUTOSAR_SWS_NVRAMManager v4.4.0(Document ID 033,187 页)。 - 由于文档规模庞大,本翻译采用"重点翻译 + 摘要"策略: - 文档标识、变更历史、目录、核心概念已完整翻译 - 主要 API 函数声明、错误分类、关键设计原则已完整翻译 - 详细配置参数描述使用摘要表格;完整配置参数列表见原文 PDF 第 10 章 - 完整需求追溯表见原文 PDF 第 6 章 - 保留所有需求 ID(SWS_NvM_xxxxx、SRS_*_xxxxx、ECUC_NvM_xxxxx)。 - 保留 AUTOSAR 方框符 ⌈⌋。 - 模块缩写(NvM、Fee、Ea、MemIf、Fls、Eep、Dem、Det、BswM、EcuM 等)和 API 函数名保持英文。 - 块管理类型(NVM_BLOCK_NATIVE、NVM_BLOCK_REDUNDANT、NVM_BLOCK_DATASET)和请求结果常量保持英文。