16 KiB
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 介绍与功能概述
本规范描述 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
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
void Fee_SetMode(MemIf_ModeType Mode)
| 项 | 内容 |
|---|---|
| Service ID[hex] | 0x01 |
| Description | 切换底层 Flash 驱动的模式。 |
调用底层 Fls_SetMode。
8.3.3 Fee_Read
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
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
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
MemIf_StatusType Fee_GetStatus(void)
可能值:
- MEMIF_UNINIT
- MEMIF_IDLE
- MEMIF_BUSY
- MEMIF_BUSY_INTERNAL — FEE 模块正忙于内部管理操作(如块漫游、扇区擦除)
8.3.7 Fee_GetJobResult
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
Std_ReturnType Fee_InvalidateBlock(uint16 BlockNumber)
| 项 | 内容 |
|---|---|
| Service ID[hex] | 0x07 |
| Sync/Async | Asynchronous |
| Description | 使逻辑块无效。 |
8.3.9 Fee_GetVersionInfo
void Fee_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr)
8.3.10 Fee_EraseImmediateBlock
Std_ReturnType Fee_EraseImmediateBlock(uint16 BlockNumber)
| 项 | 内容 |
|---|---|
| Service ID[hex] | 0x09 |
| Sync/Async | Asynchronous |
| Description | 仅对包含立即数据的块进行擦除。 |
8.4 回调通知
8.4.1 Fee_JobEndNotification
void Fee_JobEndNotification(void)
| 项 | 内容 |
|---|---|
| Description | 由底层 Flash 驱动调用,通知 FEE 作业成功完成。 |
8.4.2 Fee_JobErrorNotification
void Fee_JobErrorNotification(void)
| 项 | 内容 |
|---|---|
| Description | 由底层 Flash 驱动调用,通知 FEE 作业出错。 |
8.5 调度函数
Fee_MainFunction
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_JobEndNotificationNvM_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 章。