# EEPROM 抽象规范 > **文档标题**: Specification of EEPROM Abstraction > **AUTOSAR CP Release**: 4.4.0 > **文档编号**: 287 > **文档类型**: SWS (Software Specification) --- ## 文档标识 | 项目 | 内容 | |------|------| | Document Title | Specification of EEPROM Abstraction | | Document Owner | AUTOSAR | | Document Responsibility | AUTOSAR | | Document Identification No | 287 | | 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 | 编辑性修订 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 引入运行时错误;在 Ea_InvalidateBlock 和 Ea_EraseImmediateBlock 中设置 MEMIF_BUSY | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 更新请求接受/拒绝及相关错误报告规则;更新追溯信息;主函数范围/限制更改 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 错误分类重做;调试支持标记为过时;参数范围更正;请求的块无法找到时澄清作业结果 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 需求与 BSW 特性、通用和模块特定需求关联 | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 编辑性修订 | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 移除模块主函数的时序需求;为 Ea_Write 增加 const 限定符;新增 EaMainFunctionPeriod 配置参数;Fls_GetStatus 在模块未初始化时返回 MEMIF_UNINIT | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 按新的 SWS_BSWGeneral 重做;已发布参数 EaMaximumBlockingTime 弃用;配置参数 EaIndex 弃用 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | 引入参数检查和相应 DET 错误;细化内部管理操作处理;模块短名变更 | | 2010-09-30 | 3.1.5 | AUTOSAR Administration | 新增 NULL 指针检查;模块间检查细化;澄清返回值描述 | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 澄清配置变体;通知例程多重性更正;重新表述作业结果处理;文件包含结构变更 | | 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 | | 2007-12-21 | 3.0.1 | AUTOSAR Administration | EA_MAXIMUM_BLOCKING_TIME 作为已发布参数 | | 2007-01-24 | 2.1.15 | AUTOSAR Administration | 文件包含结构更新;初始化函数 API 适配;EA 块编号范围适配 | | 2006-05-16 | 2.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 基础软件模块 EEPROM Abstraction (EA) 的功能、API 和配置。 EEPROM Abstraction (EA) 模块抽象 EEPROM 驱动的寻址方案,并为上层提供统一的(虚拟)寻址方案以及虚拟无限的擦/写周期数。 EA 模块属于 ECU 抽象层,使上层(NVRAM 管理器)与底层 EEPROM 驱动和器件解耦。 --- ## 2 缩略语 | 缩略语 | 描述 | |--------|------| | EA | EEPROM Abstraction | | EEPROM | 电可擦可编程只读存储器 | | FEE | Flash EEPROM Emulation | | NV | Non Volatile(非易失) | | NvM | NVRAM Manager | | MemIf | Memory Abstraction Interface | | (Logical) Block(逻辑块) | 模块用户可单独寻址的连续内存区域 | | Page(页) | 一次可写入的最小内存量 | | Sector(扇区) | 一次可擦除的最小内存量 | | Virtual Page(虚拟页) | EA 模块用于内部地址计算的可配置最小寻址单元 | | DEM | Diagnostic Event Manager | | DET | Default Error Tracer | --- ## 3 相关文档 ### 3.1 输入文档 - List of Basic Software Modules — AUTOSAR_TR_BSWModuleList.pdf - Layered Software Architecture — AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf - General Requirements on Basic Software Modules — AUTOSAR_SRS_BSWGeneral.pdf - Requirements on Memory Hardware Abstraction Layer — AUTOSAR_SRS_MemoryHWAbstractionLayer.pdf - Specification of EEPROM Driver — AUTOSAR_SWS_EEPROMDriver.pdf - Specification of Memory Abstraction Interface — AUTOSAR_SWS_MemoryAbstractionInterface.pdf - Specification of NVRAM Manager — AUTOSAR_SWS_NVRAMManager.pdf - Specification of Default Error Tracer — AUTOSAR_SWS_DefaultErrorTracer.pdf - General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral.pdf ### 3.2 相关规范 AUTOSAR 提供基础软件模块通用规范(SWS BSW General),也适用于 EEPROM Abstraction。 --- ## 4 约束与假设 ### 4.1 限制 无限制。 ### 4.2 适用车型领域 无限制。 --- ## 5 模块依赖 EA 模块依赖于底层 EEPROM 驱动并实现内存抽象架构。 --- ## 6 需求追溯 (主要追溯关系,完整表见原文 PDF) | 需求 | 满足者 | |------|--------| | SRS_BSW_00101 | SWS_Ea_00084, 00017 | | SRS_BSW_00392 | SWS_Ea_00083, 00117, 00190 | | SRS_BSW_00406 | SWS_Ea_00128 | | SRS_BSW_00414 | SWS_Ea_00190, 00191 | | SRS_MemHwAb_14001 (起止地址对齐) | SWS_Ea_00005, 00068, 00075, 00137 | | SRS_MemHwAb_14002 (写周期配置) | SWS_Ea_00080 | | SRS_MemHwAb_14005 (32位虚拟地址) | SWS_Ea_00066, 00075 | | SRS_MemHwAb_14006 (64K 边界对齐) | SWS_Ea_00024 | | SRS_MemHwAb_14007 (读对齐限制) | SWS_Ea_00021 | | SRS_MemHwAb_14009 (地址转换) | SWS_Ea_00007, 00021, 00024, 00036, 00063 | | SRS_MemHwAb_14010 (完整块写) | SWS_Ea_00087, 00151, 00159, 00181 | | SRS_MemHwAb_14012 (写访问分散) | SWS_Ea_00079 | | SRS_MemHwAb_14013 (立即数据不延迟) | SWS_Ea_00025 | | SRS_MemHwAb_14014 (数据不一致检测) | SWS_Ea_00046, 00047, 00188, 00189 | | SRS_MemHwAb_14015 (报告不一致) | SWS_Ea_00104 | | SRS_MemHwAb_14016 (不返回不一致数据) | SWS_Ea_00104 | | SRS_MemHwAb_14017 (扩展 EEPROM 驱动) | SWS_Ea_00150 | | SRS_MemHwAb_14026 (不使用 0x0000/0xFFFF) | SWS_Ea_00006 | | SRS_MemHwAb_14028 (无效化块) | SWS_Ea_00037, 00074, 00091, 00194 | | SRS_MemHwAb_14029 (部分读取) | SWS_Ea_00022, 00086, 00158, 00179 | | SRS_MemHwAb_14031 (取消异步操作) | SWS_Ea_00077, 00078, 00088, 00160 | | SRS_MemHwAb_14032 (擦除立即数据) | SWS_Ea_00063, 00064, 00065, 00093, 00104 | 完整追溯表见原文 PDF。 --- ## 7 功能规范 ### 7.1 总体行为 [SWS_Ea_00137] ⌈EEPROM Abstraction (EA) 一次只接受一个作业,即模块不应为待处理作业提供队列(这是 NVRAM 管理器的职责)。⌋ **注**:由于 NvM 是本模块的唯一调用者,为保持本模块合理小巧,模块函数不应检查模块当前是否忙。NvM 负责将待处理作业串行化,只在前一作业完成或取消后开始新作业。 #### 7.1.1 寻址方案与分段 EEPROM Abstraction (EA) 为上层提供 32 位虚拟线性地址空间和统一的分段方案。32 位虚拟地址由: - **16 位块编号** — 允许(理论上)65536 个逻辑块 - **16 位块偏移** — 允许每块(理论上)64 KB 的块大小 组成。 16 位块编号表示可配置的(虚拟)分页机制。此地址对齐的值可从底层 EEPROM 驱动和器件派生。虚拟分页可通过参数 `EA_VIRTUAL_PAGE_SIZE` 配置。 [SWS_Ea_00075] ⌈Ea 模块配置应使虚拟页大小(`EA_VIRTUAL_PAGE_SIZE` 中定义)为物理页大小的整数倍,即不允许配置小于实际物理页大小的虚拟页。⌋ **示例**:虚拟页大小配置为 8 字节,因此地址对齐为 8 字节。逻辑块编号 1 放在物理地址 x,逻辑块编号 2 放在 x+8,逻辑块编号 3 放在 x+16。 [SWS_Ea_00005] ⌈每个已配置逻辑块应占用配置虚拟页大小的整数倍。⌋ **示例**:如虚拟页大小为 8 字节,逻辑块可为 8、16、24、32 字节等,但不能为 10、20、50 字节等。 [SWS_Ea_00068] ⌈逻辑块不应相互重叠且不应相互包含。⌋ [SWS_Ea_00006] ⌈块编号 0x0000 和 0xFFFF 不应配置为逻辑块。⌋ (SRS_MemHwAb_14026) #### 7.1.2 地址计算 [SWS_Ea_00007] ⌈根据 EA 模块的实现和使用的具体地址格式,EA 模块的函数应将 16 位块编号和 16 位块偏移组合,以派生底层 EEPROM 驱动所需的物理 EEPROM 地址。⌋ [SWS_Ea_00066] ⌈仅 16 位块编号中不表示特定数据集或冗余副本的那些位应用于地址计算。⌋ **示例**:数据集信息配置为编码在 16 位块编号的 4 个 LSB 中(允许每 NVRAM 块最多 16 个数据集,共 4094 个 NVRAM 块)。实现者将逻辑块所有数据集直接相邻存储,使用块长度和指针访问每个数据集。 #### 7.1.3 擦/写周期限制 [SWS_Ea_00079] ⌈Ea 模块配置应在配置参数 `EaNumberOfWriteCycles` 中定义每个逻辑块预期的擦/写周期数。⌋ [SWS_Ea_00080] ⌈如果底层 EEPROM 器件或器件驱动每物理内存单元未提供至少已配置的擦/写周期数(在参数 `EepAllowedWriteCycles` 中给出),EA 模块应提供机制以分散擦/写访问,使物理器件不被过度使用。这也适用于 EA 模块内部使用的所有管理数据。⌋ **示例**:逻辑块 1 预期 500,000 写周期,而底层 EEPROM 器件和驱动仅规定 100,000 擦除周期。EA 模块必须提供(至少)5 个独立内存区域,在它们之间交替访问。 #### 7.1.4 "立即"数据处理 包含立即数据的块必须瞬时写入,即此类块应可在无需首先擦除相应内存区域(如使用预擦除内存)的情况下写入。NVRAM 管理器应在写入立即数据前取消正在进行的较低优先级读/擦/写或比较作业。 **注**:正在硬件上运行的操作(如写入一页或擦除一个扇区)通常一旦开始就不能中止。因此即使对立即数据,最长硬件操作的最大时间也必须接受为延迟。 #### 7.1.5 管理块一致性信息 [SWS_Ea_00046] ⌈Ea 模块应为每个块管理该块从 EA 模块的角度是否"正确"的信息。此一致性信息应仅涉及块的内部处理,而非块的内容。⌋ [SWS_Ea_00047] ⌈当块写操作开始时,EA 模块应将相应块标记为不一致。块写操作成功结束时,EA 模块应将块标记为(再次)一致。⌋ ### 7.2 错误分类 #### 7.2.1 开发错误 [SWS_Ea_00196] ⌈ | 错误类型 | 相关性 | 相关错误代码 | 值[hex] | |----------|--------|--------------|---------| | 模块未初始化即调用 API 服务 | Development | EA_E_UNINIT | 0x01 | | 以无效块编号调用 API 服务 | Development | EA_E_INVALID_BLOCK_NO | 0x02 | | 以无效块偏移调用 API 服务 | Development | EA_E_INVALID_BLOCK_OFS | 0x03 | | 以无效指针参数调用 API 服务 | Development | EA_E_PARAM_POINTER | 0x04 | | 以无效块长度信息调用 API 服务 | Development | EA_E_INVALID_BLOCK_LEN | 0x05 | | Ea_Init 失败 | Development | EA_E_INIT_FAILED | 0x09 | ⌋ #### 7.2.2 运行时错误 | 错误类型 | 相关错误代码 | 值[hex] | |----------|--------------|---------| | 模块忙时调用 API 服务 | EA_E_BUSY | 0x06 | | Ea_Cancel 调用时无待处理作业 | EA_E_INVALID_CANCEL | 0x08 | #### 7.2.3 瞬态故障 无瞬态故障。 #### 7.2.4 生产错误 无生产错误。 #### 7.2.5 扩展生产错误 无扩展生产错误。 --- ## 8 API 规范 ### 8.1 导入的类型 [SWS_Ea_00083] ⌈ | 模块 | 头文件 | 导入类型 | |------|--------|----------| | Eep | Eep.h | Eep_AddressType, Eep_LengthType | | MemIf | MemIf.h | MemIf_JobResultType, MemIf_ModeType, MemIf_StatusType | | Std_Types | StandardTypes.h | Std_ReturnType, Std_VersionInfoType | ⌋ ### 8.2 类型定义 #### Ea_ConfigType | 项 | 内容 | |-----|------| | Name | Ea_ConfigType | | Type | Structure | | Range | 实现特定 | | Description | Ea 模块的配置数据结构。 | | Available via | Ea.h | ### 8.3 函数定义 #### 8.3.1 Ea_Init ```c void Ea_Init(const Ea_ConfigType* ConfigPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x00 | | Sync/Async | Synchronous | | Description | 初始化 EEPROM 抽象模块。 | [SWS_Ea_00191] ⌈配置指针 `ConfigPtr` 应始终为 NULL_PTR 值。⌋ [SWS_Ea_00017] ⌈应在模块初始化开始时将模块状态从 MEMIF_UNINIT 设为 MEMIF_BUSY_INTERNAL。⌋ [SWS_Ea_00128] ⌈如初始化在 Ea_Init 内完成,成功完成后应将模块状态从 MEMIF_BUSY_INTERNAL 设为 MEMIF_IDLE。⌋ #### 8.3.2 Ea_SetMode ```c void Ea_SetMode(MemIf_ModeType Mode) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x01 | | Description | 切换底层 EEPROM 驱动的模式。 | 将调用映射到底层 EEPROM 驱动的 `Eep_SetMode` 函数。 #### 8.3.3 Ea_Read ```c Std_ReturnType Ea_Read( uint16 BlockNumber, uint16 BlockOffset, uint8* DataBufferPtr, uint16 Length ) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x02 | | Sync/Async | Asynchronous | | Description | 从 `BlockNumber` 块的 `BlockOffset` 偏移开始读取 `Length` 字节到 `DataBufferPtr`。 | 参数检查: - 模块已初始化 - BlockNumber 有效 - BlockOffset 在块范围内 - Length 大于 0 且不超过块大小 [SWS_Ea_00022] / [SWS_Ea_00086] ⌈接受读取请求,设状态 MEMIF_BUSY,作业结果 MEMIF_JOB_PENDING。⌋ [SWS_Ea_00158] / [SWS_Ea_00179] ⌈在主函数内异步处理读取。⌋ #### 8.3.4 Ea_Write ```c Std_ReturnType Ea_Write( uint16 BlockNumber, const uint8* DataBufferPtr ) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x03 | | Sync/Async | Asynchronous | | Description | 将 `DataBufferPtr` 内容写入 `BlockNumber` 块。 | [SWS_Ea_00087] / [SWS_Ea_00151] ⌈写整个块。⌋ [SWS_Ea_00159] / [SWS_Ea_00181] ⌈异步处理写入。⌋ #### 8.3.5 Ea_Cancel ```c void Ea_Cancel(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x04 | | Sync/Async | Synchronous | | Description | 取消正在进行的异步操作。 | [SWS_Ea_00077] / [SWS_Ea_00078] ⌈同步取消正在进行的作业,调用底层 `Eep_Cancel`。⌋ [SWS_Ea_00088] ⌈模块状态设为 MEMIF_IDLE,作业结果设为 MEMIF_JOB_CANCELED。⌋ #### 8.3.6 Ea_GetStatus ```c MemIf_StatusType Ea_GetStatus(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x05 | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Description | 返回状态的服务。 | #### 8.3.7 Ea_GetJobResult ```c MemIf_JobResultType Ea_GetJobResult(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x06 | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Description | 返回上次作业结果的服务。 | 可能值:MEMIF_JOB_OK、MEMIF_JOB_FAILED、MEMIF_JOB_PENDING、MEMIF_JOB_CANCELED、MEMIF_BLOCK_INCONSISTENT、MEMIF_BLOCK_INVALID。 #### 8.3.8 Ea_InvalidateBlock ```c Std_ReturnType Ea_InvalidateBlock(uint16 BlockNumber) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x07 | | Sync/Async | Asynchronous | | Description | 使 `BlockNumber` 块无效。 | [SWS_Ea_00037] / [SWS_Ea_00074] / [SWS_Ea_00091] / [SWS_Ea_00194] ⌈通过设置块管理数据使块无效化,非必需擦除物理内存内容。⌋ #### 8.3.9 Ea_GetVersionInfo ```c void Ea_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x08 | | Reentrancy | Reentrant | | Description | 获取本模块版本信息。 | #### 8.3.10 Ea_EraseImmediateBlock ```c Std_ReturnType Ea_EraseImmediateBlock(uint16 BlockNumber) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x09 | | Sync/Async | Asynchronous | | Description | 擦除 `BlockNumber` 块(立即数据)。 | [SWS_Ea_00063] / [SWS_Ea_00064] / [SWS_Ea_00065] / [SWS_Ea_00093] / [SWS_Ea_00104] ⌈仅对包含立即数据的块。⌋ ### 8.4 回调通知 由模块用户提供: - `Ea_JobEndNotification`:作业成功完成时调用 - `Ea_JobErrorNotification`:作业以错误结束时调用 ### 8.5 调度函数 #### Ea_MainFunction ```c void Ea_MainFunction(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x0a | | Description | 执行 EA 模块作业处理的服务。 | | Available via | SchM_Ea.h | 调用底层 EEPROM 驱动处理读、写、擦除、比较请求。 ### 8.6 期望接口 #### 强制接口 | API 函数 | 头文件 | 描述 | |----------|--------|------| | Eep_Cancel | Eep.h | 取消正在进行的异步操作 | | Eep_Compare | Eep.h | 比较 EEPROM 与内存数据 | | Eep_Erase | Eep.h | 擦除 EEPROM 数据 | | Eep_GetJobResult | Eep.h | 返回作业结果 | | Eep_GetStatus | Eep.h | 返回状态 | | Eep_Read | Eep.h | 从 EEPROM 读取 | | Eep_SetMode | Eep.h | 切换 EEPROM 驱动模式 | | Eep_Write | Eep.h | 写入 EEPROM | #### 可选接口 | API 函数 | 头文件 | 描述 | |----------|--------|------| | Det_ReportError | Det.h | 报告开发错误 | | Det_ReportRuntimeError | Det.h | 报告运行时错误 | #### 可配置接口 回调函数(由 NvM 提供): - `Ea_JobEndNotification` (typically NvM_JobEndNotification) - `Ea_JobErrorNotification` (typically NvM_JobErrorNotification) --- ## 9 时序图 类似 MemIf:NvM → Ea → Eep 链路上的请求传播,带异步主函数处理。 --- ## 10 配置规范 ### 10.1 容器与配置参数 #### 10.1.1 Ea | 项 | 内容 | |-----|------| | SWS Item | ECUC_Ea_00100 | | Module Name | Ea | | Module Description | EA(EEPROM Abstraction)模块配置 | | Post-Build Variant Support | true | #### 10.1.2 EaGeneral | 参数 | 描述 | |------|------| | EaDevErrorDetect | 开发错误检测开关 | | EaVersionInfoApi | 版本信息 API 启用 | | EaSetModeApi | SetMode API 启用 | | EaMainFunctionPeriod | 主函数周期(秒) | | EaVirtualPageSize | 虚拟页大小 | #### 10.1.3 EaBlockConfiguration 每个逻辑块配置: | 参数 | 描述 | |------|------| | EaBlockNumber | 块编号(不可为 0x0000 或 0xFFFF) | | EaBlockSize | 块大小 | | EaDeviceIndex | 设备索引 | | EaImmediateData | 是否为立即数据 | | EaNumberOfWriteCycles | 期望写周期数 | | EaJobEndNotification | 作业结束通知回调 | | EaJobErrorNotification | 作业错误通知回调 | #### 10.1.4 EaPublishedInformation 已发布参数: - 物理写块大小 --- ## 11 不适用需求 [SWS_Ea_00999] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 和 SRS_SPAL_* 需求,详见原文 PDF。 --- ## 翻译说明 - 本文档完整翻译自 AUTOSAR_SWS_EEPROMAbstraction v4.4.0(Document ID 287,58 页)。 - 保留所有需求 ID(SWS_Ea_xxxxx、SRS_MemHwAb_xxxxx、ECUC_Ea_xxxxx)。 - 保留 AUTOSAR 方框符 ⌈⌋。 - 模块缩写(Ea、Eep、NvM、MemIf、FEE 等)和 API 函数名保持英文。 - 详细配置参数和示例请参考原文 PDF 第 10 章。