# Flash EEPROM 仿真规范 > **文档标题**: Specification of Flash EEPROM Emulation > **AUTOSAR CP Release**: 4.4.0 > **文档编号**: 286 > **文档类型**: SWS (Software Specification) --- ## 文档标识 | 项目 | 内容 | |------|------| | Document Title | Specification of Flash EEPROM Emulation | | Document Owner | AUTOSAR | | Document Responsibility | AUTOSAR | | Document Identification No | 286 | | 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 | 引入运行时错误;调整引用 | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 更新追溯信息;MEMIF_BUSY_INTERNAL 期间行为重做;主函数范围适配 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | FEE_BUSY_INTERNAL 期间行为重做;错误分类重做;调试支持标记为过时;请求块无法找到时澄清作业结果 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 新增空白检查需求;需求与特性、通用和模块特定需求关联 | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 编辑性修订 | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 移除主函数时序需求;Fee_Write 函数原型增加 const 限定符;新增 FeeMainFunctionPeriod 配置参数 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 按新的 SWS_BSWGeneral 重做;已发布参数 FeeMaximumBlockingTime 弃用;配置参数 FeeIndex 弃用 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | DET 错误增减;细化内部管理操作处理;模块短名变更;一致性检查重新表述 | | 2010-09-30 | 3.1.5 | AUTOSAR Administration | 澄清模块间检查;细化内部管理操作处理;调整 FeeBlockNumber 和 FeeBlockSize 范围;状态机适配支持初始化可能不在 Fee_Init 内完成 | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 澄清配置变体;重新表述作业结果处理;配置参数范围限制 | | 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 | | 2007-12-21 | 3.0.1 | AUTOSAR Administration | 表格格式生成;文档元信息扩充 | | 2007-01-24 | 2.1.15 | AUTOSAR Administration | 文件包含结构更新;初始化函数 API 适配;FEE 块编号范围适配 | | 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 介绍与功能概述 本规范描述 Flash EEPROM Emulation 模块的功能、API 和配置。 ``` NVRAM Manager │ ▼ Memory Hardware Abstraction ├── Memory Abstraction Interface (MemIf) │ │ │ ▼ ├── Flash EEPROM Emulation (FEE) ←── 本文档 │ │ │ ▼ └── Flash Driver ``` Flash EEPROM Emulation (FEE) 模块仿真 EEPROM Abstraction Layer 在 Flash 内存技术上的行为。它提供: - 32 位虚拟线性地址空间 - 统一的(虚拟)分段方案 - 虚拟无限的擦/写周期数 它使上层(NVRAM 管理器)与底层 Flash 驱动和器件解耦。 --- ## 2 缩略语 | 缩略语 | 描述 | |--------|------| | FEE | Flash EEPROM Emulation | | Fee | 模块名 | | Fls | Flash 驱动模块 | | EA | EEPROM Abstraction | | NV | 非易失 | | NvM | NVRAM Manager | | MemIf | Memory Abstraction Interface | | Logical Block(逻辑块) | 模块用户可单独寻址的内存区域 | | Page(页) | Flash 一次可写最小单元 | | Sector(扇区) | Flash 一次可擦最小单元 | | Virtual Page(虚拟页) | FEE 模块用于内部地址计算的可配置最小寻址单元 | | Memory swap area(内存交换区) | FEE 使用的备用 Flash 区域,用于在重组期间存储数据 | | 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 Flash Driver — AUTOSAR_SWS_FlashDriver.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),也适用于 Flash EEPROM Emulation。 --- ## 4 约束与假设 ### 4.1 限制 无限制。 ### 4.2 适用车型领域 无限制。 --- ## 5 模块依赖 FEE 模块依赖于底层 Flash 驱动。 --- ## 6 需求追溯 (主要追溯关系,完整表见原文 PDF) | 需求 | 满足者 | |------|--------| | SRS_MemHwAb_14001 (起止地址对齐) | SWS_Fee_00005, 00068, 00075, 00137 | | SRS_MemHwAb_14002 (写周期配置) | SWS_Fee_00080 | | SRS_MemHwAb_14005 (32 位虚拟地址) | SWS_Fee_00066, 00075 | | SRS_MemHwAb_14006 (64K 边界对齐) | SWS_Fee_00024 | | SRS_MemHwAb_14007 (读对齐限制) | SWS_Fee_00021 | | SRS_MemHwAb_14009 (地址转换) | SWS_Fee_00007, 00021, 00024, 00036, 00063 | | SRS_MemHwAb_14010 (完整块写) | SWS_Fee_00087, 00151, 00159, 00181 | | SRS_MemHwAb_14012 (写访问分散) | SWS_Fee_00079 | | SRS_MemHwAb_14013 (立即数据不延迟) | SWS_Fee_00025 | | SRS_MemHwAb_14014 (数据不一致检测) | SWS_Fee_00046, 00047 | | SRS_MemHwAb_14015 (报告不一致) | SWS_Fee_00104 | | SRS_MemHwAb_14016 (不返回不一致数据) | SWS_Fee_00104 | | SRS_MemHwAb_14018 (FEE 扩展 Flash 驱动) | SWS_Fee_00150 | | SRS_MemHwAb_14026 (不使用 0x0000/0xFFFF) | SWS_Fee_00006 | | SRS_MemHwAb_14028 (无效化块) | SWS_Fee_00037, 00074, 00091 | | SRS_MemHwAb_14029 (部分读取) | SWS_Fee_00022, 00086, 00158, 00179 | | SRS_MemHwAb_14031 (取消异步操作) | SWS_Fee_00077, 00078, 00088 | | SRS_MemHwAb_14032 (擦除立即数据) | SWS_Fee_00063, 00064, 00065 | 完整追溯表见原文 PDF。 --- ## 7 功能规范 ### 7.1 总体行为 FEE 模块的设计与 EA 模块极为相似。 [SWS_Fee_00137] ⌈Flash EEPROM Emulation (FEE) 一次只接受一个作业,即模块不应为待处理作业提供队列(这是 NVRAM 管理器的职责)。⌋ #### 7.1.1 寻址方案与分段 FEE 提供 32 位虚拟线性地址空间和统一的分段方案。32 位虚拟地址由: - **16 位块编号** — 允许(理论上)65536 个逻辑块 - **16 位块偏移** — 允许每块 64 KB 组成。 [SWS_Fee_00075] ⌈虚拟页大小(`FEE_VIRTUAL_PAGE_SIZE`)应为物理页大小的整数倍。⌋ [SWS_Fee_00005] ⌈每个已配置逻辑块应占用虚拟页大小的整数倍。⌋ [SWS_Fee_00068] ⌈逻辑块不应相互重叠或包含。⌋ [SWS_Fee_00006] ⌈块编号 0x0000 和 0xFFFF 不应配置为逻辑块。⌋ #### 7.1.2 地址计算 [SWS_Fee_00007] ⌈FEE 模块函数应将 16 位块编号和 16 位块偏移组合,以派生底层 Flash 驱动所需的物理 Flash 地址。⌋ [SWS_Fee_00066] ⌈仅 16 位块编号中不表示特定数据集或冗余副本的位应用于地址计算。⌋ #### 7.1.3 擦除周期限制 [SWS_Fee_00079] ⌈Fee 模块配置应在配置参数 `FeeNumberOfWriteCycles` 中定义每个逻辑块预期的擦/写周期数。⌋ [SWS_Fee_00080] ⌈如底层 Flash 器件或驱动不提供至少已配置的擦/写周期数,FEE 模块应提供机制以分散擦/写访问。⌋ **FEE 特殊机制 — 块漫游**: - FEE 使用"漫游"算法管理多个 Flash 扇区 - 通过将新写入的数据放到不同位置,延长 Flash 寿命 - 必须存在备用 Flash 空间用于重组 #### 7.1.4 "立即"数据处理 包含立即数据的块必须瞬时写入。 [SWS_Fee_00025] ⌈立即数据写入不应因内部管理操作或被写入内存区域的擦除而延迟。FEE 必须始终保留预擦除区域用于立即数据。⌋ #### 7.1.5 管理块正确性信息 [SWS_Fee_00046] ⌈FEE 模块应为每个块管理一致性信息。⌋ [SWS_Fee_00047] ⌈块写入开始时标记为不一致,成功完成后标记为一致。⌋ ### 7.2 错误分类 #### 7.2.1 开发错误 | 错误类型 | 相关错误代码 | 值[hex] | |----------|--------------|---------| | 模块未初始化即调用 API 服务 | FEE_E_UNINIT | 0x01 | | 以无效块编号调用 API 服务 | FEE_E_INVALID_BLOCK_NO | 0x02 | | 以无效块偏移调用 API 服务 | FEE_E_INVALID_BLOCK_OFS | 0x03 | | 以 NULL 指针调用 API 服务 | FEE_E_PARAM_POINTER | 0x04 | | 以无效块长度调用 API 服务 | FEE_E_INVALID_BLOCK_LEN | 0x05 | | Fee_Init 失败 | FEE_E_INIT_FAILED | 0x09 | #### 7.2.2 运行时错误 | 错误类型 | 相关错误代码 | 值[hex] | |----------|--------------|---------| | 模块忙时调用 API 服务 | FEE_E_BUSY | 0x06 | | Fee_Cancel 调用时无待处理作业 | FEE_E_INVALID_CANCEL | 0x08 | #### 7.2.3 瞬态故障 无瞬态故障。 #### 7.2.4 生产错误 无生产错误。 #### 7.2.5 扩展生产错误 无扩展生产错误。 --- ## 8 API 规范 ### 8.1 导入的类型 | 模块 | 头文件 | 导入类型 | |------|--------|----------| | Fls | Fls.h | Fls_AddressType, Fls_LengthType | | MemIf | MemIf.h | MemIf_JobResultType, MemIf_ModeType, MemIf_StatusType | | Std_Types | StandardTypes.h | Std_ReturnType, Std_VersionInfoType | ### 8.2 类型定义 #### Fee_ConfigType | 项 | 内容 | |-----|------| | Name | Fee_ConfigType | | Type | Structure | | Range | 实现特定 | | Description | FEE 模块的配置数据结构。 | | Available via | Fee.h | ### 8.3 函数定义 #### 8.3.1 Fee_Init ```c void Fee_Init(const Fee_ConfigType* ConfigPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x00 | | Sync/Async | Synchronous | | Description | 初始化 FEE 模块。 | [SWS_Fee_00191] ⌈`ConfigPtr` 应为 NULL_PTR 值。⌋ [SWS_Fee_00017] ⌈应将模块状态从 MEMIF_UNINIT 设为 MEMIF_BUSY_INTERNAL。⌋ [SWS_Fee_00120] [SWS_Fee_00168] [SWS_Fee_00169] ⌈如初始化在 Fee_Init 内未完成,可在主函数中继续。完成后将状态设为 MEMIF_IDLE。⌋ #### 8.3.2 Fee_SetMode ```c void Fee_SetMode(MemIf_ModeType Mode) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x01 | | Description | 切换底层 Flash 驱动的模式。 | 调用底层 `Fls_SetMode`。 #### 8.3.3 Fee_Read ```c Std_ReturnType Fee_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 且不超过块大小 #### 8.3.4 Fee_Write ```c Std_ReturnType Fee_Write( uint16 BlockNumber, const uint8* DataBufferPtr ) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x03 | | Sync/Async | Asynchronous | | Description | 将 `DataBufferPtr` 内容写入 `BlockNumber` 块。 | [SWS_Fee_00087] [SWS_Fee_00151] ⌈写整个块。⌋ #### 8.3.5 Fee_Cancel ```c void Fee_Cancel(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x04 | | Sync/Async | Synchronous | | Description | 取消正在进行的异步操作。 | [SWS_Fee_00077] [SWS_Fee_00078] ⌈同步取消并调用底层 `Fls_Cancel`。⌋ [SWS_Fee_00088] ⌈状态设为 MEMIF_IDLE,作业结果设为 MEMIF_JOB_CANCELED。⌋ #### 8.3.6 Fee_GetStatus ```c MemIf_StatusType Fee_GetStatus(void) ``` 可能值: - MEMIF_UNINIT - MEMIF_IDLE - MEMIF_BUSY - MEMIF_BUSY_INTERNAL — FEE 模块正忙于内部管理操作(如块漫游、扇区擦除) #### 8.3.7 Fee_GetJobResult ```c MemIf_JobResultType Fee_GetJobResult(void) ``` 可能值:MEMIF_JOB_OK、MEMIF_JOB_FAILED、MEMIF_JOB_PENDING、MEMIF_JOB_CANCELED、MEMIF_BLOCK_INCONSISTENT、MEMIF_BLOCK_INVALID。 #### 8.3.8 Fee_InvalidateBlock ```c Std_ReturnType Fee_InvalidateBlock(uint16 BlockNumber) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x07 | | Sync/Async | Asynchronous | | Description | 使逻辑块无效。 | #### 8.3.9 Fee_GetVersionInfo ```c void Fee_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr) ``` #### 8.3.10 Fee_EraseImmediateBlock ```c Std_ReturnType Fee_EraseImmediateBlock(uint16 BlockNumber) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x09 | | Sync/Async | Asynchronous | | Description | 仅对包含立即数据的块进行擦除。 | ### 8.4 回调通知 #### 8.4.1 Fee_JobEndNotification ```c void Fee_JobEndNotification(void) ``` | 项 | 内容 | |-----|------| | Description | 由底层 Flash 驱动调用,通知 FEE 作业成功完成。 | #### 8.4.2 Fee_JobErrorNotification ```c void Fee_JobErrorNotification(void) ``` | 项 | 内容 | |-----|------| | Description | 由底层 Flash 驱动调用,通知 FEE 作业出错。 | ### 8.5 调度函数 #### Fee_MainFunction ```c void Fee_MainFunction(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x0a | | Description | 执行 FEE 模块作业处理的服务。 | | Available via | SchM_Fee.h | 处理读、写、擦除作业,执行内部管理操作(如块漫游、扇区重组、空白检查)。 ### 8.6 期望接口 #### 8.6.1 强制接口 | API 函数 | 头文件 | 描述 | |----------|--------|------| | Fls_Cancel | Fls.h | 取消正在进行的 Flash 作业 | | Fls_Compare | Fls.h | 比较 Flash 中数据 | | Fls_Erase | Fls.h | 擦除 Flash 扇区 | | Fls_GetJobResult | Fls.h | 返回 Flash 作业结果 | | Fls_GetStatus | Fls.h | 返回 Flash 状态 | | Fls_Read | Fls.h | 从 Flash 读取 | | Fls_SetMode | Fls.h | 切换 Flash 驱动模式 | | Fls_Write | Fls.h | 写入 Flash | #### 8.6.2 可选接口 | API 函数 | 头文件 | 描述 | |----------|--------|------| | Det_ReportError | Det.h | 报告开发错误 | | Det_ReportRuntimeError | Det.h | 报告运行时错误 | #### 8.6.3 可配置接口 NvM 提供的回调: - `NvM_JobEndNotification` - `NvM_JobErrorNotification` --- ## 9 时序图 ### 9.1 Fee_Init EcuM → Fee → Fls 链路上的初始化序列。可能涉及多次主函数调用以完成内部 Flash 扫描。 ### 9.2 Fee_Write NvM → Fee → Fls 链路:写请求传播,异步 Flash 写入(可能包括擦除前操作),完成后回调通知。 ### 9.3 Fee_Cancel NvM → Fee → Fls:同步取消。 --- ## 10 配置规范 ### 10.1 容器与配置参数 #### 10.1.1 Fee | 项 | 内容 | |-----|------| | SWS Item | ECUC_Fee_00100 | | Module Name | Fee | | Module Description | FEE 模块配置 | #### 10.1.2 FeeGeneral | 参数 | 描述 | |------|------| | FeeDevErrorDetect | 开发错误检测开关 | | FeeVersionInfoApi | 版本信息 API 启用 | | FeeSetModeApi | SetMode API 启用 | | FeeMainFunctionPeriod | 主函数周期 | | FeeVirtualPageSize | 虚拟页大小 | | FeeNvmJobEndNotification | NvM 作业结束通知回调函数名 | | FeeNvmJobErrorNotification | NvM 作业错误通知回调函数名 | | FeePollingMode | 轮询模式开关 | #### 10.1.3 FeeBlockConfiguration 每个逻辑块配置: | 参数 | 描述 | |------|------| | FeeBlockNumber | 块编号(不可为 0x0000 或 0xFFFF) | | FeeBlockSize | 块大小 | | FeeDeviceIndex | 设备索引 | | FeeImmediateData | 是否为立即数据 | | FeeNumberOfWriteCycles | 期望写周期数 | ### 10.2 已发布信息 #### FeePublishedInformation 已发布参数包括: - 物理写块大小 - 物理可擦除块大小 --- ## 11 不适用需求 [SWS_Fee_00999] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 和 SRS_SPAL_* 需求,详见原文 PDF。 --- ## 翻译说明 - 本文档完整翻译自 AUTOSAR_SWS_FlashEEPROMEmulation v4.4.0(Document ID 286,56 页)。 - 保留所有需求 ID(SWS_Fee_xxxxx、SRS_MemHwAb_xxxxx、ECUC_Fee_xxxxx)。 - 保留 AUTOSAR 方框符 ⌈⌋。 - 模块缩写(Fee、Fls、NvM、MemIf、EA 等)和 API 函数名保持英文。 - 详细配置参数和示例请参考原文 PDF 第 10 章。