P2 batch translation: 49 PDFs (Memory + Safety + Crypto + ModeManagement + IO)

This commit is contained in:
opencode-translator
2026-06-13 10:04:28 +08:00
parent 6f293acbf7
commit 784f11ab73
50 changed files with 36262 additions and 57 deletions
+466
View File
@@ -0,0 +1,466 @@
# 非易失数据处理指南
> **文档标题**: NV Data Handling Guideline
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 810
> **文档类型**: EXP (Explanation/Guideline)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | NV Data Handling Guideline |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 810 |
| 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 | 初始版本发布 |
---
## 目录
1. [介绍与功能概述](#1-介绍与功能概述)
2. [缩略语](#2-缩略语)
3. [相关文档](#3-相关文档)
4. [总体机制和概念](#4-总体机制和概念)
5. [用例摘要](#5-用例摘要)
6. [附录](#6-附录)
---
## 1 介绍与功能概述
本文档介绍 AUTOSAR 关于非易失存储器(Non-volatile Memory)的基本概念以及应用软件组件可用的各种访问机制。
第 4 章简要概述非易失内存概念,第 5 章提供从应用程序(最终用户)访问非易失内存的各种用例。
---
## 2 缩略语
| 缩略语 | 描述 |
|--------|------|
| NvM | NVRAM Manager(NVRAM 管理器) |
| NV | Non-volatile(非易失) |
| NVRAM | Non-volatile Random Access Memory(非易失随机存取存储器) |
| NVRAM Block | 管理并存储 NV 数据块所需的整个结构 |
| NV Block | 基础存储对象。表示驻留在 NV 存储器中的"NVRAM 块"的部分 |
| RAM Block | 基础存储对象。表示驻留在 RAM 中的"NVRAM 块"的部分 |
| RAM Mirror | NvM 内部缓冲区,用于读写 `NvMBlockUseSyncMechanism` 设为 TRUE 的 NVRAM 块的 RAM 块 |
| ROM Block | 基础存储对象。表示驻留在 ROM 中的"NVRAM 块"的部分 |
| ROM | Read-Only Memory(只读存储器) |
| RTE | Runtime Environment(运行时环境) |
| SW-C | Software Component(软件组件) |
---
## 3 相关文档
### 3.1 输入文档
[1] AUTOSAR Specification for Runtime Environment — AUTOSAR_SWS_RTE.pdf
[2] AUTOSAR Template Specification of Software Component — AUTOSAR_TPS_SoftwareComponentTemplate.pdf
[3] AUTOSAR Specification for NVRAM Manager — AUTOSAR_SWS_NVRAMManager.pdf
[4] AUTOSAR Guide on Mode Management — AUTOSAR_EXP_ModeManagementGuide.pdf
### 3.2 相关标准与规范
无。
### 3.3 相关规范
无。
---
## 4 总体机制和概念
### 4.1 NvM 及其特性
可变性(changeability)和持久性(durability)是与 ECU 内数据相关的属性。值可变但跨电源周期保留的数据需要存储在非易失存储器中。**NV Data** 是非易失存储器中的数据。在 AUTOSAR 中,应用程序只能通过 **NVRAM Manager (NvM)** 访问该非易失存储器。该模块提供管理和维护数据所需的服务(同步/异步)。
```
应用层(Application SW-C)
RTE
NvM (NVRAM Manager)
Memory Abstraction Interface (MemIf)
FEE / EA
Flash Driver / EEPROM Driver
NV 存储器硬件
```
*图 1:AUTOSAR 中内存栈概览*
#### 4.1.1 基础存储对象
"基础存储对象"是"NVRAM 块"的最小实体。多个"基础存储对象"可用于构建一个 NVRAM 块。"基础存储对象"可驻留在不同的内存位置(RAM/ROM/NV 存储器)。
##### 4.1.1.1 RAM 块
"RAM 块"表示 NVRAM 块中驻留在 RAM 的部分。由用户数据、(可选)CRC 值和(可选)NV 块头部组成。用于保存活动数据。这是 NVRAM 块的**可选**部分。
##### 4.1.1.2 ROM 块
"ROM 块"表示 NVRAM 块中驻留在 ROM 的部分。"ROM 块"是 NVRAM 块的**可选**部分。
ROM 块内容是持久性的,在程序执行期间无法修改,驻留在 ROM/Flash 中。用于在空或损坏的 NV 块的情况下提供默认数据。
##### 4.1.1.3 NV 块
"NV 块"表示 NVRAM 块中驻留在 NV 存储器的部分。"NV 块"是 NVRAM 块的**强制**部分。
NV 块内容是持久性的,可在程序执行期间修改,驻留在 Flash 中。由 NV 用户数据、(可选)CRC 值和(可选)NV 块头部组成。
##### 4.1.1.4 管理块
"管理块"驻留在 RAM 中。"管理块"是 NVRAM 块的**强制**部分。
管理块内容是非持久性的,驻留在 RAM 中。用于保存相应 NVRAM 块的属性/错误/状态信息以及"Dataset"类型 NVRAM 块的块索引。
#### 4.1.2 块管理类型
NvM 支持以下 NVRAM 块管理类型:
##### 4.1.2.1 Native NVRAM 块
最简单的块管理类型,以最少开销存储/检索 NV 存储器。
`NVM_BLOCK_NATIVE` 类型的 NVRAM 存储由以下基础存储对象组成:
- NV 块:1
- RAM 块:1
- ROM 块:0..1
- 管理块:1
##### 4.1.2.2 Redundant NVRAM 块
除 Native NVRAM 块外,Redundant NVRAM 块提供增强的容错性、可靠性和可用性,增加对数据损坏的抵抗力。
`NVM_BLOCK_REDUNDANT` 类型的 NVRAM 存储由以下基础存储对象组成:
- NV 块:2
- RAM 块:1
- ROM 块:0..1
- 管理块:1
##### 4.1.2.3 Dataset NVRAM 块
等大小数据块的数组。应用一次可访问恰好一个数据块。
`NVM_BLOCK_DATASET` 类型的 NVRAM 存储由以下基础存储对象组成:
- NV 块:1..NvMNvBlockNum
- RAM 块:1
- ROM 块:0..NvMRomBlockNum
- 管理块:1
配置数据集总数(NV+ROM 块)必须在 1..255 范围内。
#### 4.1.3 支持的同步机制
访问 NvM 模块的 RAM 镜像数据时支持两种同步机制。
##### 4.1.3.1 隐式同步
应用程序和 NvM 并发访问一个公共 RAM 块。应用程序通过调用 NvM API 向/从 RAM 写入/读取数据。
```
应用程序 ────────► RAM 块 ◄──────── NvM
(共享访问)
NV 存储器
```
*图 2:隐式同步概览*
在这种情况下,RAM 块映射到一个 SW-C,不建议共享 RAM 块。当 SW-C 使用 RAM 块(临时/永久)访问 NVRAM 时,必须确保 RAM 块的数据一致性,直到 NvM 完成正在进行的操作。
**写请求步骤**:
1. 应用程序用要由 NvM 模块写入的数据填充 RAM 块
2. 应用程序发出 NvM_WriteBlock 或 NvM_WritePRAMBlock 请求,将控制权转移到 NvM 模块
3. 之后,应用程序在请求成功或失败信号发出或通过轮询导出之前不得修改 RAM 块
4. 应用程序可使用轮询获取请求状态或通过回调函数异步通知
5. NvM 模块操作完成后,RAM 块可重新用于修改
##### 4.1.3.2 显式同步
在显式同步中,NvM 定义一个 RAM 镜像用于与应用程序的 RAM 块交换数据。应用程序在 RAM 块中写入数据并调用 NvM 写 API。NvM 调用 API 读取 RAM 镜像,数据从 RAM 镜像复制到 RAM 块,最后到 NV 块。数据通过回调例程(由 NvM 模块调用)在两个方向上由应用程序传输。
```
应用程序 ────► RAM 块 ──回调──► RAM 镜像 ─────► NV 存储器
(NvM 内部) (通过 NvM)
```
*图 3:显式同步概览*
**优点**:应用程序可以高效控制其 RAM 块。它们负责使用 ReadRamBlockFromNvM / WriteRamBlockToNvM 在 NvM 模块的 RAM 镜像中复制一致数据。
**缺点**:需要与使用此机制的最大 NVRAM 块大小相同的额外 RAM,以及每个操作两个 RAM 位置之间的额外复制。
**写请求步骤(显式同步)**:
1. 应用程序用要由 NvM 模块写入的数据填充 RAM 块
2. 应用程序发出 NvM_WriteBlock 或 NvM_WritePRAMBlock 请求
3. 应用程序可修改 RAM 块,直到 NvM 模块调用 `NvMWriteRamBlockToNvM` 例程
4. 如果调用了 `NvMWriteRamBlockToNvM`,应用程序必须将 RAM 块的一致副本提供到 NvM 模块请求的目的地。应用程序可使用返回值 E_NOT_OK 信号数据不一致。NvM 模块将接受 `NvMRepeatMirrorOperations` 次,然后推迟请求并继续下一个请求
5. 仅在数据复制到 NvM 模块后才继续
6. 之后应用程序可以再次读写 RAM 块
#### 4.1.4 其他特性
##### 4.1.4.1 基于 CRC 的比较
NvM 模块内部使用 CRC 生成例程(8/16/32 位),作为可配置选项,用于检查和生成 NVRAM 块的 CRC。
NvM 模块提供通过实现 CRC 比较机制跳过写入未更改数据的选项。CRC 比较机制可通过设置配置参数 `NvMBlockUseCRCCompMechanism` 启用。
**注**:一般来说,RAM 块的某些更改内容可能导致与初始内容相同的 CRC,因此如果使用此选项可能会丢失更新。因此,此选项应仅用于可容忍此风险的块。
##### 4.1.4.2 错误恢复
NvM 模块为 NATIVE 和 REDUNDANT 块管理类型提供读时隐式错误恢复(通过加载默认值,如配置)。
ROM 数据的显式检索可通过调用 API `NvM_RestoreBlockDefaults` 用于所有块管理类型。对于 DATASET,必须在调用此 API 之前设置相关索引(指向 ROM 块)。
NvM 模块通过执行写重试为写提供错误恢复,无论 NVRAM 块管理类型如何。
##### 4.1.4.3 写验证
写验证时,当 RAM 块写入 NV 存储器时,立即回读 NV 块并与 RAM 块的原始内容比较。
如果 RAM 块的原始内容与回读不同,则执行写重试。如果启用,生产代码错误 `NVM_E_VERIFY_FAILED` 报告给 DEM。
如果回读操作失败,则不执行读重试。
##### 4.1.4.4 使用 NvM_SetRamBlockStatus API 处理 RAM 块
###### 4.1.4.4.1 启动阶段(NvM_ReadAll)
对于某些 NVRAM 块,可能需要在 NvM_ReadAll 期间保留相应 RAM 块的数据内容不被覆盖,以防相应 NV 块中存储的数据比 RAM 块中的更旧(例如,在 RAM 中的数据尚未写入 NV 存储器时发生热复位)。在这种情况下,RAM 块必须分配到 reset-safe(非初始化)RAM 区域,配置参数 `CalcRamBlockCrc` 必须设为 TRUE,并且 `NvMSetRamBlockStatusApi` 设为 TRUE。
每次 RAM 块数据内容更改后,必须为相应 NVRAM 块调用 API `NvM_SetRamBlockStatus`,参数 `BlockChanged` 设为 TRUE。NVRAM 管理器随后重新计算此 RAM 块的 CRC 并将结果存储在 reset-safe RAM 区域分配的内部变量中。
每次启动(`NvM_ReadAll`)时,NvM 模块计算该 RAM 块的 CRC,如果与已存储的 CRC 值匹配,RAM 块将不被覆盖。如果计算的 CRC 与已存储的不匹配,RAM 块将被从 NV 块读取的数据覆盖,或者如果此读取尝试失败,则用默认数据覆盖。
###### 4.1.4.4.2 关机阶段(NvM_WriteAll)
如果配置参数 `NvMSetRamBlockStatusApi` 设为 FALSE,NVRAM 管理器在 NvM_WriteAll 过程中将 RAM 块的数据内容复制到所有为 WriteAll 配置的 NVRAM 块的相应 NV 块。
为了最小化 NV 存储器的写周期数,仅复制其数据内容已被 NVRAM 块用户更改的 RAM 块的内容很有用。为了在 NvM_WriteAll 过程中启用此功能,必须将 `NvMSetRamBlockStatusApi` 设为 TRUE。在这种情况下,NVRAM 块用户必须在每次 RAM 块数据更改后通过调用 API `NvM_SetRamBlockStatus`(参数 `BlockChanged` 设为 TRUE)通知 NVRAM 管理器。
##### 4.1.4.5 抵抗软件变化
NvM 模块在启动期间(即处理 NvM_ReadAll 请求时)的行为受两个配置参数影响:`NvMDynamicConfiguration``NvMResistantToChangedSw`
在不重要响应 NVRAM 块配置变化的 ECU 项目中,将 `NvMDynamicConfiguration` 设为 FALSE。
如果 NVRAM 块的配置发生变化,而 NV 存储器中已存储的 NV 块仍对应旧配置,在 NvM_ReadAll 过程中可能出现严重问题。例如,添加新 NVRAM 块时,许多其他块的标识符可能隐式更改,这可能导致从 NV 存储器读取错误数据。
对于此类情况,可以配置 NvM 模块,使其不尝试使用 NV 存储器数据初始化 RAM 块。这必须通过将 `NvMDynamicConfiguration` 设为 TRUE 完成。NVRAM 配置的更改必须通过集成者修改配置参数 `NvmCompiledConfigID` 来指示给 NvM 模块。
对于 `NvMResistantToChangedSw` 设为 TRUE 的块,集成者必须确保以下配置参数在 ECU 剩余生命周期内不得更改:
- `NvMResistantToChangedSw`(不得从 TRUE 改为 FALSE)
- ShortName
- `NvMBlockUseCrc`
- `NvmBlockCrcType`(如 `NvMBlockUseCrc` 设为 TRUE)
- `NvMStaticBlockIDCheck`
- `NvmNvramDeviceId`
- `NvmBlockManagementType`
- `NvmNvBlockLength`
- `NvmNvBlockBaseNumber`
### 4.2 使用 RTE 访问 NvM
本节列出使用 RTE 访问 NV 数据的可能接口和软件组件类型。
#### 4.2.1 接口
##### 客户端-服务端接口
客户端/服务端接口提供客户端可在服务端上调用的多个操作。在 NvM 向应用程序提供服务的情况下,NvM 充当服务端,应用程序充当客户端。
##### NvDataInterface
非易失数据接口定义要在非易失块组件和原子软件组件之间交换的多个 VariableDataPrototypes。这些 VariableDataPrototypes 可映射到非易失块组件内部实现的完整 RAM 块或 RAM 块元素。
#### 4.2.2 使用 ServiceSwComponent 访问 NV 数据
NvM 配置为 ServiceSwComponent。这里,想要读写数据到 NVRAM 的 SW-C 需要使用客户端-服务端接口利用标准 NvM 服务。
**优点**:
- 启用基本通用配置以适应 NvM 服务和回调
- 每个块有专用端口集
- 应用程序从 NvM 分配的 NVRAM 块块标识符中抽象出来
**恢复默认值**:
如果应用程序维护 RAM 块,可以定义本地于 SW-C 的 ParameterDataPrototypes,使用 PerInstanceParameter 或 ConstantMemory 配置。
**处理通知**:
从 NvM 到应用程序的通知由 RTE 使用客户端-服务端接口实现,NvM 充当客户端,NvBlock 用户充当服务端。
#### 4.2.3 使用 NvBlockSwComponent 访问 NV 数据
这里 NvM 在 RTE 中配置为 NvBlockSwComponent,可用于创建自己的 RAM 块(镜像),可由单个或多个 SW-C 使用 NV-Data 接口部分或完全写入/读取。
**优点**:
- 每个块由 RTE 标识并分配专用 RAM 块
- 应用程序 SW-C 实现独立于 RAM 块的名称和类型
- RAM 块可通过 RTE 提供的部分数据映射机制(PortInterfaceMapping、NvDataMapping)在多个 SW-C 之间共享
- 使用更少内存实现 RAM 块
- 应用程序始终通过端口接口访问 RAM 块,采用更模块化的方法
- 用户可利用 dirtyFlag 机制在 NvBlockSwComponent 中启用写策略
### 4.3 从 NVRAM 初始化 RAM 块
AUTOSAR 中有不同的策略将 RAM 块恢复到其先前值(即进入上次关机前持有的值)。
可在 Rte_Init() 期间使用 InitEvent 调用初始化 runnable 显式逐个读取单个块,使用 `NvM_ReadBlock` / `NvM_ReadPRAMBlock`
更优化的方法是使用单个 NvM 请求 `NvM_ReadAll` 读取所有需要数据持久性的块。在 NvM_ReadAll 期间读取的任何块必须具有显式同步或永久 RAM 块。
```
SWC1 RTE BswM NvM
│ │ │ │
│ ▼ ▼ │
│ BswM_MainFunction │
│ │ NvM_ReadAll() ──►
│ │ │ │ 接收多块请求
│ │ ▼ ▼
│ NvM_MainFunction (循环)
│ │ Rte_SetMirror_NvMB_BlkDesc0
│ ▼
│ Rte_RamBlock = NvMBuffer
│ BswM_NvM_CurrentJobMode(SID_NvM_ReadAll, NVM_REQ_OK)
│ │
│ Rte_Start()
RTE 和 SWC 已初始化
│ Rte_Read_PR_NvD_Data0(&AppVar)
│ AppVar = Rte_RamBlock
```
*图 4:RAM 块初始化时序图*
---
## 5 用例摘要
用例根据 RAM 块由应用程序或 RTE 分配进行分类。
| 章节 | 标题 | 描述 |
|------|------|------|
| 5.1 | 应用 SW-C 访问无永久 RAM 块的 NVRAM 块 | SW-C 负责分配用于通过客户端-服务端端口访问 NVRAM 块的 RAM 块 |
| 5.2 | 应用 SW-C 访问具有永久 RAM 块的 NVRAM 块 | RAM 块在 RTE 中使用 PerInstanceMemory 分配,通过客户端-服务端端口访问 NVRAM 块 |
| 5.3 | 应用 SW-C 使用 NvBlockSwComponentType 访问 NVRAM 块 | RTE 按 NvBlockSwComponent 中的定义分配 RAM 块,然后由单个或多个 SW-C 使用 NV-Data 接口部分/完全写入/读取 |
### 5.1 案例 1:应用 SW-C 访问无永久 RAM 块的 NVRAM 块
在此用例的所有场景中,NvM 配置为 ServiceSwComponent 的形式。任何想要读写数据到 NVRAM 的应用 SW-C 需要使用客户端-服务端接口利用标准 NvM 服务。
#### 5.1.1 案例 1a:应用提供其 RAM 数据区域的引用
为该特定 NvMBlockDescriptor 配置**隐式同步**(`NvMBlockUseSyncMechanism` 参数设为 false)。此机制也称为"NvM 使用临时 RAM 块"。
在此场景中,应用程序提供 RAM 数据区域的引用作为 `NvM_ReadBlock` / `NvM_WriteBlock` API 的参数。因此,用户(SW-C)负责确保 RAM 数据的数据一致性。
不为此用例配置 `NvMRamBlockDataAddress` 参数。
**端口配置**:
- NvMService(R-port: Application, P-port: NvMSWC)
- NvMAdmin(R-port: Application, P-port: NvMSWC)
- NvM_NotifyInitBlock(P-port: Application, R-port: NvMSWC)
- NvM_NotifyJobFinished(P-port: Application, R-port: NvMSWC)
#### 5.1.2 案例 1b:NvM 通过回调获取应用 RAM 数据(NvM 显式同步)
为该特定 NvMBlockDescriptor 配置**显式同步**(`NvMBlockUseSyncMechanism` 参数设为 true)。
在此场景中,应用程序不提供 RAM 数据区域的引用作为 `NvM_ReadBlock` / `NvM_WriteBlock` API 的参数。相反,NvM 通过 `NvMReadRamBlockFromNvCallback` / `NvMWriteRamBlockToNvCallback` 回调函数请求应用程序的数据。
不为此用例配置 `NvMRamBlockDataAddress` 参数。
### 5.2 案例 2:应用 SW-C 访问具有永久 RAM 块的 NVRAM 块
在此用例中,NvM 仍配置为 ServiceSwComponent。
应用程序使用 `PerInstanceMemory` 在 RTE 中定义 RAM 块。RAM 块的引用为永久 RAM 块,配置为 `NvMRamBlockDataAddress`
通过端口接口,应用程序仍可使用 `NvM_ReadBlock` / `NvM_WriteBlock` 来访问 NV 数据。在这种情况下,NvM 知道在哪里读取/写入数据。
**关键参数**:
- `NvMRamBlockDataAddress` 已配置(指向 PerInstanceMemory)
- `NvMBlockUseSyncMechanism` = false(隐式同步)
### 5.3 案例 3:应用 SW-C 使用 NvBlockSwComponentType 访问 NVRAM 块
在此场景中,RTE 按 NvBlockSwComponent 中的定义分配 RAM 块,然后由单个或多个 SW-C 使用 NV-Data 接口部分/完全写入/读取。
NvBlockSwComponent 行为像 NVRAM 块的"持有者",从 NvM 模块的角度看是 NVRAM 块的所有者。
#### 5.3.1 案例 3a:使用 RTE 显式 S/R 通信
应用程序通过显式 Sender-Receiver 通信访问 RAM 块数据:
- `Rte_Read_<port>_<data>(&AppVar)`
- `Rte_Write_<port>_<data>(&AppVar)`
多个子用例:
- 无 dirty 标志支持
- 周期存储
- 关机时存储
- 立即存储
#### 5.3.2 案例 3b:使用 RTE 隐式 S/R 通信
应用程序通过隐式 Sender-Receiver 通信访问 RAM 块数据:
- `Rte_IRead_<port>_<data>()`
- `Rte_IWrite_<port>_<data>(&AppVar)`
类似 5.3.1,有多个子用例:
- 无 dirty 标志支持
- 周期存储
- 关机时存储
- 立即存储
---
## 6 附录
详细的端口配置图、时序图和详细配置示例请参考原文 PDF。
附录包括各用例的:
- 内存分配概览图
- 端口配置图
- 详细时序图(共 23 图)
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_EXP_NVDataHandling v4.4.0(Document ID 810,51 页)。
- 包含核心概念翻译、所有 4 章和 5 章用例摘要。
- 详细时序图和端口配置图请参考原文 PDF。
- 保留所有需求 ID(若有)。
- 模块缩写(NvM、RTE、SW-C、NVRAM 等)和 API 函数名保持英文。
- 配置参数名(如 NvMBlockUseSyncMechanism、NvMRamBlockDataAddress 等)保持英文。
+489
View File
@@ -0,0 +1,489 @@
# EEPROM 驱动需求规范
> **文档标题**: Requirements on EEPROM Driver
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 192
> **文档类型**: SRS (Software Requirements Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Requirements on EEPROM Driver |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 192 |
| 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 | 移除过时引用;编辑性修订 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 编辑性修订 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 按 TPS_standardizationTemplate(TPS_STDT_00078)的形式更新;BSWAndRTE_Features 追溯 |
| 2010-09-30 | 3.1.5 | 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 | "用户须知"修订;增加"版本信息" |
| 2006-11-28 | 2.1 | AUTOSAR Administration | 法律免责声明修订 |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 作为独立文档发布;SRS SPAL V1.0.0 在 Release 2.0 拆分为 12 个独立文档 |
| 2005-05-31 | 1.0 | AUTOSAR Administration | 作为 SRS SPAL V1.0.0 的一部分初始发布 |
---
## 目录
1. [文档范围](#1-文档范围)
2. [如何阅读本文档](#2-如何阅读本文档)
3. [缩略语](#3-缩略语)
4. [功能概述](#4-功能概述)
5. [需求追溯](#5-需求追溯)
6. [需求规范](#6-需求规范)
- 6.1 [功能性需求](#61-功能性需求)
- 6.1.1 [内部 EEPROM 驱动](#611-内部-eeprom-驱动)
- 6.1.2 [外部 EEPROM 驱动](#612-外部-eeprom-驱动)
- 6.2 [非功能性需求](#62-非功能性需求)
7. [参考文献](#7-参考文献)
---
## 1 文档范围
本文档规定了 EEPROM Driver 模块的需求。
**约束**
基础软件模块需求规范的首要范围是非安全相关系统。因此安全需求被分配为中等优先级。
---
## 2 如何阅读本文档
每条需求都有一个以"BSW"(代表"Basic Software")为前缀的唯一标识符。对于任何评审注释、备注或问题,请引用此唯一 ID,而非章节号或页码!
### 2.1 使用的约定
- AUTOSAR 文档中需求的表示形式遵循 [5] 中规定的表格格式。
- 需求中使用以下特定语义。
本文档中的关键字 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY" 和 "OPTIONAL" 需按下述方式解读。
- **MUST**:绝对要求。
- **MUST NOT**:绝对禁止。
- **SHOULD**/**RECOMMENDED**:推荐但有合理理由可忽略。
- **SHOULD NOT**/**NOT RECOMMENDED**:不推荐但有合理理由可接受。
- **MAY**/**OPTIONAL**:可选。
### 2.2 需求结构
每个模块特定章节包含基础软件模块的简短功能描述。每章中同类需求归类于以下小标题之下(如适用):
**功能性需求**:
- 配置
- 初始化
- 正常运行
- 关机运行
- 故障运行
- ……
**非功能性需求**:
- 时序需求
- 资源使用
- 易用性
- 为其他工作包提供的输出
- ……
---
## 3 缩略语
| 缩略语 | 描述 |
|--------|------|
| CS | Chip select(片选) |
| DIO | Digital Input Output(数字输入输出) |
| ECU | Electric Control Unit(电子控制单元) |
| EOL | End Of Line(下线) |
| ICU | Interrupt Capture Unit(中断捕获单元) |
| MAL | Microcontroller Abstraction Layer 旧名(已由 MCAL 替代) |
| MCAL | Microcontroller Abstraction Layer(微控制器抽象层) |
| MCU | Microcontroller Unit(微控制器单元) |
| MMU | Memory Management Unit(内存管理单元) |
| Master | 控制其他设备(slave)的设备 |
| Slave | 完全被 master 设备控制的设备 |
| NMI | Non maskable interrupt(不可屏蔽中断) |
| OS | Operating System(操作系统) |
| PLL | Phase Locked Loop(锁相环) |
| PWM | Pulse Width Modulation(脉宽调制) |
| RX | Reception(总线通信中的接收) |
| SPAL | 本工作组的名称 |
| SFR | Special Function Register(特殊功能寄存器) |
| RTE | Runtime environment(运行时环境) |
| WP | Work Package(工作包) |
| 缩写 | 描述 |
|------|------|
| STD | Standard(标准) |
| REQ | Requirement(需求) |
| UNINIT | Uninitialized(未初始化) |
---
## 4 功能概述
### 4.1 内部 EEPROM 驱动
内部 EEPROM 驱动提供初始化以及对内部 EEPROM 读、写、擦的服务。
### 4.2 外部 EEPROM 驱动
外部 EEPROM 驱动提供初始化以及对外部 EEPROM 读、写、擦的服务。
---
## 5 需求追溯
| 需求 | 描述 | 满足者 |
|------|------|--------|
| RS_BRF_01000 | AUTOSAR 架构应将 BSW 组织为硬件无关层和硬件相关层 | SRS_Eep_12053 |
| RS_BRF_01008 | AUTOSAR 应将硬件相关层组织为微控制器无关层和微控制器相关层 | SRS_Eep_12053 |
| RS_BRF_01080 | AUTOSAR 应允许访问内部和外部外设 | SRS_Eep_12124, SRS_Eep_12164 |
| RS_BRF_01136 | AUTOSAR 应支持已配置 BSW 数据在系统启动后才解析的变体 | SRS_Eep_00096, SRS_Eep_12164 |
| RS_BRF_01808 | AUTOSAR 非易失存储器处理应支持不同种类的存储器硬件 | SRS_Eep_12051, SRS_Eep_12052 |
| RS_BRF_01928 | AUTOSAR 微控制器抽象应提供对非易失存储器硬件的访问 | SRS_Eep_00087~00095, SRS_Eep_12047, SRS_Eep_12050, SRS_Eep_12072, SRS_Eep_12091, SRS_Eep_12156, SRS_Eep_12157 |
---
## 6 需求规范
### 6.1 功能性需求
#### 6.1.1 内部 EEPROM 驱动
##### 6.1.1.1 配置
###### 6.1.1.1.1 [SRS_Eep_00096] EEPROM 驱动应静态配置
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动的以下常量应可静态配置:<br>1. EEPROM 基地址<br>2. EEPROM 大小(可等于或小于物理 EEPROM 大小)<br>3. 作业处理函数内处理的最大块大小(写、擦)<br>4. 普通模式和快速模式 EEPROM 下作业处理函数内处理的最大读块大小<br>5. 读、写、擦周期作业处理函数的调用周期 |
| 理由 | 基本配置 |
| 用例 | 第 5 项:当 EEPROM 硬件不提供该时序和/或需要截止时间检查时所需 |
| 依赖 | [SRS_Eep_12072] 作业处理 快速模式;[SRS_Eep_12157] 作业处理 普通模式 |
| 支持材料 | -- |
⌋(RS_BRF_01136)
###### 6.1.1.1.2 [SRS_Eep_12071] EEPROM 属性应被发布
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动描述应发布以下 EEPROM 属性:<br>- EEPROM 总物理大小<br>- 已擦除 EEPROM 单元的值<br>- 一个 EEPROM 单元的大小(如 8bit、16bit 等)<br>- 物理内存分段(最小可写/可读/可擦单元) |
| 理由 | 用于配置上层模块 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
##### 6.1.1.2 正常运行
###### 6.1.1.2.1 [SRS_Eep_00087] EEPROM 驱动应提供异步读功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动应提供异步读功能,从内部 EEPROM 中所请求的 EEPROM 地址开始按所传入的长度读取数据块。EEPROM 驱动应提供按字节的数据读访问。 |
| 理由 | 基本功能 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.2 [SRS_Eep_00088] EEPROM 驱动应提供异步写功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动应提供异步写功能,从所请求的 EEPROM 地址开始按所传入的长度向内部 EEPROM 写入数据块。<br><br>如果被寻址的 EEPROM 单元非空,在执行写命令前应自动执行擦除操作。<br><br>如果可擦块与写请求不对齐,驱动应缓存并重写块中受影响的额外数据。<br><br>EEPROM 驱动应提供按字节的数据写访问。 |
| 理由 | 基本功能 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.3 [SRS_Eep_00089] EEPROM 驱动应提供异步擦除功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动应提供异步擦除功能,从所请求的 EEPROM 地址开始按所传入的长度擦除内部 EEPROM 中的数据块。<br><br>如果可擦块与擦除请求不对齐,驱动应缓存并重写块中受影响的额外数据。<br><br>EEPROM 驱动应内部选择最佳擦除策略。例如,如果 EEPROM 硬件支持块擦除命令且要擦除的数据块边界适合物理可擦块时,使用块擦除命令。 |
| 理由 | 对于某些 EEPROM 类型,已擦除的 EEPROM 可被更快地编程。 |
| 用例 | - ECU 生产与快速 EOL 编程<br>- 快速保存崩溃数据<br>- 确保数据确实已擦除 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.4 [SRS_Eep_12091] EEPROM 驱动应提供异步比较功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动应提供异步比较功能,按所传入的长度比较内存中的一段与 EEPROM 中的一段。<br><br>EEPROM 驱动应提供按字节的数据比较访问。 |
| 理由 | 基本功能 |
| 用例 | 热复位后比较完整块可以加快系统恢复。该函数也可用于在写入 EEPROM 后验证完整数据块。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.5 [SRS_Eep_00090] EEPROM 驱动应提供同步取消功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动应提供同步取消函数,停止当前处理的作业。受影响 EEPROM 单元的状态和数据是未定义的!EEPROM 驱动和控制器本身应为有效作业做好准备。 |
| 理由 | 紧急写命令可在无任何延迟下执行 |
| 用例 | 检测到车辆碰撞时写入碰撞相关数据 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.6 [SRS_Eep_00091] EEPROM 驱动应提供返回作业处理状态的同步函数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动应提供返回作业处理状态的同步函数。 |
| 理由 | 检查 EEPROM 驱动是否忙 |
| 用例 | 仅示例(将在 API 定义中规定):<br>- 复位后及成功初始化前,RW 状态为 UNINIT。<br>- 成功初始化后,RW 状态为 READY。<br>- 作业处理期间,RW 状态为 BUSY。<br>- 取消作业后,RW 状态为 READY。<br>- 检测到错误后,RW 状态为相关 ERROR_xxx 状态。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.7 [SRS_Eep_12156] EEPROM 驱动应提供同步选择功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动应提供同步函数,允许在普通和快速 EEPROM 访问之间切换操作模式。 |
| 理由 | ECU 启动期间快速读取操作,ECU 关机期间快速写入操作,正常 ECU 模式期间"协作式"操作 |
| 用例 | -- |
| 依赖 | [SRS_Eep_12072], [SRS_Eep_12157], [SRS_Eep_12124] |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.8 [SRS_Eep_00092] 仅当受影响可擦块的至少一个数据值与要写入的数据值不同时,EEPROM 驱动才应写入数据
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 仅当 EEPROM 中受影响可擦块的至少一个数据值与要写入的数据值不同时,EEPROM 驱动才应写入数据。<br><br>此功能应可静态配置(开/关)。 |
| 理由 | 仅在必要时进行擦除和写入循环。从而延长 EEPROM 的寿命。 |
| 用例 | 值"0x45"将被写入 EEPROM 单元。该 EEPROM 单元已包含此值。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.9 [SRS_Eep_00094] EEPROM 驱动应处理 EEPROM 内存分段
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动应处理 EEPROM 内存分段。EEPROM 驱动的读、写、擦和比较函数应在必要时使用读-修改-写操作解决物理 EEPROM 块大小和段边界。 |
| 理由 | 不同 EEPROM 类型的 API 行为相同。EEPROM 驱动知道处理和解决分段的最有效方式。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.10 [SRS_Eep_00095] EEPROM 驱动一次只应处理一个作业
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动一次只应处理一个作业(读、写、擦或比较)。运行中作业期间请求的作业应被拒绝并作为错误处理。<br><br>此错误检测应可静态配置(开/关)。<br><br>进一步说明:调用函数负责作业的缓存和排队,而非 EEPROM 驱动。 |
| 理由 | 不同的操作(读、写、擦、比较)不能同时处理,且结果依赖于执行顺序。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.11 [SRS_Eep_12047] EEPROM 驱动应提供必须为作业处理而调用的函数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动应提供必须为作业处理而调用的函数。所有作业处理应在此函数内完成。<br><br>如果硬件支持,此函数可从中断调用。否则,应由专门的模块处理此函数。 |
| 理由 | 允许作业处理的灵活可能性。满足 OS 独立性需求。 |
| 用例 | 示例:作业处理函数每 10ms 被调用一次。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.12 [SRS_Eep_12157] 在普通模式下,EEPROM 驱动作业处理函数的一个周期应将从 EEPROM 读取的块大小限制为已配置的默认块大小
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 在普通模式下,EEPROM 驱动作业处理函数的一个周期应将从 EEPROM 读取的块大小限制为已配置的默认块大小。<br><br>简化说明:作业处理函数的一次调用中仅读取少量字节。 |
| 理由 | EEPROM 驱动在正常操作模式下的协作式、非阻塞调度。 |
| 用例 | 示例:在普通 EEPROM 模式下,读取数据的最大块大小为 16。在快速 EEPROM 模式下,读取数据的最大块大小为 128。 |
| 依赖 | [SRS_Eep_00096], [SRS_Eep_12156] |
| 支持材料 | -- |
⌋(RS_BRF_01928)
###### 6.1.1.2.13 [SRS_Eep_12072] 在快速模式下,EEPROM 驱动作业处理函数的一个周期应将从 EEPROM 读取的块大小限制为已配置的最大块大小
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 在快速模式下,EEPROM 驱动作业处理函数的一个周期应将从 EEPROM 读取的块大小限制为已配置的最大块大小。<br><br>简化说明:作业处理函数的一次调用中读取大块数据。 |
| 理由 | 允许在 ECU 启动期间快速读取和检查 EEPROM |
| 用例 | 示例:在普通 EEPROM 模式下,读取数据的最大块大小为 16。在快速 EEPROM 模式下,读取数据的最大块大小为 128。 |
| 依赖 | [SRS_Eep_00096], [SRS_Eep_12156] |
| 支持材料 | -- |
⌋(RS_BRF_01928)
#### 6.1.2 外部 EEPROM 驱动
##### 6.1.2.1 通用
###### 6.1.2.1.1 [SRS_Eep_12051] 外部和内部 EEPROM 驱动应适用相同的需求
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 对于外部 EEPROM 驱动,应适用与内部 EEPROM 驱动相同的需求。 |
| 理由 | 内部和外部 EEPROM 之间无功能差异。保持相同的功能范围。 |
| 用例 | STAR12 具有内部 EEPROM。NEC V850 需要外部 EEPROM。两种微控制器上应使用相同的 NVRAM Manager。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01808)
##### 6.1.2.2 配置
###### 6.1.2.2.1 [SRS_Eep_12164] 外部 SPI EEPROM 驱动应允许静态配置所需的 SPI 参数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 外部 SPI EEPROM 驱动应允许静态配置所需的 SPI 参数。这些参数由 SPI Handler 规范指定。 |
| 理由 | SPI 访问的基本配置 |
| 用例 | 在同一 SPI 总线上同时使用 SPI EEPROM 驱动与其他 SPI 设备驱动。 |
| 依赖 | [SRS_Eep_00096] EEPROM 驱动静态配置 |
| 支持材料 | AUTOSAR SWS SPI Handler |
⌋(RS_BRF_01080, RS_BRF_01136)
##### 6.1.2.3 正常运行
###### 6.1.2.3.1 [SRS_Eep_12124] 外部 SPI EEPROM 设备的 EEPROM 驱动应根据当前 EEPROM 模式访问 SPI
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 外部 SPI EEPROM 设备的 EEPROM 驱动应根据当前 EEPROM 模式访问 SPI:<br>- 普通 EEPROM 模式:具有单字节/字模式的 SPI 通道<br>- 快速 EEPROM 模式:具有突发模式的 SPI 通道 |
| 理由 | ECU 启动期间快速读取操作,正常操作期间非阻塞 SPI 使用 |
| 用例 | 外部 SPI EEPROM,SPI 波特率 500kbaud。<br><br>ECU 启动期间,EEPROM 以突发模式运行以减少启动时间。EEPROM 访问(32 字节+头部)阻塞 SPI 总线约 560µs。<br><br>正常运行期间,EEPROM 以普通模式运行,以便 EEPROM 驱动的 SPI 总线访问不会阻塞优先级更高的通信请求。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01080)
### 6.2 非功能性需求
#### 6.2.1 内部 EEPROM 驱动
##### 6.2.1.1 [SRS_Eep_12050] EEPROM 驱动的作业处理函数应仅处理 EEPROM 硬件可处理的数据量
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM 驱动的作业处理函数应仅处理 EEPROM 硬件在一步内可处理的数据(特别是写操作),或仅处理已定义的用户上限的数据量(特别是读操作)。 |
| 理由 | 最小化处理器负载,减少阻塞时间。 |
| 用例 | 作业处理函数在一次调用中执行一个字节的写入和最多 8 字节的读取。 |
| 依赖 | [SRS_Eep_12157] 作业处理 普通模式 |
| 支持材料 | -- |
⌋(RS_BRF_01928)
#### 6.2.2 外部 EEPROM 驱动
##### 6.2.2.1 [SRS_Eep_12052] 外部 EEPROM 驱动应与内部 EEPROM 驱动具有语义相同的 API
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 外部 EEPROM 驱动应与内部 EEPROM 驱动具有语义相同的 API。 |
| 理由 | 简化内存抽象。保持内部和外部 EEPROM 的处理类似。 |
| 用例 | STAR12 具有内部 EEPROM。NEC V850 需要外部 EEPROM。两种微控制器上应使用相同的 NVRAM Manager。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01808)
##### 6.2.2.2 [SRS_Eep_12053] 外部 EEPROM 驱动的源代码应与底层微控制器无关
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 外部 EEPROM 驱动的源代码应与底层微控制器无关。 |
| 理由 | 在多个微控制器上重用外部 EEPROM 驱动 |
| 用例 | SPI EEPROM 设备的同一外部 EEPROM 驱动可以无任何修改地在 NEC V850 和 MPC563 上使用,通过标准化的 SPI Handler 接口。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01008, RS_BRF_01000)
---
## 7 参考文献
### 7.1 AUTOSAR 交付物
[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] General Requirements on SPAL
AUTOSAR_SRS_SPALGeneral.pdf
[5] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SRS_EEPROMDriver v4.4.0(Document ID 192)。
- 保留所有需求 ID(SRS_Eep_xxxxx、RS_BRF_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(Eep、SPI、ECU 等)保持英文。
+551
View File
@@ -0,0 +1,551 @@
# Flash 驱动需求规范
> **文档标题**: Requirements on Flash Driver
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 194
> **文档类型**: SRS (Software Requirements Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Requirements on Flash Driver |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 194 |
| 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 | 移除 HIS 引用 |
| 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 | 编辑性修订 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 编辑性修订 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 对需求追溯进行形式化重做;按 TPS_STDT_00078 重做需求;与 BSW & RTE 特性关联 |
| 2010-09-30 | 3.1.5 | 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 | "用户须知"修订;增加"版本信息" |
| 2006-11-28 | 2.1 | AUTOSAR Administration | 法律免责声明修订 |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 作为独立文档发布;SRS SPAL V1.0.0 在 Release 2.0 拆分为 15 个独立文档;新增 SRS_Fls_13301/13302/13303/13304;修订 SRS_Fls_12132 |
| 2005-05-31 | 1.0 | AUTOSAR Administration | 作为 SRS SPAL V1.0.0 的一部分初始发布 |
---
## 目录
1. [文档范围](#1-文档范围)
2. [如何阅读本文档](#2-如何阅读本文档)
3. [缩略语](#3-缩略语)
4. [功能概述](#4-功能概述)
5. [需求追溯](#5-需求追溯)
6. [需求规范](#6-需求规范)
- 6.1 [功能性需求](#61-功能性需求)
- 6.1.1 [内部 Flash 驱动](#611-内部-flash-驱动)
- 6.1.2 [外部 Flash 驱动](#612-外部-flash-驱动)
- 6.2 [非功能性需求](#62-非功能性需求)
7. [参考文献](#7-参考文献)
---
## 1 文档范围
本文档规定了 Flash Driver 模块的需求。
**约束**
基础软件模块需求规范的首要范围是非安全相关系统。因此安全需求被分配为中等优先级。
---
## 2 如何阅读本文档
每条需求都有一个以"BSW"为前缀的唯一标识符。对于任何评审注释、备注或问题,请引用此唯一 ID,而非章节号或页码!
### 2.1 使用的约定
AUTOSAR 文档中需求的表示形式遵循 [5] 中规定的表格格式。
关键字 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY" 和 "OPTIONAL" 按 IETF 风格解读。
### 2.2 需求结构
**功能性需求**:配置、初始化、正常运行、关机运行、故障运行、……
**非功能性需求**:时序需求、资源使用、易用性、为其他工作包提供的输出、……
---
## 3 缩略语
| 缩略语 | 描述 |
|--------|------|
| CS | Chip select(片选) |
| DIO | Digital Input Output(数字输入输出) |
| ECU | Electric Control Unit(电子控制单元) |
| EOL | End Of Line(下线) |
| ICU | Interrupt Capture Unit(中断捕获单元) |
| MAL | Microcontroller Abstraction Layer 旧名(已由 MCAL 替代) |
| MCAL | Microcontroller Abstraction Layer(微控制器抽象层) |
| MCU | Microcontroller Unit(微控制器单元) |
| MMU | Memory Management Unit(内存管理单元) |
| Master | 控制其他设备(slave)的设备 |
| Slave | 完全被 master 设备控制的设备 |
| NMI | Non maskable interrupt(不可屏蔽中断) |
| OS | Operating System(操作系统) |
| PLL | Phase Locked Loop(锁相环) |
| PWM | Pulse Width Modulation(脉宽调制) |
| RX | Reception(总线通信中的接收) |
| SPAL | 本工作组的名称 |
| SFR | Special Function Register(特殊功能寄存器) |
| RTE | Runtime environment(运行时环境) |
| WP | Work Package(工作包) |
| STD | Standard(标准) |
| REQ | Requirement(需求) |
| UNINIT | Uninitialized(未初始化) |
---
## 4 功能概述
### 4.1 内部 Flash 驱动
内部 Flash 驱动提供初始化以及对内部 Flash 内存读、写、擦的服务。Flash 驱动提供内置加载器能力,允许将 Flash 访问代码加载到 RAM 并从那里执行写/擦操作(如需要)。
在 ECU 的应用模式下,Flash 驱动仅由 Flash EEPROM 仿真模块用于写入数据。不打算在应用模式下将程序代码写入 Flash 内存。这应在引导模式下完成,这超出 AUTOSAR 范围。
### 4.2 外部 Flash 驱动
外部 Flash 驱动提供初始化以及对外部 Flash 内存读、写、擦的服务。它与内部 Flash 驱动具有相同的功能范围。
---
## 5 需求追溯
| 需求 | 描述 | 满足者 |
|------|------|--------|
| BS_BRF_00129 | - | SRS_Fls_12141, 12158, 12160 |
| BS_BRF_01008 | - | SRS_Fls_12147, 12149 |
| BS_BRF_01080 | - | SRS_Fls_12147, 12148 |
| BS_BRF_01136 | - | SRS_Fls_12132, 12182 |
| BS_BRF_01144 | - | SRS_Fls_13303, 13304 |
| BS_BRF_02232 | - | SRS_Fls_12107, 12141, 12159 |
| BS_BRF_1800 | - | SRS_Fls_12147, 12149 |
| RS_BRF_01144 | AUTOSAR 应支持允许在中断响应时间与运行时间之间权衡的配置参数 | SRS_Fls_13302 |
| RS_BRF_02232 | AUTOSAR 应支持具有运行时断言检查的开发 | SRS_Fls_12158, 12160 |
---
## 6 需求规范
### 6.1 功能性需求
#### 6.1.1 内部 Flash 驱动
##### 6.1.1.1 配置
###### 6.1.1.1.1 [SRS_Fls_12132] Flash 驱动应可静态配置
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动的以下常量应可静态配置:<br>1. Flash 内存基地址<br>2. Flash 内存大小<br>3. 普通模式下作业处理函数内处理的读(比较)、写、擦操作的最大块大小<br>4. 快速模式下作业处理函数内处理的读(比较)、写、擦操作的最大块大小<br>5. 写和擦操作的作业处理:中断触发或周期作业处理函数(轮询)<br>6. 写和擦、保护的周期作业处理函数的调用周期(如 Flash 硬件不提供该时序)<br>7. Flash 写保护 |
| 理由 | 基本配置 |
| 用例 | 1+2:也可用于限制可访问的 Flash 内存区域(防止程序代码被覆盖);4:某些微控制器提供 Flash 内存中断;5:当 Flash 内存硬件不提供该时序和/或需要截止时间检查时所需 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(BS_BRF_01136)
###### 6.1.1.1.2 [SRS_Fls_12133] Flash 内存属性应被发布
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动描述应发布以下 Flash 内存属性:<br>1. 已擦除 Flash 单元的值<br>2. 一个 Flash 单元的大小(如 8bit、16bit 等)<br>3. Flash 内存大小(字节)<br>4. Flash 内存基地址<br>5. 物理内存分段(最小可写/可读/可擦/可保护单元) |
| 理由 | 用于配置上层模块 |
| 用例 | 1: NVRAM 管理器希望执行 Flash 空白检查,因此需要已擦除 Flash 单元的值;5: 在 NVRAM 布局配置期间,数据块不应与分段边界错位 |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
##### 6.1.1.2 正常运行
###### 6.1.1.2.1 [SRS_Fls_12134] Flash 驱动应提供异步读功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应提供异步读功能,从所请求的 Flash 地址开始按所传入的长度从内部 Flash 内存读取数据块。 |
| 理由 | 基本功能 |
| 用例 | Flash EEPROM 仿真;访问非内存映射的 Flash |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
###### 6.1.1.2.2 [SRS_Fls_12135] Flash 驱动应提供异步写功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应提供异步写功能,从所请求的 Flash 地址开始按所传入的长度向内部 Flash 内存写入数据块。<br><br>Flash 地址和长度应与 Flash 内存的物理内存分段对齐。未对齐的写请求应由 Flash 驱动以错误码拒绝。 |
| 理由 | 基本功能 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
###### 6.1.1.2.3 [SRS_Fls_12136] Flash 驱动应提供异步擦除功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应提供异步擦除功能,从所请求的 Flash 地址开始按所传入的长度擦除一个或多个 Flash 段。<br><br>Flash 地址和长度应与 Flash 内存的物理内存分段对齐。未对齐的擦除请求应由 Flash 驱动以错误码拒绝。<br><br>Flash 驱动应内部选择最佳擦除策略。例如,如果 Flash 硬件支持块擦除命令则使用之。 |
| 理由 | 基本功能 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
###### 6.1.1.2.4 [SRS_Fls_13301] Flash 驱动应提供异步比较功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应提供异步比较函数,按所传入的长度比较内存中的一段与 Flash 内存中的一段。 |
| 理由 | Flash 驱动应提供与 EEPROM 驱动相同的功能,以便对 NVRAM 管理器透明。 |
| 用例 | Flash EEPROM 仿真中的内部机制可使用此函数确定是否需要擦除/写入扇区/页。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
###### 6.1.1.2.5 [SRS_Fls_12137] Flash 驱动应提供同步取消功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应提供同步取消函数,停止当前处理的作业。受影响 Flash 单元的状态和数据是未定义的!<br>Flash 驱动和控制器本身应为新作业做好准备。<br><br>注:大多数情况下,正在进行的硬件写/擦过程不能停止,但后续数据块的写/擦将被中止。 |
| 理由 | 仅 EEPROM 仿真所需(紧急写命令可在无任何延迟下执行)。 |
| 用例 | 检测到车辆碰撞时无延迟写入碰撞相关数据。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
###### 6.1.1.2.6 [SRS_Fls_12138] Flash 驱动应提供同步状态函数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应提供同步函数,返回作业处理状态。 |
| 理由 | 检查 Flash 驱动是否忙 |
| 用例 | - 复位后及成功初始化前,驱动状态为 UNINIT。<br>- 成功初始化后,驱动状态为 IDLE。<br>- 作业处理期间,驱动状态为 BUSY。<br>- 取消作业后,驱动状态为 IDLE。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
###### 6.1.1.2.7 [SRS_Fls_13302] Flash 驱动应提供同步选择函数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应提供同步函数,允许在普通和快速 Flash 内存访问之间切换操作模式。 |
| 理由 | Flash 驱动应提供与 EEPROM 驱动相同的功能,以便对 NVRAM 管理器透明。 |
| 用例 | -- |
| 依赖 | [SRS_Fls_12132], [SRS_Fls_13304], [SRS_Fls_13303] |
| 支持材料 | -- |
⌋(RS_BRF_01144)
###### 6.1.1.2.8 [SRS_Fls_12159] Flash 驱动的写和擦函数应检查传入的地址参数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动的写和擦函数应检查传入的地址参数是否在有效配置的地址边界内。超出允许边界的写/擦访问应以错误码拒绝。 |
| 理由 | 避免对不允许的 Flash 区域(如程序代码)的写入尝试。 |
| 用例 | -- |
| 依赖 | [SRS_Fls_12132] Flash 驱动静态配置,项 1+2 |
| 支持材料 | -- |
⌋(BS_BRF_02232)
###### 6.1.1.2.9 [SRS_Fls_12158] 写入之前,Flash 驱动应验证寻址的内存区域是否已擦除
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 向 Flash 内存写入数据之前,Flash 驱动应验证寻址的内存区域是否已擦除。<br><br>如果内存未擦除,写函数的处理应中止并发出错误通知。<br><br>此特性应可静态配置(开/关)。 |
| 理由 | 避免对未擦除 Flash 内存的写入尝试。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02232, BS_BRF_00129)
###### 6.1.1.2.10 [SRS_Fls_12141] Flash 驱动应验证已写入的数据
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应在每次写访问后通过从 Flash 回读并与源数据比较来验证已写入的数据。<br>差异应作为错误通知。<br>检查应在写函数的处理内完成。<br><br>此特性应可静态配置(开/关)。 |
| 理由 | 检测数据损坏。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(BS_BRF_02232, BS_BRF_00129)
###### 6.1.1.2.11 [SRS_Fls_12160] 执行擦除作业后,Flash 驱动应验证寻址的块是否已完全擦除
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 执行擦除作业后,Flash 驱动应验证寻址的块是否已完全擦除。此特性应可静态配置(开/关)。 |
| 理由 | -- |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02232, BS_BRF_00129)
###### 6.1.1.2.12 [SRS_Fls_12143] Flash 驱动一次只应处理一个作业
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动一次只应处理一个作业(写或擦)。运行中作业期间的作业请求应被拒绝并作为错误处理。<br><br>此错误检测应可静态配置(开/关)。<br><br>进一步说明:调用函数负责作业的缓存和排队,而非 Flash 驱动。 |
| 理由 | 写和擦等不同操作不能同时处理,且结果依赖于执行顺序。 |
| 用例 | 开发期间启用错误检测。生产代码出于效率原因禁用错误检测。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
###### 6.1.1.2.13 [SRS_Fls_12144] Flash 驱动应提供必须为作业处理而调用的函数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应提供必须为作业处理而调用的函数。所有作业处理应在此函数内完成。<br><br>如果硬件支持,此函数可从中断调用。否则,可以固定周期时间调用此函数。 |
| 理由 | 允许作业处理的灵活可能性。 |
| 用例 | 示例:作业处理函数每 10ms 被调用一次。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
###### 6.1.1.2.14 [SRS_Fls_13303] 在普通模式下,Flash 驱动作业处理函数的一个周期应将块大小限制为默认块大小
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 在普通模式下,Flash 驱动作业处理函数的一个周期应将从 Flash 内存读取的块大小限制为已配置的默认块大小。 |
| 理由 | Flash 驱动应提供与 EEPROM 驱动相同的功能,以便对 NVRAM 管理器透明。 |
| 用例 | 普通模式下读取数据最大块大小 16;快速模式下读取数据最大块大小 128。 |
| 依赖 | [SRS_Fls_12132], [SRS_Fls_13302] |
| 支持材料 | -- |
⌋(BS_BRF_01144)
###### 6.1.1.2.15 [SRS_Fls_13304] 在快速模式下,Flash 驱动作业处理函数的一个周期应将块大小限制为最大块大小
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 在快速模式下,Flash 驱动作业处理函数的一个周期应将从 Flash 内存读取的块大小限制为已配置的最大块大小。 |
| 理由 | Flash 驱动应提供与 EEPROM 驱动相同的功能,以便对 NVRAM 管理器透明。 |
| 用例 | 普通模式下读取数据最大块大小 16;快速模式下读取数据最大块大小 128。 |
| 依赖 | [SRS_Fls_12132], [SRS_Fls_13302] |
| 支持材料 | -- |
⌋(BS_BRF_01144)
###### 6.1.1.2.16 [SRS_Fls_12193] Flash 驱动应在每次擦或写作业启动时将访问 Flash 硬件的代码加载到 RAM
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应在每次擦或写作业启动时将访问 Flash 硬件的代码(内部擦/写例程)加载到 RAM。<br><br>此特性应可静态配置开/关(预编译配置)。 |
| 理由 | 在对 Flash 库的擦/写操作期间,无法读取该库(因此无法执行位于该库内的代码)。 |
| 用例 | 包含 Flash 访问例程的 Flash 库也是当前被擦/写操作寻址的库。 |
| 依赖 | -- |
| 支持材料 | 仅当擦/写例程位于要被擦除或重新编程的同一库中时才需要。 |
⌋()
###### 6.1.1.2.17 [SRS_Fls_12194] Flash 驱动应从 RAM 执行访问 Flash 硬件的代码
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应从 RAM 执行访问 Flash 硬件的代码(内部擦/写例程)。此需求仅当 Flash 访问代码已加载到 RAM 时适用。<br><br>Flash 驱动必须确保此代码执行不被中断。因此该例程的运行时间应保持尽可能短。 |
| 理由 | 在对 Flash 库的擦/写操作期间,无法读取该库。 |
| 用例 | 包含 Flash 驱动代码的 Flash 库也是当前被擦/写操作寻址的库。 |
| 依赖 | [SRS_Fls_12193] 作业启动时将 Flash 访问代码加载到 RAM |
| 支持材料 | -- |
⌋()
###### 6.1.1.2.18 [SRS_Fls_13300] 当前作业完成或取消后,Flash 驱动应从 RAM 中移除访问 Flash 硬件的代码
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 当前擦或写作业完成或取消后,Flash 驱动应从 RAM 中移除访问 Flash 硬件的代码(内部擦/写例程)。<br><br>从 RAM 中移除 Flash 访问代码仅在 Flash 驱动于擦/写作业启动期间将该代码加载到 RAM 时才必要。如果 FAC 在初始化期间已加载到 RAM,Flash 驱动不应将代码从 RAM 中移除。<br><br>此特性应可静态配置开/关(预编译配置)。 |
| 理由 | 应从 RAM 中移除 Flash 访问代码,以避免 Flash 驱动操作之外可能有害的操作(Flash 擦/写)。 |
| 用例 | 用于擦除 Flash 内存的 Flash 访问代码在擦除作业开始时加载,擦除作业完成后卸载,以防止进一步(意外)的 Flash 内存擦除。 |
| 依赖 | [SRS_Fls_12193] 作业启动时将 Flash 访问代码加载到 RAM |
| 支持材料 | -- |
⌋()
#### 6.1.2 外部 Flash 驱动
##### 6.1.2.1 通用
###### 6.1.2.1.1 [SRS_Fls_12147] 外部和内部 Flash 驱动应适用相同的需求
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 对于外部 Flash 驱动,应适用与内部 Flash 驱动相同的需求。 |
| 理由 | 内部和外部 Flash 内存之间无功能差异。保持相同的功能范围。 |
| 用例 | STAR12 具有内部 Flash。其他微控制器仅使用外部 Flash。两种类型微控制器上应使用相同的 NVRAM Manager。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(BS_BRF_01080, BS_BRF_01008, BS_BRF_1800)
##### 6.1.2.2 配置
###### 6.1.2.2.1 [SRS_Fls_12182] 外部 Flash 驱动应允许静态配置硬件 Flash ID 和挂起时间
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 除基本配置参数外,外部 Flash 驱动应允许静态配置以下参数:<br>1. 预期的硬件 Flash ID<br>2. 最大读访问阻塞时间("挂起时间") |
| 理由 | 基本配置 |
| 用例 | 1: [SRS_Fls_12107] 检查 Flash 类型;2: [SRS_Fls_12184] 限制读访问阻塞时间 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(BS_BRF_01136)
##### 6.1.2.3 故障操作
###### 6.1.2.3.1 [SRS_Fls_12107] 外部 Flash 驱动应检查配置的 Flash 类型是否与硬件 Flash ID 匹配
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 外部 Flash 驱动应在其初始化函数内检查配置的 Flash 类型是否与硬件 Flash ID 匹配。检测到的不匹配应报告给 Error Manager。<br><br>仅当 Flash 硬件提供 Flash ID 时才提供此检查。 |
| 理由 | 避免使用错误的编程配置 |
| 用例 | -- |
| 依赖 | [SRS_Fls_12182] 外部 Flash 驱动静态配置 |
| 支持材料 | Requirements Specification CAS LLD Configuration Tool: RS_LLD_CONFIG/7.11 |
⌋(BS_BRF_02232)
### 6.2 非功能性需求
#### 6.2.1 内部 Flash 驱动
##### 6.2.1.1 [SRS_Fls_12145] Flash 驱动的作业处理函数应仅处理 Flash 硬件可处理的数据量
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动的作业处理函数应仅处理 Flash 硬件在一步内可处理的数据(特别是写操作),或仅处理已定义的用户上限的数据量(特别是读操作)。 |
| 理由 | 最小化处理器负载,减少阻塞时间。 |
| 用例 | 例如,作业处理函数在一次调用中执行一个字节的写入和最多 8 字节的读取。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋()
#### 6.2.2 外部 Flash 驱动
##### 6.2.2.1 [SRS_Fls_12184] Flash 驱动应将读访问阻塞时间限制为配置的时间
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 驱动应将读访问阻塞时间限制为配置的时间(最大读访问阻塞时间)。 |
| 理由 | 避免阻塞整个系统的调度和中断。 |
| 用例 | Bosch EDC16:阻塞时间最大为 40µs。 |
| 依赖 | [SRS_Fls_12194], [SRS_Fls_12182] |
| 支持材料 | -- |
⌋()
##### 6.2.2.2 [SRS_Fls_12148] 外部 Flash 驱动应与内部 Flash 驱动具有语义相同的 API
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 外部 Flash 驱动应与内部 Flash 驱动具有语义相同的 API。 |
| 理由 | 简化内存抽象。保持内部和外部 Flash 内存的处理类似。 |
| 用例 | 一个 ECU 使用具有内部 Flash 的 STAR12。另一个 ECU 使用仅有外部 Flash 的控制器。两种微控制器上应使用相同的上层(NVRAM Manager、Flash/EEPROM 仿真)。 |
| 依赖 | 内部 Flash 驱动需求。 |
| 支持材料 | -- |
⌋(BS_BRF_01080)
##### 6.2.2.3 [SRS_Fls_12149] 外部 Flash 驱动的源代码应与底层微控制器无关
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 外部 Flash 驱动的源代码应与底层微控制器无关。 |
| 理由 | 在多个微控制器上重用外部 Flash 驱动 |
| 用例 | Flash 设备的同一外部 Flash 驱动可以无任何修改地在 NEC V850 和 MPC563 上使用。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(BS_BRF_01008, BS_BRF_1800)
---
## 7 参考文献
### 7.1 AUTOSAR 交付物
[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] General Requirements on SPAL
AUTOSAR_SRS_SPALGeneral.pdf
[5] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SRS_FlashDriver v4.4.0(Document ID 194)。
- 保留所有需求 ID(SRS_Fls_xxxxx、BS_BRF_xxxxx、RS_BRF_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(Fls、ECU、NVRAM、EEPROM 等)保持英文。
+488
View File
@@ -0,0 +1,488 @@
# Flash 测试需求规范
> **文档标题**: Requirements on Flash Test
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 260
> **文档类型**: SRS (Software Requirements Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Requirements on Flash Test |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 260 |
| 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 | 移除 HIS 引用;将"default error"重命名为"development error";小幅更正/澄清/编辑性修订 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 编辑性修订 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 编辑性修订 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 编辑性修订 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 将需求与 BSW Feature 文档关联;根据 TPS_StandardizationTemplate 更新需求格式 |
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | 初始版本发布 |
---
## 目录
1. [文档范围](#1-文档范围)
2. [使用的约定](#2-使用的约定)
3. [缩略语](#3-缩略语)
4. [功能概述](#4-功能概述)
5. [需求追溯](#5-需求追溯)
6. [需求规范](#6-需求规范)
- 6.1 [功能性需求](#61-功能性需求)
- 6.2 [非功能性需求](#62-非功能性需求)
7. [参考文献](#7-参考文献)
---
## 1 文档范围
本文档规定了 Flash Test 模块的需求。
---
## 2 使用的约定
- AUTOSAR 文档中需求的表示形式遵循 [TPS_STDT_00078] 中规定的表格格式。
- 需求中应使用以下特定语义(基于 IETF)。
本文档中的关键字 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY" 和 "OPTIONAL" 需按下述方式解读:
- **SHALL**:规范的绝对要求
- **SHALL NOT**:规范的绝对禁止
- **MUST**:由于法律问题而构成的规范绝对要求
- **MUST NOT**:由于法律约束而构成的规范绝对禁止
- **SHOULD** / **RECOMMENDED**:特定情况下可能存在忽略的合理理由
- **SHOULD NOT** / **NOT RECOMMENDED**:特定情况下可能存在该行为可接受的合理理由
- **MAY** / **OPTIONAL**:真正可选
---
## 3 缩略语
| 缩略语 | 描述 |
|--------|------|
| ECU | Electric Control Unit(电子控制单元) |
| EOL | End Of Line(下线) |
| CRC | Cyclic Redundancy Check(循环冗余校验) |
| MCAL | Microcontroller Abstraction Layer(微控制器抽象层) |
| MCU | Microcontroller Unit(微控制器单元) |
| NMI | Non maskable interrupt(不可屏蔽中断) |
| OS | Operating System(操作系统) |
| DEM | Diagnostic Event Manager(诊断事件管理器) |
| SFR | Special Function Register(特殊功能寄存器) |
| RTE | Runtime environment(运行时环境) |
| WP | Work Package(工作包) |
| ECC | Error Correction Code(纠错码) |
| 缩写 | 描述 |
|------|------|
| STD | Standard(标准) |
| REQ | Requirement(需求) |
| UNINIT | Uninitialized(未初始化) |
| 术语 | 描述 |
|------|------|
| signature | 特定内存块内容的唯一计算结果 |
| Memory scrubbing | 自动顺序数据读取以触发检测/验证机制(典型如 ECC) |
| Invariable memory(不变内存) | 不变内存可以是程序 Flash、程序 SRAM、锁定缓存和 ROM |
| Background test(后台测试) | 由调度程序周期性调用且可中断,测试在多个调度任务上分散执行 |
| Foreground test(前台测试) | 通过用户调用启动 |
| Test interval(测试间隔) | 后台模式下完整 Flash 测试的间隔 |
---
## 4 功能概述
本软件模块提供测试不变内存的算法。不变内存可以是数据/程序 Flash、程序 SRAM、锁定缓存,要么嵌入微控制器中,要么通过内存映射与微控制器相连。为简化,该软件模块称为 Flash Test Driver。
测试服务可在 MCU 初始化后随时执行,由 Flash Test Driver 的用户选择合适的测试算法和正确的执行位置,以满足系统的安全需求。测试服务本身依赖于系统的存储概念。因此,不同测试算法的可用性是可配置的。
Flash Test 驱动旨在集成于整体安全概念中,本身不会提供所需的诊断覆盖率。
---
## 5 需求追溯
| 需求 | 描述 | 满足者 |
|------|------|--------|
| RS_BRF_00129 | AUTOSAR 应支持数据损坏检测与保护 | SRS_FlsTst_14200~14209、14211~14217、14219、14221~14225 |
| RS_BRF_01024 | AUTOSAR 应为公共符号提供命名规则 | SRS_FlsTst_14225 |
| RS_BRF_02168 | AUTOSAR 诊断应提供异常运行条件的集中分类和处理 | SRS_FlsTst_14223 |
| RS_BRF_02224 | AUTOSAR 应支持运行时硬件测试 | SRS_FlsTst_14200, 14201, 14208, 14209, 14211~14217, 14219, 14221~14225 |
---
## 6 需求规范
### 6.1 功能性需求
Flash Test 模块使用 Diagnostic Event Manager (DEM) 进行错误报告。错误通过 DEM API(BSW,`Dem_SetEventStatus()`)报告。开发错误报告给 Default Error Tracer (DET)。
#### 6.1.1 配置
本章列出对模块可配置性的需求。
##### 6.1.1.1 [SRS_FlsTst_14222] 内存块测试应被配置
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 配置待测试的内存块。块大小应可配置。应可配置多个 Flash 块区域(例如通过配置其起始与结束地址)。此外,如适用,应为每个内存块配置已存储签名或校验和位置的链接。 |
| 理由 | 定义待测试的内存块。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.1.2 [SRS_FlsTst_14200] Flash 测试服务应被配置
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应可配置每个内存块可使用的测试算法。 |
| 理由 | 使 Flash 测试服务适应系统存储概念并优化驱动代码 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.1.3 [SRS_FlsTst_14201] 应支持后构建配置
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应支持后构建配置 |
| 理由 | 1. 用于目标代码交付;2. Flash 测试配置依赖于地址,可能随 SW 版本而变化 |
| 用例 | 为不同 ECU 变体加载配置 |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
#### 6.1.2 初始化
未收集特殊初始化需求。
#### 6.1.3 正常运行
本章列出模块"正常"功能的需求。
##### 6.1.3.1 [SRS_FlsTst_14202] 应使用 ECC 检查数据完整性
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 主动使用 ECC 测试数据完整性。应提供算法,在读取字时检查数据和扩展到内存字的冗余位的正确性。如果不变内存支持此机制,此算法可适用。测试在出现任何故障时应报告 DEM 错误。 |
| 理由 | 检测 16 位字内的单位故障、双位故障、三位故障 |
| 用例 | SW ECC 或 HW ECC。可用于"内存清洗"。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_00129)
##### 6.1.3.2 [SRS_FlsTst_14203] 应使用校验和检查数据完整性
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 使用校验和检查数据完整性。应提供算法,重新计算内存块的校验和,并与存储在不变内存中定义地址处的校验和进行比较。如果 Flash 内存包含校验和,此算法可适用。已存储校验和位置的链接应可配置。测试在校验和不匹配时应报告 DEM 错误。 |
| 理由 | 检测位故障 |
| 用例 | -- |
| 依赖 | SRS_FlsTst_14222 |
| 支持材料 | -- |
⌋(RS_BRF_00129)
##### 6.1.3.3 [SRS_FlsTst_14204] 应使用 CRC 签名(8 位长度)检查数据完整性
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供算法,使用 CRC 算法重新计算内存块的签名,并与存储在不变内存中定义地址处的签名进行比较。CRC 校验和长度应为 8 位字。如果 Flash 内存包含块签名,此测试可适用。已存储签名位置的链接应可配置。测试在签名不匹配时应报告 DEM 错误。 |
| 理由 | 检测字内的位故障以及 99.6% 的所有可能位故障 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_00129)
##### 6.1.3.4 [SRS_FlsTst_14205] 应使用 CRC 签名(16 位长度)检查数据完整性
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供算法,使用 CRC 算法重新计算内存块的签名,并与存储在不变内存中定义地址处的签名进行比较。CRC 校验和长度应为 16 位字。 |
| 理由 | 检测字内的位故障以及 99.998% 的所有可能位故障 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_00129)
##### 6.1.3.5 [SRS_FlsTst_14206] 应使用 CRC 签名(32 位长度)检查数据完整性
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供算法,使用 CRC 算法重新计算内存块的签名,并与存储在不变内存中定义地址处的签名进行比较。CRC 校验和长度应为 32 位字。 |
| 理由 | 检测字内的位故障以及 99.99999995% 的所有可能位故障。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_00129)
##### 6.1.3.6 [SRS_FlsTst_14207] 应通过比较重复内存块检查数据完整性
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供测试以比较两个相同的内存块。测试用例在内存重复时适用。测试在不匹配时应报告 DEM 错误。 |
| 理由 | 根据块复制技术检测所有位故障 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_00129)
##### 6.1.3.7 [SRS_FlsTst_14208] 后台 Flash 测试应可中断
| 字段 | 内容 |
|------|------|
| 类型 | Changed |
| 描述 | -- |
| 理由 | 测试旨在用于调度的后台任务。因此不应阻塞其他操作。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.8 [SRS_FlsTst_14209] 待测内存应被划分为更小的部分
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 待测内存应被划分为更小的单独部分,可根据系统需要进行调度。 |
| 理由 | 与并发任务共享 CPU 资源 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.9 [SRS_FlsTst_14211] Flash 测试执行状态应可用
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash 测试执行的当前状态应通过 get status 接口可用。此功能应为可选。 |
| 理由 | 能够监视当前运行的测试以进行测试流控制。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.10 [SRS_FlsTst_14212] Flash 测试执行完成应通过通知机制提供
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 关于测试已完成的信息应通过通知机制提供给用户。此功能应为可选。 |
| 理由 | 能够指示当前运行测试的完成以进行测试流控制。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.11 [SRS_FlsTst_14213] 应提供已完成测试的签名/校验和计算
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 已完成测试的签名/校验和计算应提供给用户。此功能应为可选。 |
| 理由 | 已完成测试的通过/失败判定可在本软件模块之外做出。 |
| 用例 | 通过或失败判定可由外部安全单元完成 |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.12 [SRS_FlsTst_14214] 应提供 Flash 测试执行结果服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应在 SW 请求时提供关于已完成测试的信息。此功能应为可选。 |
| 理由 | 能够监视已完成测试以用于诊断目的。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.13 [SRS_FlsTst_14215] 应可能暂停 Flash 测试执行
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供服务以暂停正在运行的 Flash 测试。暂停将在下一个原子边界停止测试执行并保存中间状态。此功能应为可选。 |
| 理由 | 在更高优先级任务出现时暂停后台 Flash 测试任务。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.14 [SRS_FlsTst_14216] 暂停的 Flash 测试执行应可恢复
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供服务以恢复已暂停的 Flash 测试。此功能应为可选。 |
| 理由 | 完成已暂停的 Flash 测试。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | AUTOSAR_SWS_RAM_Test.pdf (AUTOSAR Release 2.1) |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.15 [SRS_FlsTst_14217] 需要时应停止 Flash 测试执行
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供服务以停止 Flash 测试。测试应被取消,重新启动测试应从头开始。 |
| 理由 | -- |
| 用例 | 在出现 DEM 错误时,用户可取消正在运行的 Flash 测试执行 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.16 [SRS_FlsTst_14219] 应提供前台 Flash 测试
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供服务以前台模式测试内存块。此功能应为可选。 |
| 理由 | -- |
| 用例 | 启动阶段测试完整程序 Flash;关键操作前测试特殊内存块 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.17 [SRS_FlsTst_14223] 应报告 Flash 测试错误细节
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供服务以报告从 ECC 测试中检测到的特定错误数据。<br><br>该服务应为可选,适用于以下情况:<br>- 硬件配备了不变内存的 ECC<br>- 硬件能够报告硬件特定错误细节<br>- 调用方需要此数据<br><br>调用方负责解释此服务提供的数据。 |
| 理由 | 这些详细错误数据用于诊断目的。 |
| 用例 | ECU 启动期间应测试不变内存的 ECC 故障。出现故障时,此功能应用于收集硬件特定的故障数据,如 ECC 故障的故障地址 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224, RS_BRF_00129, RS_BRF_02168)
##### 6.1.3.18 [SRS_FlsTst_14224] 应测试 ECC 电路
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应提供服务以测试 ECC 电路并报告测试结果。<br><br>该服务应为可选,适用于以下情况:<br>- 硬件配备了不变内存的 ECC<br>- 硬件提供测试 ECC 电路的机制<br>- 调用方需要此测试 |
| 理由 | 在安全相关应用中,可能有必要确定硬件内存测试机制功能正常。这可以通过验证可用电路(ECC)无错误运行来实现。 |
| 用例 | ECU 启动期间验证 ECC 硬件逻辑。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.3.19 [SRS_FlsTst_14225] 每个 Flash 测试间隔应具有一个标识符
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 每个 Flash 测试间隔应具有一个标识符,该标识符应在后台模式下每次启动有效测试间隔时递增。Flash 测试间隔的值应提供给上层。标识符的结束值应可配置。 |
| 理由 | 将测试结果或测试签名分配给一个测试间隔,以便上层监视 ECU 测试流。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224, RS_BRF_00129, RS_BRF_01024)
#### 6.1.4 关机操作
未收集关机操作的专用需求。
#### 6.1.5 故障操作
本软件模块未收集故障/恢复操作的专用需求。
### 6.2 非功能性需求
未收集专用非功能性需求。
#### 6.2.1 时序需求
未收集专用时序需求。
#### 6.2.2 资源使用
##### 6.2.2.1 [SRS_FlsTst_14221] 测试期间被测试内存内容不应有效
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 测试基于内容,要求测试期间内容不变。这必须由调用方确保。 |
| 理由 | 被测内存块的内容在测试期间不应有效 |
| 用例 | 运行时测试数据 Flash |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224, RS_BRF_00129)
---
## 7 参考文献
### AUTOSAR 交付物
- [DOC_LAYERED_ARCH] Layered Software Architecture, AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
- [AUTOSAR_GLOSSARY] Glossary, AUTOSAR_TR_Glossary.pdf
- [SRS_BSW_GENERAL] General Requirements on Basic Software Modules, AUTOSAR_SRS_BSWGeneral.pdf
- [SRS_BSW_SPAL] General Requirements on SPAL, AUTOSAR_SRS_SPALGeneral.pdf
- [SWS_BSW] Specification of Diagnostic Event Manager, AUTOSAR_SWS_DiagnosticEventManager.pdf
- [SWS_BSW] Specification of Default Error Tracer, AUTOSAR_SWS_DefaultErrorTracer.pdf
- [SWS_BSW_MCAL] Specification of RAM Test, AUTOSAR_SWS_RAMTest.pdf
- [SWS_BSW] Specification of ECU state manager, AUTOSAR_SWS_ECUStateManager.pdf
- [TPS_STDT_0078] Software Standardization Template, AUTOSAR_TPS_StandardizationTemplate.pdf
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SRS_FlashTest v4.4.0(Document ID 260)。
- 保留所有需求 ID(SRS_FlsTst_xxxxx、RS_BRF_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(FlsTst、Fls、ECC、CRC、DEM、DET 等)保持英文。
@@ -0,0 +1,556 @@
# 内存硬件抽象层需求规范
> **文档标题**: Requirements on Memory Hardware Abstraction Layer
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 116
> **文档类型**: SRS (Software Requirements Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Requirements on Memory Hardware Abstraction Layer |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 116 |
| 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 | 增加"需求追溯"章节 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 需求与 BSW 特性关联 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 需求与 BSW 特性关联 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 编辑性修订 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 对需求追溯进行形式化重做;按 TPS_STDT_00078 重做需求;关联 BSW & RTE 特性 |
| 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 | "用户须知"修订;增加"版本信息" |
| 2006-11-28 | 2.1 | AUTOSAR Administration | 法律免责声明修订 |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 初始版本发布 |
---
## 目录
1. [文档范围](#1-文档范围)
2. [如何阅读本文档](#2-如何阅读本文档)
3. [缩略语](#3-缩略语)
4. [功能概述](#4-功能概述)
5. [需求追溯](#5-需求追溯)
6. [需求规范](#6-需求规范)
- 6.1 [功能性需求](#61-功能性需求)
- 6.2 [非功能性需求(质量)](#62-非功能性需求质量)
7. [参考文献](#7-参考文献)
---
## 1 文档范围
本文档规定了构成内存硬件抽象层(Memory Hardware Abstraction Layer, MemHwA)的模块的需求。下图展示了内存硬件抽象层的架构与上下文。
```
NVRAM Manager
Memory Hardware Abstraction
├── Memory Abstraction Interface (MemIf)
│ │
│ ▼
├── Flash EEPROM Emulation (FEE) ─── ▶ Flash Driver
└── EEPROM Abstraction (EA) ─── ▶ EEPROM Driver
Vendor Specific Library
```
*图 1:内存硬件抽象层的组件与接口*
**EEPROM Abstraction (EA)** 模块应抽象出底层 EEPROM 驱动的寻址方案,并提供统一的寻址方案。它还应允许可配置的"虚拟无限"擦/写周期数。这样,如果底层 EEPROM 驱动和器件改变,无需更改上层(NVRAM 管理器)。
**Flash EEPROM Emulation (FEE)** 模块应抽象出底层 Flash 驱动的寻址方案,并提供统一的寻址方案以及可配置的"虚拟无限"擦/写周期数。这样,如果底层 Flash 驱动和器件改变,无需更改上层(NVRAM 管理器)。
驱动接口层(EEPROM 与 Flash 接口)已被略去,以允许 FEE/EA 模块的高效实现。FEE 和 EA 直接对接底层内存驱动。为那些接口层制定的需求改为适用于 Memory Abstraction Interface。
**Memory Abstraction Interface (MemIf)** 应替代驱动接口层(EEPROM 与 Flash 接口),允许 NVRAM 管理器访问多个内存抽象模块(FEE 与 EA 模块)。
可使用厂商特定库代替 FEE/Flash 驱动 和/或 EA/EEPROM 驱动的组合,以提供与那些内存抽象模块相同的功能和 API。只要功能和 API 受支持,这类库的内部实现无关紧要。当厂商库替换所有所需的 FEE 和 EA 模块时,Memory Abstraction Interface 应仅为一组宏。
---
## 2 如何阅读本文档
### 2.1 使用的约定
关键字 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY" 和 "OPTIONAL" 按 IETF 风格解读。AUTOSAR 文档中需求的表示形式遵循 [5] 中规定的表格格式。
### 2.2 需求结构
**功能性需求**:配置、初始化、正常运行、关机运行、故障运行、……
**非功能性需求**:时序需求、资源使用、易用性、为其他工作包提供的输出、……
---
## 3 缩略语
| 缩略语 | 描述 |
|--------|------|
| (Logical) Block(逻辑块) | 可由模块用户单独寻址的连续内存区域(用于读/写/擦/比较操作)。块大小可静态配置(预编译时)。 |
| Page(页) | 一次可写入的最小内存量。 |
| Sector(扇区) | 一次可擦除的最小内存量。 |
| FEE | Flash EEPROM Emulation(Flash EEPROM 仿真) |
| EA | EEPROM Abstraction Layer(EEPROM 抽象层) |
| MemIf | Memory Abstraction Interface(内存抽象接口) |
---
## 4 功能概述
### 4.1 EEPROM 抽象层
EEPROM Abstraction Layer (EA) 应扩展 EEPROM 驱动,为上层提供线性地址空间上的虚拟分段和"虚拟无限"的擦/写周期数。除此之外,它应提供与 EEPROM 驱动相同的功能。
### 4.2 Flash EEPROM 仿真
Flash EEPROM Emulation (FEE) 应在 Flash 内存技术上仿真 EEPROM 抽象层的行为。因此它应具有与 EEPROM 抽象层相同的功能范围和 API,并允许基于底层 Flash 驱动和 Flash 器件的类似配置。
### 4.3 内存抽象接口
Memory Abstraction Interface (MemIf) 应抽象出底层 FEE 或 EA 模块的数量,并为上层提供统一线性地址空间上的虚拟分段。
---
## 5 需求追溯
| 需求 | 描述 | 满足者 |
|------|------|--------|
| RS_BFR_01816 | - | SRS_MemHwAb_14013, 14026 |
| RS_BRF_00129 | AUTOSAR 应支持数据损坏检测与保护 | SRS_MemHwAb_14014, 14015, 14016 |
| RS_BRF_01000 | AUTOSAR 架构应将 BSW 组织为硬件无关层和硬件相关层 | SRS_MemHwAb_14017, 14018, 14019, 14022, 14024 |
| RS_BRF_01800 | AUTOSAR 非易失存储器功能应划分为硬件相关层和硬件无关层 | SRS_MemHwAb_14017, 14018, 14019, 14022, 14024 |
| RS_BRF_01808 | AUTOSAR 非易失存储器处理应支持不同种类的存储器硬件 | SRS_MemHwAb_14019, 14020, 14021 |
| RS_BRF_01812 | AUTOSAR 非易失存储器功能应支持作业的优先级化和异步执行 | SRS_MemHwAb_14031 |
| RS_BRF_01816 | AUTOSAR 非易失存储器功能应基于逻辑内存块组织持久数据 | SRS_MemHwAb_14001, 14002, 14010, 14028, 14029, 14032 |
| RS_BRF_01832 | AUTOSAR 非易失存储器应独立于物理地址处理逻辑内存块 | SRS_MemHwAb_14005, 14006, 14007, 14009 |
| RS_BRF_01840 | AUTOSAR 非易失存储器功能应保护内存块的完整性 | SRS_MemHwAb_14014, 14015, 14016 |
| RS_BRF_01848 | AUTOSAR 非易失存储器功能应提供增强硬件可靠性的机制 | SRS_MemHwAb_14002, 14012 |
| RS_BRF_01850 | AUTOSAR 非易失存储器功能应能应对硬件寿命约束 | SRS_MemHwAb_14002, 14012 |
| RS_BRF_02040 | AUTOSAR BSW 与 RTE 应确保数据一致性 | SRS_MemHwAb_14015 |
| RS_BRF_02232 | AUTOSAR 应支持具有运行时断言检查的开发 | SRS_MemHwAb_14023 |
---
## 6 需求规范
### 6.1 功能性需求
#### 6.1.1 内存抽象模块
##### 6.1.1.1 配置
###### 6.1.1.1.1 [SRS_MemHwAb_14001] FEE 和 EA 模块应允许配置逻辑块起始/结束地址的对齐
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应允许配置逻辑块起始与结束地址的对齐。配置工具应使用此配置参数,根据块起始地址生成块编号。 |
| 理由 | 1) 通过将逻辑块对齐到底层物理内存技术,简化 FEE 和 EA 模块内的块处理。2) 允许 FEE 和 EA 模块计算块起始地址,而非要求查找表将逻辑地址映射到物理地址。 |
| 用例 | 1) Freescale Star12 具有 4 字节扇区和 2 字节页大小的内部 EEPROM。通过将块起始与结束地址对齐到 4 字节边界,可简化块处理,不再需要读-修改-写行为。2) 示例:地址对齐设置为 4(字节)。第一个逻辑块编号 1,起始地址 0。块大小 22 字节,因此占用 6 个 4 字节"页"。下一个逻辑块编号应不是 2 而是 7,从而允许内存抽象模块推断其起始地址为 24((块编号-1) * 页大小)。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01816)
###### 6.1.1.1.2 [SRS_MemHwAb_14002] FEE 和 EA 模块应允许为每个逻辑块配置所需的写周期数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应允许为每个逻辑块配置所需的写周期数。 |
| 理由 | 抽象出底层物理器件的硬件属性。 |
| 用例 | 一个外部 Flash 器件规定每擦除单元 10,000 次擦除周期。配置的逻辑块需要 50,000 次擦除周期。FEE 必须确保此逻辑块可写入 50,000 次,同时任何 Flash 单元的擦除次数不得超过 10,000 次。 |
| 依赖 | [SRS_MemHwAb_14012] 写访问的分散 |
| 支持材料 | -- |
⌋(RS_BRF_01848, RS_BRF_01850, RS_BRF_01816)
###### 6.1.1.1.3 [SRS_MemHwAb_14026] 块编号 0x0000 和 0xFFFF 不应使用
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 块编号 0x0000 和 0xFFFF 不应由内存抽象模块使用 / 配置工具生成。 |
| 理由 | 这些数字无法与 Flash 或 EEPROM 器件的已擦除值区分。 |
| 用例 | 实现将块编号存储在非易失存储器中,例如标记逻辑块的起始或结束。当使用这些数字时,该标记将无法被找到/与空 EEPROM 或 Flash 内存区分。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BFR_01816)
##### 6.1.1.2 初始化
无附加需求,适用 SPAL SRS 通用章节关于初始化的"标准"需求。
##### 6.1.1.3 正常运行
###### 6.1.1.3.1 [SRS_MemHwAb_14005] FEE 和 EA 模块应为上层提供 32 位虚拟地址空间
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash EEPROM Emulation (FEE) 和 EEPROM Abstraction (EA) 应为上层提供 32 位虚拟地址空间。<br><br>这些 32 位虚拟(逻辑)地址应由 16 位逻辑块标识符和该逻辑块内 16 位地址偏移组成。因此,内存抽象层应支持每个底层物理器件(理论上)65534 个逻辑(可区分)块。每个块可有(理论上)64 KB 的大小。 |
| 理由 | 抽象出会要求在底层器件/驱动改变时变更 NVRAM 管理器的硬件属性。 |
| 用例 | 1) 支持具有大量小块的系统;2) 支持具有少量大块的系统,如 MMI 系统(字体、语音)或导航(地图、路线);3) 允许 NVRAM 管理器在逻辑块标识符中编码块管理信息(如块类型,通过使其足够大)。 |
| 依赖 | [SRS_MemHwAb_14026] 不使用特定块编号 |
| 支持材料 | 图 2:虚拟与物理地址空间 |
⌋(RS_BRF_01832)
###### 6.1.1.3.2 [SRS_MemHwAb_14006] 块擦除或写操作的起始地址应始终对齐到虚拟 64K 边界
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 块擦除或写操作的起始地址应始终对齐到虚拟 64K 边界。<br><br>换言之:对于块擦除/写请求,偏移应被忽略,每个块擦除/写请求从地址偏移 0 开始。 |
| 理由 | 如果虚拟 64K 边界映射到物理扇区/页边界,允许底层仿真模块和驱动中的优化擦除/写操作。 |
| 用例 | FEE 和 EA 的优化,简化配置和实现。 |
| 依赖 | -- |
| 支持材料 | 明确:不能仅擦除或写入已配置块的一部分,要么全部,要么什么都不做。 |
⌋(RS_BRF_01832)
###### 6.1.1.3.3 [SRS_MemHwAb_14007] 读取块的起始地址和长度不应限制为特定对齐
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 读取块的起始地址和长度不应限制为特定对齐,即应可能从任何内存地址开始读取一个字节。 |
| 理由 | Flash/EEPROM 的按字节读取。 |
| 用例 | NVRAM 管理器中的 CRC 计算。 |
| 依赖 | -- |
| 支持材料 | 这允许分多次读取逻辑块,例如 CRC 计算所需。如果某些硬件属性要求读地址对齐(如仅 32 位对齐读取可能),应由底层驱动处理。此需求允许 NVRAM 管理器对逻辑块进行按字节读访问,但并不要求 NVRAM 管理器必须这样做。 |
⌋(RS_BRF_01832)
###### 6.1.1.3.4 [SRS_MemHwAb_14009] FEE 和 EA 模块应提供逻辑线性地址与物理内存地址之间的转换
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应在逻辑线性地址和用于访问底层 Flash 内存或 EEPROM 的地址之间提供明确的转换。 |
| 理由 | 物理器件和逻辑块的起始地址应从逻辑块标识符派生。 |
| 用例 | 逻辑块到多个物理非易失存储设备的透明映射。 |
| 依赖 | -- |
| 支持材料 | 通过该转换获得的内存地址是相对于 Flash 和 EEPROM 驱动规范中描述的器件特定基地址的地址偏移。 |
⌋(RS_BRF_01832)
###### 6.1.1.3.5 [SRS_MemHwAb_14010] FEE 和 EA 模块应提供仅操作完整已配置逻辑块的写服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应提供仅操作完整已配置逻辑块的写服务。 |
| 理由 | 将上层与驱动内部解耦。 |
| 用例 | 上层只需对 Memory Abstraction Interface 进行一次调用,即可将逻辑块写入非易失存储器。如果需要多次操作才能写入所有寻址的内存区域,应在 FEE 或 EA 模块内或底层器件驱动中内部处理。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01816)
###### 6.1.1.3.6 [SRS_MemHwAb_14029] FEE 和 EA 模块应提供允许读取逻辑块全部或部分的读服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应提供允许读取逻辑块全部或部分的读服务。 |
| 理由 | 允许读取 NV 内存。 |
| 用例 | NVRAM 管理器的读功能。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01816)
###### 6.1.1.3.7 [SRS_MemHwAb_14031] FEE 和 EA 模块应提供允许取消正在进行的异步操作的服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应提供允许取消正在进行的异步操作(如读、写、擦或比较操作)的服务。 |
| 理由 | 写入"立即数据"所需。 |
| 用例 | 立即数据(崩溃数据)必须写入,而当前正在进行读操作。 |
| 依赖 | [SRS_MemHwAb_14013] 写入"立即"数据不得延迟 |
| 支持材料 | -- |
⌋(RS_BRF_01812)
###### 6.1.1.3.8 [SRS_MemHwAb_14028] FEE 和 EA 模块应提供使逻辑块无效化的服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应提供使逻辑块无效化的服务。这应通过适当设置模块内部块管理数据来完成。<br>注:擦除物理内存内容是实现选项但非必需。 |
| 理由 | 使上层能够将数据块标记为无效。 |
| 用例 | 当物理擦除数据不可能或不可取(如 Flash 内存技术上)时,允许应用将数据标记为过时或不再有效。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01816)
###### 6.1.1.3.9 [SRS_MemHwAb_14012] 写访问的分散
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 如果为逻辑块配置的写周期数超过底层物理器件提供的数量,FEE 或 EA 模块必须提供足够的机制,将该逻辑块的写请求分散到更大的内存区域。 |
| 理由 | 允许"无限"写周期数,同时防止内存单元的擦除次数超过硬件厂商规定的次数。 |
| 用例 | 一个外部 Flash 器件规定每擦除单元 10,000 次擦除周期。配置的逻辑块需要 50,000 次写周期。FEE 必须确保此逻辑块可写入 50,000 次,同时任何 Flash 单元的擦除次数不得超过 10,000 次。 |
| 依赖 | [SRS_MemHwAb_14002] 所需写周期数配置 |
| 支持材料 | 此需求替换 MemSvc SRS 中的 [BSW032] 写访问分散和 [SRS_LIBS_08530] NVRAM 块类型 漫游。 |
⌋(RS_BRF_01848, RS_BRF_01850)
###### 6.1.1.3.10 [SRS_MemHwAb_14013] 立即数据的写入不得因内部管理操作或被写入内存区域的擦除而延迟
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 立即数据的写入不得因内部管理操作或被写入内存区域的擦除而延迟。<br>如果在必须写入立即数据时正在进行内部管理操作,必须中断它们,直到数据已写入非易失存储器。<br><br>必须始终有一个预擦除的内存区域可用于写入立即数据。 |
| 理由 | 立即数据必须立即写入(这就是其名称的含义),即与底层硬件允许的速度一样快。 |
| 用例 | 当需要写入崩溃数据时,FEE 正在重组当前存储在 Flash 中的块。 |
| 依赖 | 如果正在进行的硬件访问(如擦除操作)不能被中止,其运行时间必须作为立即写操作的最大允许延迟。 |
| 支持材料 | -- |
⌋(RS_BFR_01816)
###### 6.1.1.3.11 [SRS_MemHwAb_14032] FEE 和 EA 模块应提供仅操作包含立即数据的完整逻辑块的擦除服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应提供仅操作包含立即数据的完整逻辑块的擦除服务。 |
| 理由 | SRS_MemHwAb_14013 需要预擦除内存,因此这些内存区域必须以某种方式可擦除。 |
| 用例 | -- |
| 依赖 | [SRS_MemHwAb_14013] 写入"立即"数据不得延迟 |
| 支持材料 | - 此服务只应由特殊应用(如诊断)调用。<br>- 一种可能的实现是使包含立即数据的块无效化,随后强制重组块。重组期间无效块不应复制到新的内存位置,因此立即数据的内存区域将(保持)擦除状态。 |
⌋(RS_BRF_01816)
##### 6.1.1.4 关机操作
内存抽象层的模块不需要任何关机能力(Flash 或 EEPROM 驱动中也没有关机能力)。
##### 6.1.1.5 故障操作
###### 6.1.1.5.1 [SRS_MemHwAb_14014] FEE 和 EA 模块应检测因中止/中断的写操作可能导致的数据不一致
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应检测因中止/中断的写操作可能导致的数据不一致。 |
| 理由 | "用户"不应使用不一致数据,因此必须识别。 |
| 用例 | 1) 写操作因断电而中断,上电复位后,在下次对受影响内存区域的读访问时应检测到可能的数据不一致。2) 写操作被上层取消。下次对受影响内存区域的读访问时应检测到可能的数据不一致。 |
| 依赖 | -- |
| 支持材料 | 取决于实现、物理器件和发生中断的写操作时间点,FEE 或 EA 模块可能能够确定操作已失败,但无法确定哪个块本应被写入。 |
⌋(RS_BRF_00129, RS_BRF_01840)
###### 6.1.1.5.2 [SRS_MemHwAb_14015] FEE 和 EA 模块应报告可能的数据不一致
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块应仅一次向 DEM 报告因中止/中断的写操作导致的可能数据不一致。之后,不一致的内存区域必须被标记,使得不再为该块报告进一步的错误。 |
| 理由 | 避免每次块读操作中错误报告的"无限循环"。 |
| 用例 | 写操作被中断或取消,在下次对受影响内存区域的读访问时检测并报告不一致。 |
| 依赖 | [SRS_MemHwAb_14014] 数据不一致检测 |
| 支持材料 | 取决于实现和发生中断的写操作时间点,FEE 或 EA 模块可能能够确定操作已失败,但无法确定哪个块本应被写入。这种情况下,对该块的读操作可能向调用方返回旧(过时)数据(如果存在此类数据)。如果应用不希望这样,必须在覆盖前显式使该块无效化。 |
⌋(RS_BRF_00129, RS_BRF_01840, RS_BRF_02040)
###### 6.1.1.5.3 [SRS_MemHwAb_14016] FEE 和 EA 模块不应将不一致数据返回给调用方
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | FEE 和 EA 模块不应将不一致数据返回给调用方。 |
| 理由 | "用户"不应使用不一致数据。 |
| 用例 | 写操作被中断或取消,因此该块的数据不一致。在下次对该块的读访问时检测到此不一致,数据不应返回给调用方。 |
| 依赖 | [SRS_MemHwAb_14014] 数据不一致检测 |
| 支持材料 | 为不一致块提供默认数据是 NVRAM 管理器的工作。 |
⌋(RS_BRF_00129, RS_BRF_01840)
#### 6.1.2 内存抽象接口
以下需求已从 SPAL SRS 关于内存抽象的部分接管,并已(仅在措辞上)适配图 1 所示的架构概念。
##### 6.1.2.1 通用
###### 6.1.2.1.1 [SRS_MemHwAb_14019] 内存抽象接口应提供对底层内存抽象模块 API 服务的统一访问
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 内存抽象接口应为 NVRAM 管理器内使用所需的、底层内存抽象模块的 API 服务提供统一访问。<br>进一步说明:初始化例程和作业处理函数不由内存抽象接口映射。 |
| 理由 | 通过一个统一接口允许使用内存抽象模块。 |
| 用例 | 允许上层无差别地访问内部和外部内存设备。 |
| 依赖 | -- |
| 支持材料 | 此需求应替换 [BSW12172]。 |
⌋(RS_BRF_01000, RS_BRF_01800, RS_BRF_01808)
###### 6.1.2.1.2 [SRS_MemHwAb_14020] 内存抽象接口应允许使用设备索引选择底层内存抽象模块
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 内存抽象接口应允许使用设备索引选择底层内存抽象模块(FEE 或 EA 模块)。 |
| 理由 | NVRAM 管理器的需求 |
| 用例 | NVRAM 管理器使用设备索引选择适当的内存抽象模块。 |
| 依赖 | -- |
| 支持材料 | SWS NVRAM Manager。此需求应替换 [BSW12173]。 |
⌋(RS_BRF_01808)
##### 6.1.2.2 配置
###### 6.1.2.2.1 [SRS_MemHwAb_14021] 内存抽象接口应允许预编译时配置底层内存抽象模块的数量
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 内存抽象接口应允许预编译时配置底层内存抽象模块的数量。 |
| 理由 | 灵活性 |
| 用例 | 一个 ECU 仅使用内部 EEPROM(因此需要一个 EA 模块),另一个 ECU 同时使用内部和外部 EEPROM(因此需要两个 EA 模块)。 |
| 依赖 | -- |
| 支持材料 | WP Architecture。此需求应替换 [BSW12174]。 |
⌋(RS_BRF_01808)
##### 6.1.2.3 正常运行
###### 6.1.2.3.1 [SRS_MemHwAb_14022] 内存抽象接口应保留底层内存抽象模块的功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 内存抽象接口应保留底层内存抽象模块的功能。它不应提供附加功能。 |
| 理由 | 简单性、效率 |
| 用例 | 内存抽象模块抽象出所有硬件属性,内存抽象接口无需添加任何内容(仅在需要访问多个内存抽象模块时才需要)。 |
| 依赖 | -- |
| 支持材料 | 此需求应替换 [BSW12175]。 |
⌋(RS_BRF_01000, RS_BRF_01800)
##### 6.1.2.4 故障操作
###### 6.1.2.4.1 [SRS_MemHwAb_14023] 内存抽象接口应仅检查接口本身内使用的参数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 内存抽象接口应仅检查接口本身内使用且不传递给底层内存抽象模块的参数。 |
| 理由 | 简单性、效率:避免参数的双重检查。 |
| 用例 | 设备索引可以被检查(取决于开发错误检测开关的设置)。块地址不应被检查。 |
| 依赖 | -- |
| 支持材料 | 此需求应替换 [BSW12176]。 |
⌋(RS_BRF_02232)
#### 6.1.3 板载设备抽象
板载设备抽象适用与内存硬件抽象相同的需求。板载设备抽象的一个成员是看门狗接口。
### 6.2 非功能性需求(质量)
#### 6.2.1 内存抽象模块
##### 6.2.1.1 [SRS_MemHwAb_14017] EA 模块应扩展 EEPROM 驱动的功能范围
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | EEPROM Abstraction Layer (EA) 应扩展 EEPROM 驱动的功能范围。除 EEPROM 驱动的属性外,EA 应工作于 32 位虚拟地址空间,并应完全抽象出底层器件给出的擦/写周期限制。 |
| 理由 | 所有 EEPROM 器件的统一处理。 |
| 用例 | 如果底层 EEPROM 驱动和器件改变,NVRAM 管理器无需改变。 |
| 依赖 | -- |
| 支持材料 | AUTOSAR SRS EEPROM driver |
⌋(RS_BRF_01000, RS_BRF_01800)
##### 6.2.1.2 [SRS_MemHwAb_14018] FEE 模块应扩展内部 Flash 驱动的功能范围
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | Flash EEPROM Emulation (FEE) 应扩展内部 Flash 驱动的功能范围。它应具有与 EA 模块相同的功能范围和 API。 |
| 理由 | 所有 Flash 器件的统一处理。 |
| 用例 | 如果底层 Flash 驱动和器件改变,NVRAM 管理器无需改变。 |
| 依赖 | [SRS_MemHwAb_14017] EEPROM 抽象层的范围 |
| 支持材料 | AUTOSAR SRS EEPROM driver; AUTOSAR SRS Flash driver |
⌋(RS_BRF_01000, RS_BRF_01800)
#### 6.2.2 内存抽象接口
##### 6.2.2.1 时序需求
###### 6.2.2.1.1 [SRS_MemHwAb_14024] 内存抽象接口应保留底层内存抽象模块及其 API 的时序行为
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 内存抽象接口应通过将内存抽象接口 API 1:1 映射到内存抽象模块的 API,保留底层内存抽象模块及其 API 的时序行为。 |
| 理由 | 简单性、效率 |
| 用例 | 示例:内存抽象接口的写服务直接映射到底层内存抽象模块(FEE 或 EA)的写服务。 |
| 依赖 | -- |
| 支持材料 | WP Architecture。此需求应替换 [BSW12177]。 |
⌋(RS_BRF_01000, RS_BRF_01800)
#### 6.2.3 板载设备抽象
板载设备抽象适用与内存硬件抽象相同的需求。板载设备抽象的一个成员是看门狗接口。
---
## 7 参考文献
### 7.1 AUTOSAR 交付物
[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] General Requirements on SPAL
AUTOSAR_SRS_SPALGeneral.pdf
[5] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
### 7.2 相关标准与规范
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SRS_MemoryHWAbstractionLayer v4.4.0(Document ID 116)。
- 保留所有需求 ID(SRS_MemHwAb_xxxxx、RS_BRF_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(FEE、EA、MemIf、NVRAM 等)保持英文。
+807
View File
@@ -0,0 +1,807 @@
# 内存服务需求规范
> **文档标题**: Requirements on Memory Services
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 007
> **文档类型**: SRS (Software Requirements Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Requirements on Memory Services |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 007 |
| 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 | 增加"需求追溯"章节 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 需求与 BSW 特性关联 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 需求与 BSW 特性关联 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 编辑性修订 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 对需求追溯进行形式化重做;按 TPS_STDT_00078 重做需求;关联 BSW & RTE 特性 |
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | 增加 NVM 安全机制;增加调试和诊断支持;增加块共享;法律免责声明修订 |
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 |
| 2007-12-21 | 3.0.1 | AUTOSAR Administration | 移除 CRC 库相关需求;文档元信息扩充;小幅排版调整 |
| 2007-01-24 | 2.1.15 | AUTOSAR Administration | 移除关于符合性和强制需求的声明;法律免责声明修订;"用户须知"修订;增加"版本信息" |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 块管理类型需求变更;新增需求(RAM 块类型、错误检测、减少写负载、配置等);移除"写访问分散"和"不完整写入检测"需求 |
| 2005-05-31 | 1.0 | AUTOSAR Administration | 初始发布 |
---
## 目录
1. [文档范围](#1-文档范围)
2. [如何阅读本文档](#2-如何阅读本文档)
3. [缩略语](#3-缩略语)
4. [功能概述](#4-功能概述)
5. [需求追溯](#5-需求追溯)
6. [需求规范](#6-需求规范)
- 6.1 [功能性需求](#61-功能性需求)
- 6.2 [非功能性需求(质量)](#62-非功能性需求质量)
7. [参考文献](#7-参考文献)
---
## 1 文档范围
本文档规定了以下软件层中基础软件模块的需求:
- 服务层(Service Layer)
这些模块属于以下类型:
- NVRAM 管理
- 接口
模块的选择源自基础软件模块列表和 AUTOSAR 分层软件架构。涉及以下模块:
- NVRAM Manager
需求按以下方式组织:
- 基础软件模块的通用需求(其他文档)
- 适用于 NVRAM 管理所有模块的通用需求
- 模块特定需求
**约束**
基础软件模块需求规范的首要范围是非安全相关系统。因此安全需求被分配为中等优先级。
---
## 2 如何阅读本文档
每条需求都有一个以"BSW"为前缀的唯一标识符。
### 2.1 使用的约定
关键字 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY" 和 "OPTIONAL" 按 IETF 风格解读。AUTOSAR 文档中需求的表示形式遵循 [TPS_STDT_00078] 中规定的表格格式。
### 2.2 需求结构
**功能性需求**:配置、初始化、正常运行、关机运行、故障运行、……
**非功能性需求**:时序需求、资源使用、易用性、为其他工作包提供的输出、……
---
## 3 缩略语
| 缩略语 | 描述 |
|--------|------|
| Basic Storage Object(基础存储对象) | NVRAM 块的最小实体。多个"基础存储对象"可用于构建一个 NVRAM 块。"基础存储对象"可驻留在不同的存储位置(RAM/ROM/NV 存储器)。 |
| NVRAM Block(NVRAM 块) | 管理并存储 NV 数据块所需的整个结构。 |
| NV data(NV 数据) | 要存储于非易失存储器的数据。 |
| Block Management Type(块管理类型) | NVRAM 块的类型,取决于(可配置的)由强制/可选基础存储对象不同块组成 NVRAM 块的个性化构成及对其的后续处理。 |
| NV Block Header(NV 块头部) | 启用"静态块 ID"机制时 NV 块包含的附加信息。 |
| RAM Block(RAM 块) | 基础存储对象。表示 NVRAM 块中驻留在 RAM 的部分。参见 [SRS_LIBS_08534] |
| ROM Block(ROM 块) | 基础存储对象。表示 NVRAM 块中驻留在 ROM 的部分。"ROM 块"是 NVRAM 块的可选部分。 |
| NV Block(NV 块) | 基础存储对象。表示 NVRAM 块中驻留在 NV 存储器的部分。"NV 块"是 NVRAM 块的强制部分。 |
| Administrative Block(管理块) | 驻留在 RAM 中的基础存储对象。包含管理 NVRAM 块、执行其处理及交付状态信息所需的任何 RAM 数据。"管理块"是 NVRAM 块的强制部分。 |
| MemHwA | Memory Hardware Abstraction,见 [AUTOSAR_SRS_MEMHW] |
---
## 4 功能概述
非易失 RAM 管理器(NVRAM Manager)管理所有类型非易失存储器中的数据存储。
NVRAM 管理器本身应是硬件无关的,所有直接访问硬件的功能(如内部或外部 EEPROM、内部或外部 Flash 中的仿真 EEPROM 等)封装在基础 SW 的较低层中。NVRAM 管理器处理对非易失数据的并发访问,并为单个数据元素提供如校验和保护等可靠性机制。为了在汽车系统所有领域都可用,NVRAM 管理器需要具有高度可扩展性(如可定义请求队列的数量和大小、支持不同的块管理类型、EEPROM 仿真等)。
---
## 5 需求追溯
| 需求 | 描述 | 满足者 |
|------|------|--------|
| RS_BRF_00129 | AUTOSAR 应支持数据损坏检测与保护 | SRS_Mem_00030, 00129, 08001, 08010, 08545, 08546, 08547, 08550, 08552, 08553, 08555, 08556 |
| RS_BRF_01048 | AUTOSAR 模块设计应支持多任务环境下模块协同工作 | SRS_Mem_00034, 08542, 08558 |
| RS_BRF_01064 | AUTOSAR BSW 应提供回调函数以访问上层模块 | SRS_Mem_00125 |
| RS_BRF_01076 | AUTOSAR 基础软件应尽可能进行模块本地错误恢复 | SRS_Mem_00038 |
| RS_BRF_01096 | AUTOSAR 应支持 ECU 的启动和关机 | SRS_Mem_00137, 08540 |
| RS_BRF_01416 | AUTOSAR 服务应支持非易失存储器数据的标准化处理 | SRS_Mem_00013, 00016, 00017, 00136, 00138, 08544, 08554 |
| RS_BRF_01800 | AUTOSAR 非易失存储器功能应划分为硬件相关层和硬件无关层 | SRS_Mem_00011 |
| RS_BRF_01808 | AUTOSAR 非易失存储器处理应支持不同种类的存储器硬件 | SRS_Mem_08000 |
| RS_BRF_01812 | AUTOSAR 非易失存储器功能应支持作业的优先级化和异步执行 | SRS_Mem_00034, 08543, 08558 |
| RS_BRF_01816 | AUTOSAR 非易失存储器功能应基于逻辑内存块组织持久数据 | SRS_Mem_00041, 08001, 08009, 08528, 08529, 08531, 08533, 08534, 08538, 08543, 08549, 08560 |
| RS_BRF_01824 | AUTOSAR 非易失存储器功能应提供非易失存储器到 RAM 的映射 | SRS_Mem_00027, 08014, 08533, 08538, 08549 |
| RS_BRF_01832 | AUTOSAR 非易失存储器应独立于物理地址处理逻辑内存块 | SRS_Mem_08007, 08531 |
| RS_BRF_01840 | AUTOSAR 非易失存储器功能应保护内存块的完整性 | SRS_Mem_00018, 00030, 00127, 00129, 00135, 08010, 08011, 08015, 08535, 08541, 08546, 08547, 08548, 08552, 08553, 08556 |
| RS_BRF_01848 | AUTOSAR 非易失存储器功能应提供增强硬件可靠性的机制 | SRS_Mem_00018, 08529, 08531, 08548, 08551, 08554 |
---
## 6 需求规范
### 6.1 功能性需求
#### 6.1.1 配置
##### 6.1.1.1 [SRS_Mem_00041] 每个应用应能在配置时声明内存需求
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 通过使用配置技术,每个应用应能在配置时声明内存需求。此信息应可用于分配内存区域并生成适当的接口。错误的内存分配和需求冲突(没有足够内存可用)应在配置时被检测到。 |
| 理由 | 实现更高的可靠性、互操作性 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01816)
##### 6.1.1.2 [SRS_Mem_08534] NVRAM 管理器应支持两类 RAM 数据块
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应支持两类 RAM 数据块。这些 RAM 数据块对于 NVRAM 管理器和 SW 组件之间的数据交换是强制的。它们必须由 SW 组件或 BSW 模块提供。对特定 NVRAM 块的分配可以是:<br><br>- **永久**:即 RAM 数据块在配置时分配给恰好一个 NVRAM 块<br>- **临时**:即 RAM 数据块可在运行时分配给任何 NVRAM 块 |
| 理由 | 减少 RAM 消耗。 |
| 用例 | 1) 某些 NVRAM 块不经常使用,其数据无需永久驻留在 RAM 中。例如,应用希望对其所有互斥使用的 NVRAM 块使用一个共享 RAM 块。<br>2) 诊断服务希望从 NV 中读取某些应用使用的数据,而不危及应用的 RAM 块。它使用一个 RAM 块(必须足够大)来读取任何请求的 NV 数据块。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01816)
##### 6.1.1.3 [SRS_Mem_08528] NVRAM 管理器应允许配置原生块管理类型
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应允许配置原生块管理类型。<br><br>- 原生 NVRAM 块应提供数据的基本存储和 ROM 可配置 ROM 默认值。 |
| 理由 | 基本块类型 |
| 用例 | 无特殊要求的常规 NVRAM 数据。 |
| 依赖 | [SRS_LIBS_08534] RAM 数据块类别 |
| 支持材料 | -- |
⌋(RS_BRF_01816)
##### 6.1.1.4 [SRS_Mem_08529] NVRAM 管理器应允许配置冗余块管理类型
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应允许配置冗余块管理类型。冗余 NVRAM 块应对应用透明,并应在发生不一致时(如不完整写入)能提供数据。<br><br>冗余 NVRAM 块应可配置以包含默认值。<br><br>注:冗余不一定意味着双重(或多重)存储。 |
| 理由 | 安全性、增强数据可用性、完整性 |
| 用例 | 用于保存安全相关数据(如防盗器数据) |
| 依赖 | [SRS_Mem_00038] 可处理的错误不应影响应用; [SRS_Mem_00129] 自动数据修复; [SRS_LIBS_08534] RAM 数据块类别 |
| 支持材料 | -- |
⌋(RS_BRF_01816, RS_BRF_01848)
##### 6.1.1.5 [SRS_Mem_08531] NVRAM 管理器应允许配置数据集块管理类型
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应允许配置数据集块管理类型。此类 NVRAM 块应在 NV 中提供可配置数量的可选元素。<br>- 数据集 NVRAM 块应可配置以包含默认值。 |
| 理由 | 使运行时选择 ROM/NVRAM 中不同数据集成为可能。 |
| 用例 | 一个 ECU 在一辆汽车的多个型号/国家变体中使用。根据车辆变体,选择 NVRAM 或 ROM 中对应的数据集。 |
| 依赖 | [SRS_Mem_08007] 数据集选择; [SRS_LIBS_08534] RAM 数据块类别 |
| 支持材料 | -- |
⌋(RS_BRF_01816, RS_BRF_01848, RS_BRF_01832)
##### 6.1.1.6 [SRS_Mem_08543] 每个 NVRAM 块的优先级应可在不同级别静态配置
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 每个 NVRAM 块的优先级应可在不同级别静态(预编译时)配置。<br><br>其中一个级别应为"立即(immediate)",对于这些块应适用 [SRS_Mem_08542]。 |
| 理由 | 灵活性 |
| 用例 | 崩溃数据写入和常规数据写入 |
| 依赖 | [SRS_Mem_08542] 作业顺序优先级化 |
| 支持材料 | -- |
⌋(RS_BRF_01816, RS_BRF_01812)
##### 6.1.1.7 [SRS_Mem_08009] NVRAM 管理器应允许为每个 NVRAM 块静态配置默认写保护(开/关)
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应允许为每个 NVRAM 块静态配置默认写保护(开/关)。 |
| 理由 | 某些数据是只读的 |
| 用例 | 写保护关:由应用本身生成的数据(如自适应数据、错误存储器);写保护开:外部赋予 ECU 的数据(如 EOL 数据、变体编码、参数) |
| 依赖 | [SRS_Mem_00127] 写保护/解除保护功能 |
| 支持材料 | -- |
⌋(RS_BRF_01816)
##### 6.1.1.8 [SRS_Mem_00135] NVRAM 管理器应有唯一的配置标识符
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应有一个配置标识符,它是非易失存储器配置的唯一属性。ID 可以静态分配给配置,或可以从配置属性计算得出。如果块配置改变(即添加或移除块,或更改其大小或类型),ID 必须改变。ID 应单独存储并应用于确定 NVRAM 内容的有效性。该机制在生产期间应是健壮的(如断电)。 |
| 理由 | NVRAM 数据配置可能在不同应用软件版本之间变化。必须有一种方式来知道 NVRAM 的内容是否与应用期望的配置匹配。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01840)
##### 6.1.1.9 [SRS_Mem_08549] NVRAM 管理器应提供软件更新后自动初始化 RAM 数据块的功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供功能,在软件更新后用 ROM 默认值自动初始化 RAM 数据块。此功能应可按 NVRAM 块配置。整个功能应可静态配置。 |
| 理由 | 灵活性。因此 ECU 重编程期间无需更新 NV 存储器。 |
| 用例 | ECU 重编程后(配置 ID 不匹配),NVRAM 块用(新)ROM 默认值初始化,但防盗器数据除外,不应被更新。 |
| 依赖 | [SRS_Mem_00135] NVRAM 配置 ID |
| 支持材料 | -- |
⌋(RS_BRF_01816, RS_BRF_01824)
##### 6.1.1.10 [SRS_Mem_00125] 每个块应可配置通知
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 每个块应可配置通知(在读/写作业完成时启动)。 |
| 理由 | 灵活性,与应用软件集成 |
⌋(RS_BRF_01064)
##### 6.1.1.11 [SRS_Mem_08000] NVRAM 管理器应能访问多个非易失存储器设备
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应能访问多个非易失存储器设备。非易失存储器设备可以是不同类型。 |
| 理由 | 灵活性,与应用软件集成 |
| 用例 | 一个 ECU 中的多个非易失存储器,如外部 EEPROM 和内部 Flash 中的 EEPROM 仿真 |
| 依赖 | [SRS_Mem_00011] (存储器)硬件独立性 |
| 支持材料 | -- |
⌋(RS_BRF_01808)
##### 6.1.1.12 [SRS_Mem_08001] NVRAM 管理器应为每个块提供可配置的一致性检查
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应为每个块提供可配置的一致性检查。 |
| 理由 | 一致性检查可能并非用于所有块 |
| 用例 | 读取或写入的数据可通过校验和重新计算和比较立即检查。 |
| 依赖 | [SRS_Mem_00030] 数据一致性/完整性检查;[BSW023] 不完整写操作的检测 |
| 支持材料 | -- |
⌋(RS_BRF_01816, RS_BRF_00129)
##### 6.1.1.13 [SRS_Mem_08551] 错误情况下最大重试次数应可单独配置
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 对于 NVRAM 管理器的读和写操作,错误情况下的最大重试次数应可单独配置。 |
| 理由 | 从临时错误情况中恢复 |
| 用例 | 错误条件下的数据读写。 |
| 依赖 | [SRS_Mem_08554] 读和写操作的重试 |
| 支持材料 | -- |
⌋(RS_BRF_01848)
##### 6.1.1.14 [SRS_Mem_08552] NVRAM 管理器应提供唯一块标识符的可配置验证
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供在读取 NVRAM 块时唯一块标识符的可配置验证。 |
| 理由 | 必要时防止块错误寻址 |
| 用例 | 必要时可检测硬件寻址错误 |
| 依赖 | [SRS_Mem_08555] 唯一块标识符的验证 |
| 支持材料 | -- |
⌋(RS_BRF_01840, RS_BRF_00129)
##### 6.1.1.15 [SRS_Mem_08553] NVRAM 管理器应提供可配置的数据写验证
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应通过重新读取先前写入的数据并比较,提供可配置的数据写验证。写验证应可按 NVRAM 块配置。 |
| 理由 | 必要时验证正确存储的数据 |
| 用例 | 必要时可检测硬件写错误 |
| 依赖 | [SRS_Mem_08556] 数据写验证 |
| 支持材料 | -- |
⌋(RS_BRF_01840, RS_BRF_00129)
##### 6.1.1.16 [SRS_Mem_08538] 在 NVRAM 管理器启动期间自动加载的块应可静态配置
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 在 NVRAM 管理器启动期间自动加载的块应可静态配置。 |
| 理由 | 允许灵活性 – 启动期间加载内容 |
| 用例 | 仅加载在严格时序约束内通过 CAN 启动通信所需的块。 |
| 支持材料 | 仅适用于配置为永久 RAM 块的 NVRAM 块 SRS_LIBS_08534 |
⌋(RS_BRF_01816, RS_BRF_01824)
##### 6.1.1.17 [SRS_Mem_08546] 应可保护永久 RAM 数据块免于因复位造成的数据丢失
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 对于每个具有永久 RAM 数据块的 NVRAM 块,应有可配置选项以强制执行增加 RAM 数据完整性的机制(发生复位时)。 |
| 理由 | 由于电压下降引起的复位,RAM 内容可能仍然有效。这不能被所有平台检测(或保证)。如果可以在启动时交付最新数据(来自 RAM),则会增加健壮性。 |
| 用例 | 当前移动的天窗控制在复位发生后不能用过时的位置数据驱动(参见 [SRS_Mem_08011]),每次电压下降都丢失位置也是不可接受的。 |
| 依赖 | [SRS_Mem_08545] RAM 数据验证和完整性信息更新 |
| 支持材料 | -- |
⌋(RS_BRF_01840, RS_BRF_00129)
##### 6.1.1.18 [SRS_Mem_08560] 每个 NVRAM 块应可配置为共享访问
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 每个 NVRAM 块应可配置为共享访问。 |
| 理由 | 这是按块进行的,以保持内存消耗低。 |
⌋(RS_BRF_01816)
#### 6.1.2 初始化
##### 6.1.2.1 [SRS_Mem_08533] NVRAM 管理器应提供检查和加载配置为具有永久 RAM 数据块的 NVRAM 块到 RAM 的服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供服务,检查并加载配置为具有永久 RAM 数据块的 NVRAM 块到 RAM。<br><br>此服务必须由 ECU 状态管理器在启动期间应用运行之前调用一次。 |
| 理由 | 应用在 ECU 启动后需要带有效数据的 RAM 块。 |
| 用例 | ECU 启动:为应用提供 NV 数据。 |
| 依赖 | [SRS_LIBS_08534] RAM 数据块类别; [SRS_Mem_08538] 启动期间加载的 NVRAM 块的静态配置 |
| 支持材料 | -- |
⌋(RS_BRF_01816, RS_BRF_01824)
#### 6.1.3 正常运行
**注**:只有 NVRAM 管理器应访问非易失存储器。所有其他软件应专门使用 NVRAM 管理器访问非易失存储器中的数据。但这不是对内存服务的需求,而是对使用的需求。因此,先前的需求 [BSW176]("仅通过 NVRAM 管理器访问非易失存储器")已被移除。
##### 6.1.3.1 [SRS_Mem_00027] NVRAM 管理器应提供隐式访问 NVRAM 和共享内存(RAM)中块的方式
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器仅提供隐式访问 NVRAM 和共享内存(RAM)中块的方式。这意味着 NVRAM 管理器将一个或多个块从 NV 存储器复制到 RAM 块,反之亦然。<br><br>RAM 块内变量的显式读写访问必须由应用提供(访问宏……)。 |
| 理由 | NVRAM 管理器的基本功能 |
| 用例 | 参数访问 |
⌋(RS_BRF_01824)
##### 6.1.3.2 [SRS_Mem_08014] NVRAM 管理器应允许在全局 RAM 区域中非连续地分配 RAM 块
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | RAM 块分配可在全局 RAM 区域中定义为非连续。 |
| 用例 | 每个 RAM 块可在全局 RAM 区域中无地址约束地分配 |
⌋(RS_BRF_01824)
##### 6.1.3.3 [SRS_Mem_00013] NVRAM 管理器应提供处理多个并发读/写请求的机制
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供处理多个并发读/写命令的机制,如排队。<br><br>实现需求:如果使用排队,仅缓冲读/写命令,而非要写入的数据! |
| 理由 | NVRAM 管理器处理整个 SW 系统中对 NVRAM 的所有访问。因此并发访问极有可能发生。由于资源限制,NVRAM 管理器必须以串行方式处理这些并行访问。 |
⌋(RS_BRF_01416)
##### 6.1.3.4 [SRS_Mem_00016] NVRAM 管理器应提供从非易失存储器读出与 NVRAM 块关联数据的功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供从非易失存储器读出与 NVRAM 块关联数据的功能。NVRAM 块由唯一标识符引用。NVRAM 数据被复制到相应的 RAM 块。<br><br>此服务的可用性应可配置。 |
| 理由 | NVRAM 管理器的基本功能 |
| 用例 | 从 NV 读取应用数据。 |
⌋(RS_BRF_01416)
##### 6.1.3.5 [SRS_Mem_00017] NVRAM 管理器应提供在非易失存储器中存储与 NVRAM 块关联数据的功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供在非易失存储器中存储与 NVRAM 块关联数据的功能。NVRAM 块由唯一标识符引用。<br><br>数据从 RAM 块复制到相应的 NV 块。此服务的可用性应可配置。 |
| 理由 | NVRAM 管理器的基本功能 |
| 用例 | 在 ECU 电源关闭前非易失存储数据 |
⌋(RS_BRF_01416)
##### 6.1.3.6 [SRS_Mem_08554] 如果 NVRAM 块的读和写操作未成功,NVRAM 管理器应重试最多可配置的次数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 如果 NVRAM 块的读和写操作未成功,NVRAM 管理器应重试最多可配置的次数。 |
| 理由 | 从临时错误情况中恢复 |
| 用例 | 电磁脉冲已改变刚读取的数据,因此校验和检查失败。再次读取数据可从此错误情况中恢复。 |
| 依赖 | [SRS_Mem_08551] 最大读写重试次数配置 |
⌋(RS_BRF_01416, RS_BRF_01848)
##### 6.1.3.7 [SRS_Mem_08541] NVRAM 管理器应保证已接受的写请求将被处理
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应保证已接受的写请求将被处理。 |
| 理由 | 发出写请求的应用期望数据被写入。 |
| 用例 | 1) 源自应用的排队写作业不应受关机过程或其取消影响。2) 在小幅崩溃时 ECU 保持可操作,NVRAM 管理器应表现得像没有此崩溃一样。因此,写相应崩溃数据的请求不应中止任何已接受的写作业。 |
| 依赖 | [SRS_Mem_00017], [SRS_Mem_08535], [SRS_Mem_08540], [SRS_Mem_08542] |
⌋(RS_BRF_01840)
##### 6.1.3.8 [SRS_Mem_00018] NVRAM 管理器应提供从 ROM 默认值恢复 NVRAM 块关联数据的功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供从 ROM 默认值恢复 NVRAM 块关联数据的功能。此服务的可用性应可配置。 |
| 用例 | 收音机出厂设置 |
⌋(RS_BRF_01840, RS_BRF_01848)
##### 6.1.3.9 [SRS_Mem_08548] NVRAM 管理器应从应用请求默认数据
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 如果配置时没有 ROM 块可用,NVRAM 管理器应从应用请求默认数据。这应可配置。 |
| 理由 | 灵活性 |
| 用例 | 校准数据无法由常量数据提供。 |
⌋(RS_BRF_01840, RS_BRF_01848)
##### 6.1.3.10 [SRS_Mem_08547] NVRAM 管理器应能区分显式无效和不一致数据
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应能区分显式无效和不一致数据。 |
| 理由 | 显式无效(甚至空白)数据块不应表示要报告给 DEM 的错误情况。 |
| 用例 | 如果 NVRAM 管理器检测到不一致数据,如由于中止的写操作或 CRC 错误,应报告错误。对于无效数据,不报告错误。 |
| 支持材料 | SRS_MemHwAb_14014, SRS_MemHwAb_14015, SRS_MemHwAb_14016 |
⌋(RS_BRF_01840, RS_BRF_00129)
##### 6.1.3.11 [SRS_Mem_08550] NVRAM 管理器应提供将永久 RAM 数据块标记为已修改/未修改的服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供将永久 RAM 数据块标记为已修改/未修改的服务。关机时仅保存已标记为已修改的数据到 NV。此服务的可用性应可配置。 |
| 理由 | 减少写周期,加快关机。 |
| 用例 | 应用最清楚何时将数据写回 NV 存储器。使用此功能将减少所需写周期数,从而减少漫游块和 NV 存储器消耗的需求,并由于底层 HW 引起的相当大的开销(提供预擦除存储器)而可能的缓慢写入而加快关机操作。 |
| 依赖 | [SRS_Mem_08546] RAM 数据块免于数据丢失的保护 |
⌋(RS_BRF_00129)
##### 6.1.3.12 [SRS_Mem_08545] NVRAM 管理器应提供将 NVRAM 块的永久 RAM 数据块标记为有效的服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供将 NVRAM 块的永久 RAM 数据块标记为有效的服务。<br>此外,该服务应更新完整性信息(如果已配置)。<br>此服务的可用性应可配置。 |
| 理由 | 仅保存有效数据到 NV。在启动时增加使用 RAM 中最新数据(而非从 NV 重新加载旧数据)的可能性。 |
| 用例 | 读取失败可能导致 RAM 内容无效。此内容不应保存到 NV 存储器。在这种情况下,应用负责通过呈现数据并调用此服务将其标记为有效来处理此情况。 |
| 依赖 | [SRS_Mem_08546] RAM 数据块免于数据丢失的保护 |
⌋(RS_BRF_00129)
##### 6.1.3.13 [SRS_Mem_08011] NVRAM 管理器应提供在非易失存储器中使数据块无效的服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供在非易失存储器中使数据块无效的服务。块由唯一标识符引用。<br><br>此服务的可用性应可配置。 |
| 理由 | 避免加载过时数据,特别是位置信息。 |
| 用例 | 天窗位置(增量电机位置)必须在每次移动后保存到 NVRAM 块。在天窗每次新移动之前,此位置必须被标记为无效。否则,天窗操作期间的复位将导致无效的天窗位置(因为加载来自 NVRAM 的旧位置)。这可能导致天窗机械结构损坏(撞击末端位置时)或严重伤害。 |
⌋(RS_BRF_01840)
##### 6.1.3.14 [SRS_Mem_08544] NVRAM 管理器应提供擦除与 NVRAM 块关联的 NV 块的服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供擦除与 NVRAM 块关联的 NV 块的服务。NVRAM 块由唯一标识符引用。此服务的可用性应可配置。 |
| 理由 | 显式擦除以支持下方列出的用例。 |
| 用例 | 崩溃数据写入:无写前擦除的延迟,因此预擦除 NV 块必须在应用定义的点(如通过诊断服务)完成。这不能自动完成。 |
⌋(RS_BRF_01416)
##### 6.1.3.15 [SRS_Mem_08007] NVRAM 管理器应提供选择有效数据集 NV 块的服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供选择有效数据集 NV 块的服务。此服务应将数据集编号(ROM 或 NVRAM)关联到相应的 RAM 块。 |
| 理由 | 使运行时选择 ROM/NVRAM 中不同数据集成为可能。 |
| 用例 | 一个 ECU 用于一辆汽车的多个型号/国家变体。根据车辆变体,选择 NVRAM 或 ROM 中对应的数据集。 |
| 支持材料 | BSW08006,块管理类型 — 数据集 |
⌋(RS_BRF_01832)
##### 6.1.3.16 [SRS_Mem_08542] NVRAM 管理器应提供作业处理顺序的优先级化
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供作业处理顺序的优先级化。最高优先级作业应首先处理;具有相同优先级的作业应以 FIFO 顺序执行。<br><br>此优先级化应可配置。如果禁用,作业应以 FIFO 顺序执行。 |
| 理由 | 某些数据必须比其他数据写入得更快。因此处理它们应优先。立即数据应抢占正在运行的较低优先级操作。 |
| 用例 | 崩溃数据写入;基于优先级的数据保存(如 SiemensVDO 的 NVRAM 管理器) |
| 依赖 | [SRS_Mem_08543], [SRS_Mem_08541] |
⌋(RS_BRF_01048)
##### 6.1.3.17 [SRS_Mem_00020] NVRAM 管理器应提供读出读/写操作状态的功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供读出读/写操作状态的功能。 |
| 理由 | NVRAM 管理器应支持各种非易失存储器设备。某些设备的访问时间与 ECU 的实时需求相比较长。因此 NVRAM 管理器应提供具有确定操作当前状态功能的异步 API。 |
| 用例 | 串行 EEPROM 的读/写 |
⌋()
##### 6.1.3.18 [SRS_Mem_00127] NVRAM 管理器应允许单独启用/禁用每个 NVRAM 块的写保护
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应允许单独启用/禁用每个 NVRAM 块的写保护。<br><br>写保护块的 RAM 块数据区域可无限制地更改。<br><br>如果 NV 块受保护,对此块的后续写访问作业将被拒绝。启用写保护的 NVRAM 块不能保存到 NV 存储器。复位后,写保护应根据初始写保护设置。<br><br>此服务的可用性应可配置。 |
| 理由 | 某些数据块不被应用更改,仅由特殊的 EOL(下线)/诊断服务更改 |
| 用例 | 编码数据,EOL(下线)数据。 |
| 依赖 | [SRS_Mem_08009] 块的默认写保护 |
⌋(RS_BRF_01840)
##### 6.1.3.19 [SRS_Mem_00030] NVRAM 管理器应实现保存在 NVRAM 中数据的一致性/完整性检查机制
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应实现操作期间保存在 NVRAM 中数据的一致性/完整性检查机制,即使在异步复位或断电的情况下。位翻转也应涵盖。<br><br>实现提示:校验和是一种可能性;此外,可使用写访问字节(有效/无效)。 |
| 理由 | 错误检测。 |
| 用例 | 用于检测位翻转的签名。 |
| 依赖 | [SRS_Mem_08001] 数据一致性检查配置 |
⌋(RS_BRF_01840, RS_BRF_00129)
##### 6.1.3.20 [SRS_Mem_08555] NVRAM 管理器应提供在读取 NVRAM 块时静态验证块标识符的机制
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供在读取 NVRAM 块时静态验证块标识符的机制。 |
| 理由 | 防止块错误寻址 |
| 用例 | 可检测硬件寻址错误 |
| 依赖 | [SRS_Mem_00030] 数据一致性/完整性检查 |
⌋(RS_BRF_00129)
##### 6.1.3.21 [SRS_Mem_08556] NVRAM 管理器应提供通过再次读取和比较来验证已写入块数据的机制
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应通过再次读取和比较来提供验证已写入块数据的机制。 |
| 理由 | 防止错误写入的数据 |
| 用例 | 可检测硬件写错误 |
| 依赖 | [SRS_Mem_08553] 数据写验证配置 |
⌋(RS_BRF_01840, RS_BRF_00129)
##### 6.1.3.22 [SRS_Mem_00034] NVRAM 管理器对持久存储器的写访问应与 ECU 正常运行准并行执行
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器对持久存储器的写访问应与 ECU 正常运行准并行(并发)执行。数据一致性不得受到威胁。 |
| 理由 | 某些类型存储器的写访问比处理器寄存器访问慢几个数量级。 |
| 用例 | EEPROM 写访问。 |
⌋(RS_BRF_01048, RS_BRF_01812)
##### 6.1.3.23 [SRS_Mem_08558] NVRAM 管理器应提供机制以移除与 NVRAM 块关联的所有未处理请求
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供机制以移除与 NVRAM 块关联的所有未处理请求 |
| 理由 | 在分区终止和随后重启之前源自该分区(如来自属于该分区的 SW-C)的请求不应被处理(因此不应报告完成)。 |
| 用例 | 处理分区的终止和重启。 |
⌋(RS_BRF_01048, RS_BRF_01812)
##### 6.1.3.24 [SRS_Mem_00136] NVRAM 管理器应提供运行时确定与 NVRAM 块关联数据更新的功能
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供运行时确定与 NVRAM 块关联数据更新的功能。NVRAM 块由唯一标识符引用。<br><br>此功能将允许在 RAM 块自上次读或写操作以来未更新的情况下跳过对 NV 存储器的写操作。<br><br>此功能的可用性应可配置。 |
| 理由 | 确定 RAM 块中非易失数据的更新。 |
| 用例 | 避免多余的存储操作。 |
⌋(RS_BRF_01416)
##### 6.1.3.25 [SRS_Mem_00138] NVRAM 管理器应提供触发选定块在 RAM 和 NV 存储器上首次或重新初始化的函数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应有多块操作可用,对具有永久 RAM 或显式同步的选定块执行以下操作:<br>(1) 从 ROM 块和/或初始化回调执行显式恢复<br>(2) 将这些内容写回 NV 存储器介质。<br><br>如果这些选定块没有恢复数据源(即 ROM 块和/或初始化回调),应执行此 NV 块的无效化,而不是写入恢复数据。在 DATASET 块的情况下,如果选择用于首次初始化,此 NvM 块的所有 NV 块实例应被无效化。 |
| 理由 | 不要让应用或单独管理的工厂程序完成整个工作。 |
| 用例 | (1) 工厂(重新)初始化<br>(2) 开发时清除 NV 存储器<br>(3) 通过测试仪访问重新初始化 |
⌋(RS_BRF_01416)
#### 6.1.4 关机操作
##### 6.1.4.1 [SRS_Mem_08535] NVRAM 管理器应提供触发完整性信息更新和保存 RAM 数据块到 NV 存储器的函数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供触发完整性信息更新(重新计算校验和,如 CRC)和保存 RAM 数据块到 NV 存储器的函数。此函数仅可影响永久 RAM 数据块,因为临时 RAM 数据块不能自动写回(如由 ECU 状态管理器触发)。<br><br>信息:<br>- 此函数必须由 ECU 状态管理器在关机前调用一次<br>- 此函数可由诊断服务("Save NVRAM")调用 |
| 理由 | 不要让应用完成整个工作。 |
| 用例 | ECU 关机:保存应用的 NV 数据 |
| 支持材料 | [SRS_LIBS_08534] RAM 数据块类别 |
⌋(RS_BRF_01840)
##### 6.1.4.2 [SRS_Mem_08540] NVRAM 管理器应提供中止关机过程的函数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 如果在 ECU 关机期间检测到 ECU 唤醒条件,NVRAM 管理器应提供函数以中止源自关机过程的写作业。源自应用的队列中的写请求不应受此取消例程影响。<br>此取消不应是破坏性的,即当前正在写入的 NVRAM 块应完成。 |
| 理由 | 允许在 ECU 关机过程中对唤醒条件快速反应。 |
| 用例 | ECU 关机:NVRAM 管理器已开始将所有 RAM 块保存到 NVRAM。在此作业处理期间,发生 ECU 唤醒条件。ECU 必须在给定时限内(如 100ms)可操作。NVRAM 管理器完成所有可能花费如 800ms 的写作业是不可接受的。 |
⌋(RS_BRF_01096)
##### 6.1.4.3 [SRS_Mem_00137] NVRAM 管理器应提供自动验证 NVRAM 块的服务
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应提供自动验证 NVRAM 块的服务。<br><br>此服务必须由 ECU 状态管理器在 ECU 关机的早期阶段调用一次。<br><br>此服务的可用性应可配置。 |
| 理由 | 在 RAM 块数据有效的情况下避免用 ROM 默认数据恢复 RAM 块。 |
| 用例 | ECU 关机:正常关机无法完成(如由于超时、电压下降)。 |
⌋(RS_BRF_01096)
#### 6.1.5 故障操作
##### 6.1.5.1 [SRS_Mem_00038] 可处理的错误不应影响其他软件组件
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器不应将可处理(可治愈或可恢复)的错误报告给其他软件组件。 |
| 理由 | 关注分离,避免不必要的功能降级 |
| 用例 | 数据冗余保存(在两个相同的块中)。如果在一个块中检测到数据损坏,则使用冗余块的内容。应用不受影响。 |
| 依赖 | [SRS_Mem_00129] 自动数据修复 |
| 支持材料 | SRS_LIBS_08529 块管理类型 — 冗余 |
⌋(RS_BRF_01076)
##### 6.1.5.2 [SRS_Mem_00129] NVRAM 管理器应修复管理类型为"NVRAM 冗余"的块中的数据
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 如果检测到数据损坏且可派生有效数据,NVRAM 管理器应修复管理类型为"NVRAM 冗余"的块中的数据。修复周期数应有限,以避免无限循环。 |
| 理由 | 健壮性 |
| 用例 | 冗余 NVRAM 块中的数据损坏(位翻转) |
| 支持材料 | SRS_LIBS_08529 块管理类型 — 冗余 |
⌋(RS_BRF_01840, RS_BRF_00129)
##### 6.1.5.3 [SRS_Mem_08010] 如果无法将 NV 数据读到 RAM,NVRAM 管理器应将 ROM 默认数据复制到对应 RAM 块的数据区域
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 如果 NVRAM 管理器无法将数据从 NV 读到 RAM,它应将 ROM 默认数据复制到对应 RAM 块的数据区域。 |
| 理由 | 健壮性 |
| 用例 | 校准数据集损坏。加载默认校准数据集。 |
| 支持材料 | 见所有块管理类型 |
⌋(RS_BRF_01840, RS_BRF_00129)
##### 6.1.5.4 [SRS_Mem_08015] NVRAM 中的某些 NV 块在首次初始化后永不应被擦除或替换为默认 ROM 数据
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | ECU 重编程后必须保留某些 NVRAM 数据。这意味着 NVRAM 中的某些 NV 块在首次初始化后永远不应被擦除或替换为默认 ROM 数据。 |
| 理由 | 防盗器代码或车辆识别号 |
⌋(RS_BRF_01840)
**注**:这是对配置/引导加载程序的需求。
### 6.2 非功能性需求(质量)
#### 6.2.1 硬件独立性
##### 6.2.1.1 [SRS_Mem_00011] NVRAM 管理器应独立于底层内存硬件
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | NVRAM 管理器应使用现有(标准化)接口访问底层内存硬件。这些接口应抽象出内存硬件。 |
| 理由 | 可移植性、可重用性、通过灵活使用内存设备降低硬件成本 |
⌋(RS_BRF_01800)
#### 6.2.2 易用性
(无具体需求列出)
---
## 7 参考文献
### 7.1 AUTOSAR 交付物
[AUTOSAR_SW_ARCH] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[AUTOSAR_BASIC_SW] List of Basic Software Modules
AUTOSAR_TR_BSWModuleList.pdf
[AUTOSAR_SRS_MEMHW] Requirements on Memory Hardware Abstraction Layer
AUTOSAR_SRS_MemoryHWAbstractionLayer.pdf
[TPS_STDT_0078] SoftwareComponentTemplate
AUTOSAR_TPS_SoftwareComponentTemplate.pdf
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SRS_MemoryServices v4.4.0(Document ID 007)。
- 保留所有需求 ID(SRS_Mem_xxxxx、RS_BRF_xxxxx 等)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(NVRAM、NV、ECU、CRC、EOL 等)保持英文。
+396
View File
@@ -0,0 +1,396 @@
# RAM 测试需求规范
> **文档标题**: Requirements on RAM Test
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 114
> **文档类型**: SRS (Software Requirements Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Requirements on RAM Test |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 114 |
| 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 | 新增第 5 章"需求追溯" |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 多项更正;编辑性修订 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 编辑性修订 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 编辑性修订 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 文档模板与需求追溯的形式化更新;符合 ISO 26262 |
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | 修订 SRS_RamTst_13801;法律免责声明修订 |
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 |
| 2007-12-21 | 3.0.1 | AUTOSAR Administration | 文档元信息扩充;小幅排版调整 |
| 2007-01-24 | 2.1.15 | AUTOSAR Administration | "用户须知"修订;增加"版本信息" |
| 2006-11-28 | 2.1 | AUTOSAR Administration | 移除 [BSW13814] 已被否决的"改良汉明码"测试;法律免责声明修订 |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 初始版本发布 |
---
## 目录
1. [本文档的范围](#1-本文档的范围)
2. [如何阅读本文档](#2-如何阅读本文档)
- 2.1 [使用的约定](#21-使用的约定)
- 2.2 [需求结构](#22-需求结构)
3. [缩略语](#3-缩略语)
4. [功能概述](#4-功能概述)
5. [需求追溯](#5-需求追溯)
6. [需求规范](#6-需求规范)
- 6.1 [功能性需求](#61-功能性需求)
- 6.1.1 [配置](#611-配置)
- 6.1.2 [正常运行](#612-正常运行)
- 6.2 [非功能性需求](#62-非功能性需求)
7. [参考文献](#7-参考文献)
---
## 1 本文档的范围
本文档规定了 RAM Test 模块的需求。
本文档仅涵盖用于检查 RAM 的软件算法的需求。硬件 RAM 检查(如 ECC 校验)不在本文档范围之内。
---
## 2 如何阅读本文档
每条需求都有一个以"BSW"(代表"Basic Software")为前缀的唯一标识符。对于任何评审注释、备注或问题,请引用此唯一 ID,而非章节号或页码!
### 2.1 使用的约定
- AUTOSAR 文档中需求的表示形式遵循 [5] 中规定的表格格式。
- 需求中使用以下特定语义。
本文档中的关键字 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY" 和 "OPTIONAL" 需按下述方式解读。请注意,使用这些关键字的文档的需求级别会修饰它们的强制性。
- **MUST**:该词或术语 "REQUIRED" 或 "SHALL" 表示该定义是规范的绝对要求。
- **MUST NOT**:该短语或短语 "SHALL NOT" 表示该定义是规范的绝对禁止项。
- **SHOULD**:该词或形容词 "RECOMMENDED" 表示在特定情况下可能存在忽略某项的合理原因,但必须在选择不同方案之前充分理解并慎重权衡所有影响。
- **SHOULD NOT**:该短语或短语 "NOT RECOMMENDED" 表示在特定情况下可能存在该特定行为可接受甚至有用的合理原因,但应在实施任何带有该标签的行为之前充分理解所有影响并慎重权衡。
- **MAY**:该词或形容词 "OPTIONAL" 表示某项是真正可选的。
### 2.2 需求结构
每个模块特定章节包含基础软件模块的简短功能描述。每章中同类需求归类于以下小标题之下(如适用):
**功能性需求**:
- 配置(模块中哪些元素需要可配置)
- 初始化
- 正常运行
- 关机运行
- 故障运行
- ……
**非功能性需求**:
- 时序需求
- 资源使用
- 易用性
- 为其他工作包提供的输出(如描述模板、工具支持等)
- ……
---
## 3 缩略语
| 缩略语 | 描述 |
|--------|------|
| ECU | Electric Control Unit(电子控制单元) |
| EOL | End Of Line(下线)。常用于 "EOL Programming" 或 "EOL Configuration" |
| MAL | Microcontroller Abstraction Layer 旧名称(已由 MCAL 替代,因为 "MAL" 在法语中意为 "差") |
| MCAL | Microcontroller Abstraction Layer(微控制器抽象层) |
| MCU | Microcontroller Unit(微控制器单元) |
| NMI | Non maskable interrupt(不可屏蔽中断) |
| OS | Operating System(操作系统) |
| SPAL | 本工作组的名称 |
| SFR | Special Function Register(特殊功能寄存器) |
| RTE | Runtime environment(运行时环境) |
| WP | Work Package(工作包) |
| 缩写 | 描述 |
|------|------|
| STD | Standard(标准) |
| REQ | Requirement(需求) |
| UNINIT | Uninitialized(未初始化) |
由于本文档由专业人员为专业人员撰写,其他所有术语均假定为读者已知。
---
## 4 功能概述
本模块的任务是通过软件测试 RAM 内存区域。
---
## 5 需求追溯
| 需求 | 描述 | 满足者 |
|------|------|--------|
| RS_BRF_00057 | AUTOSAR 应定义一种内存映射机制 | SRS_RamTst_13802 |
| RS_BRF_00129 | AUTOSAR 应支持数据损坏检测与保护 | SRS_RamTst_13803, SRS_RamTst_13804, SRS_RamTst_13809, SRS_RamTst_13811, SRS_RamTst_13822, SRS_RamTst_13823, SRS_RamTst_13824 |
| RS_BRF_01048 | AUTOSAR 模块设计应支持多任务环境下模块协同工作 | SRS_RamTst_13809 |
| RS_BRF_01056 | AUTOSAR BSW 模块应提供标准化接口 | SRS_RamTst_13810 |
| RS_BRF_01064 | AUTOSAR BSW 应提供回调函数以访问上层模块 | SRS_RamTst_13820 |
| RS_BRF_01472 | AUTOSAR 应支持模式 | SRS_RamTst_13822, SRS_RamTst_13823, SRS_RamTst_13824 |
| RS_BRF_01504 | AUTOSAR 应处理 ECU 睡眠引起的内存损坏 | SRS_RamTst_13804 |
| RS_BRF_02040 | AUTOSAR BSW 与 RTE 应确保数据一致性 | SRS_RamTst_13816 |
| RS_BRF_02048 | AUTOSAR 应支持使用硬件内存保护功能以提升安全性 | SRS_RamTst_13825 |
| RS_BRF_02064 | AUTOSAR 应使用硬件通信数据完整性机制 | SRS_RamTst_13825 |
| RS_BRF_02224 | AUTOSAR 应支持运行时硬件测试 | SRS_RamTst_13800, SRS_RamTst_13801, SRS_RamTst_13804, SRS_RamTst_13809, SRS_RamTst_13811, SRS_RamTst_13812, SRS_RamTst_13822, SRS_RamTst_13823, SRS_RamTst_13824 |
---
## 6 需求规范
### 6.1 功能性需求
#### 6.1.1 配置
##### 6.1.1.1 [SRS_RamTst_13800] 被测单元数量应可在运行时更改
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 为了响应不同需求(睡眠、驾驶循环),用户应有可能"在线"更改每个周期内被测单元的数量。 |
| 理由 | 影响中断禁用时间。 |
| 用例 | 当车辆行驶时,系统中断锁定时间必须远短于睡眠模式下的时间。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224)
##### 6.1.1.2 [SRS_RamTst_13801] 测试单元大小应作为已发布参数
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 实现者应根据控制器特性为特定测试实现选择测试单元大小(位、字节、字、长字)。该参数应与具体实现一起发布给集成方。 |
| 理由 | -- |
| 用例 | 实现者根据控制器特性进行运行时优化。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224)
##### 6.1.1.3 [SRS_RamTst_13802] 多个 RAM 区域应可在后构建/链接时配置
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应可配置多个 RAM 区域(通过配置其起始与结束地址)。如果两个 RAM 区域重叠,且在测试其中一个块时在重叠区域检测到错误,则驱动不保证更新另一个块的状态。 |
| 理由 | -- |
| 用例 | 用户应有可能配置内存映射。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_00057)
##### 6.1.1.4 [SRS_RamTst_13803] 应可在预编译时选择可用 RAM 测试算法的子集
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 用户应在预编译时选择与项目安全需求匹配的可用算法。 |
| 理由 | 避免未使用代码。 |
| 用例 | 取决于 ECU 安全分析,应可选择不同的 RAM 测试算法。为节省 ROM 空间,算法应可在编译时选择。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_00129)
##### 6.1.1.5 [SRS_RamTst_13804] 应可在运行时从预编译选定的 RAM 检查测试算法的子集中进一步选择
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 用户应在运行时从可用算法中选择测试算法,以符合项目安全需求。 |
| 理由 | 提供不同级别的测试。 |
| 用例 | 正常运行期间执行简单测试,而在进入睡眠模式前将执行更复杂的 RAM 测试算法。由于中断延迟需求更严格,复杂的 RAM 测试无法在正常运行期间执行。 |
| 依赖 | [SRS_RamTst_13803] |
| 支持材料 | -- |
⌋(RS_BRF_00129, RS_BRF_02224, RS_BRF_01504)
#### 6.1.2 正常运行
##### 6.1.2.1 [SRS_RamTst_13822] 应提供具有低覆盖率的安全机制
| 字段 | 内容 |
|------|------|
| 类型 | New |
| 描述 | 应提供满足 60% 诊断覆盖率的安全度量。它可以由硬件方式、适当的测试算法或两者提供。 |
| 理由 | 检测 RAM 中的永久性故障。 |
| 用例 | 支持 EOL、快速启动测试以及需要低诊断覆盖率测试的场景,例如,如果系统仅具有低 ISO 26262 ASIL 等级的安全目标。 |
| 依赖 | -- |
| 支持材料 | ISO 26262-5:2011, Tables 4, 5, D.1 and D.6, sections D.2.5.1, D.2.5.2 and D.2.5.3 |
⌋(RS_BRF_00129, RS_BRF_02224, RS_BRF_01472)
##### 6.1.2.2 [SRS_RamTst_13823] 应提供具有中等覆盖率的测试算法
| 字段 | 内容 |
|------|------|
| 类型 | New |
| 描述 | 应提供满足 90% 诊断覆盖率的安全度量。它可以由硬件方式、适当的测试算法或两者提供。 |
| 理由 | 检测 RAM 中的永久性故障。 |
| 用例 | 支持 EOL、启动测试以及需要中等诊断覆盖率测试的场景,例如,如果系统安全目标的 ASIL 等级的 ISO 26262 潜在故障度量可以通过中等覆盖率实现。 |
| 依赖 | -- |
| 支持材料 | ISO 26262-5:2011, Tables 4, 5, D.1 and D.6, sections D.2.5.1, D.2.5.2 and D.2.5.3 |
⌋(RS_BRF_00129, RS_BRF_02224, RS_BRF_01472)
##### 6.1.2.3 [SRS_RamTst_13824] 应提供具有高覆盖率的测试算法
| 字段 | 内容 |
|------|------|
| 类型 | New |
| 描述 | 应提供满足 99% 诊断覆盖率的安全度量。它可以由硬件方式、适当的测试算法或两者提供。 |
| 理由 | 检测 RAM 中的永久性故障。 |
| 用例 | 支持 EOL、严谨的启动、关机或运行时测试,以及需要高诊断覆盖率测试的场景,例如,如果系统具有高 ISO 26262 ASIL 等级的安全目标。 |
| 依赖 | -- |
| 支持材料 | ISO 26262-5:2011, Tables 4, 5, D.1 and D.6, sections D.2.5.1, D.2.5.2 and D.2.5.3 |
⌋(RS_BRF_00129, RS_BRF_02224, RS_BRF_01472)
##### 6.1.2.4 [SRS_RamTst_13809] 应可将 RAM 测试执行划分为更小的部分
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 应可将 RAM 测试执行划分为更小的部分。每次调用 RAM 测试时,应仅可执行整个 RAM 测试的一部分。 |
| 理由 | 避免长时间中断禁用。 |
| 用例 | 需要短中断延迟时间的驱动程序。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_00129, RS_BRF_02224, RS_BRF_01048)
##### 6.1.2.5 [SRS_RamTst_13810] 每块的 RAM 测试执行当前状态应通过 get status 接口可用
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | RAM 测试每块的执行状态(RESULT_NOT_TESTED、RESULT_OK、RESULT_NOT_OK 和 RESULT_UNDEFINED)应提供给用户。用户应有可能随时获取 RAM 测试的状态。这应实现为 get status 接口,并可在编译时进行配置。此功能应为可选。 |
| 理由 | -- |
| 用例 | 诊断可能需要知道是否发生了错误。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01056)
##### 6.1.2.6 [SRS_RamTst_13820] RAM 测试执行状态应通过通知机制提供
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 关于何时检测到错误或测试完成的信息应通过通知机制提供给用户。此功能应为可选。 |
| 理由 | -- |
| 用例 | 诊断可能需要立即知道是否检测到错误。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_01064)
##### 6.1.2.7 [SRS_RamTst_13811] RAM 测试模块应能够以非破坏性方式执行其测试
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | RAM 测试模块应能够以非破坏性方式执行其测试。 |
| 理由 | 原始数据应被保留。 |
| 用例 | 销毁所有 RAM 数据可能导致更长的反应时间(如唤醒)、更高的资源消耗(如:EEPROM)。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224, RS_BRF_00129)
##### 6.1.2.8 [SRS_RamTst_13812] RAM 测试模块应能够以破坏性方式执行其测试
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | RAM 测试模块应能够以破坏性方式执行其测试。测试后 RAM 的状态应为定义的。 |
| 理由 | 原始数据无需保留。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02224)
### 6.2 非功能性需求
#### 6.2.1 [SRS_RamTst_13816] 应考虑指令/数据队列的影响
| 字段 | 内容 |
|------|------|
| 类型 | Valid |
| 描述 | 写入一个单元后再读回,可能导致读回的值来自数据队列而非待测试 RAM 单元的问题。此时,需要注入指令以消除此类影响。 |
| 理由 | 从已测试单元读回值。 |
| 用例 | 带有指令或数据队列的控制器可能有此类影响。 |
| 依赖 | -- |
| 支持材料 | -- |
⌋(RS_BRF_02040)
#### 6.2.2 [SRS_RamTst_13825] RAM 测试模块应可用于符合 ISO 26262 不同 ASIL 等级的需求
| 字段 | 内容 |
|------|------|
| 类型 | New |
| 描述 | RAM 测试模块应为 RAM 中的永久性故障提供并记录(故障模型与故障覆盖率)诊断能力,以便实现 ISO 26262 不同 ASIL 等级的潜在故障度量目标。 |
| 理由 | AUTOSAR 适用于需要符合 ISO 26262 的系统。 |
| 用例 | -- |
| 依赖 | -- |
| 支持材料 | ISO 26262-5:2011, Tables 4, 5, D.1 and D.6, sections D.2.5.1, D.2.5.2 and D.2.5.3 |
⌋(RS_BRF_02048, RS_BRF_02064)
---
## 7 参考文献
### 7.1 AUTOSAR 交付物
[1] Glossary
AUTOSAR_TR_Glossary.pdf
[2] Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[4] General Requirements on SPAL
AUTOSAR_SRS_SPALGeneral.pdf
[5] Software Standardization Template
AUTOSAR_TPS_StandardizationTemplate.pdf
### 7.2 相关标准与规范
[6] CEI/IEC 61508-2:2000: 关于电气/电子/可编程电子安全相关系统的需求
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SRS_RAMTest v4.4.0(Document ID 114)。
- 保留所有需求 ID(如 SRS_RamTst_xxxxx、RS_BRF_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 保留 ISO 26262 等标准引用。
- 模块缩写(RamTst、ECU 等)保持英文。
+554
View File
@@ -0,0 +1,554 @@
# 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 章。
+757
View File
@@ -0,0 +1,757 @@
# EEPROM 驱动规范
> **文档标题**: Specification of EEPROM Driver
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 021
> **文档类型**: SWS (Software Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Specification of EEPROM Driver |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 021 |
| 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 | MCAL 多核分发 |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 将 EEP_E_TIMEOUT 和 EEP_E_BUSY 从开发错误改为运行时错误;更改 ECUC_Eep_00189 描述 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 删除过时的 7.11 "调试支持"章节和 10.2.1 "变体"子章节;按字节读/写/擦除访问适配;传递给函数的 DataBuffers 对齐 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | DET 重命名和适配;第 7 章错误分类适配 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 为扩展生产错误增加通过/失败标准和额外属性;移除 Eep_Init() 关于 NULL_PTR 检查的冗余 SWS ID |
| 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 修正 SWS_Eep_00102、SWS_Eep_00068 和 SWS_Eep_00137 的格式 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 从 Eep_MainFunction API 表中移除 'Timing' 行;编辑性修订 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | MemMap.h 改为 Eep_MemMap.h;新增扩展生产错误 |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | EEP178 & EEP185 增加 FloatParamDef 参数最小最大值;模块短名称替换为模块缩写 |
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | 新增 DET 错误 EEP_E_PARAM_POINTER、EEP_E_TIMEOUT;版本检查章节(7.10)修订 |
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | 使 SWS_Eep_00003、SWS_Eep_00030、SWS_Eep_00128 中隐藏文本可见;澄清可选回调通知;重做外部 SPI EEPROM 配置示例;改用 VARIANT-POST-BUILD 替代 VARIANT-LINK-TIME;澄清 Eep_Cancel() 同步行为;添加调试支持;新增 HW 故障 DEM 错误代码 |
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 |
| 2007-12-21 | 3.0.1 | AUTOSAR Administration | SWS_Eep_00005 措辞微调;新增 NULL_PTR 检查需求(SWS_Eep_00161, 00162);更新 SWS_Eep_00028 和图 4 |
| 2007-01-24 | 2.1.15 | AUTOSAR Administration | 常量名修正;擦写周期限制;链接时配置 vs 配置指针检查;比较作业的作业结果未规定 |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 文档结构适配 Release 2.0 SWS 模板;适配新的内存抽象架构;取消功能改为异步 |
| 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 介绍与功能概述
本规范描述 EEPROM 驱动的功能和 API。本规范同时适用于内部和外部 EEPROM 驱动。
EEPROM 驱动提供对 EEPROM 进行读、写、擦除的服务。它还提供将 EEPROM 中数据块与内存(如 RAM)中数据块进行比较的服务。
这些服务的行为是异步的。
内部 EEPROM 驱动直接访问微控制器硬件,位于微控制器抽象层(MCAL)。外部 EEPROM 驱动使用处理程序(大多数情况下为 SPI)或驱动访问外部 EEPROM 设备,位于 ECU 抽象层。
两类驱动的功能需求和功能范围相同,因此 API 在语义上相同。
---
## 2 缩略语
| 缩略语 | 描述 |
|--------|------|
| Data block(数据块) | 一个数据块可包含 1..n 字节,在 EEPROM 驱动 API 中使用。数据块以 EEPROM 中的地址偏移、指向内存位置的指针、长度传递给 EEPROM 驱动。 |
| Data unit(数据单元) | EEPROM 中最小数据实体。对读/写/擦除操作可能不同。<br>**示例 1**:Motorola STAR12 — 读:1 字节;写:2 字节;擦:4 字节<br>**示例 2**:外部 SPI EEPROM 设备 — 读/写/擦:1 字节 |
| Normal mode(普通模式) | 通过 SPI 与 EEPROM 设备的数据交换按字节进行,允许与其他 SPI 设备(如 I/O ASIC、外部看门狗等)协作使用 SPI。 |
| Burst mode(突发模式) | 通过 SPI 与 EEPROM 设备的数据交换按块进行。块大小取决于 EEPROM 属性,例如 64 字节。由于传输大块,SPI 在突发模式下被 EEPROM 访问阻塞。此模式用于 ECU 启动和关机阶段,需要快速数据读写。 |
| EEPROM cell | 持有数据的 EEPROM 设备最小物理单元。通常为 1 字节。 |
| 缩写 | 描述 |
|------|------|
| EEPROM | 电可擦可编程只读存储器 |
| NVRAM | 非易失随机存取存储器 |
| NvM | NVRAM Manager 模块名 |
| EcuM | ECU State Manager 模块名 |
| DEM | Diagnostic Event Manager 模块名 |
| DET | Default Error Tracer 模块名 |
---
## 3 相关文档
### 3.1 输入文档
- [1] Layered Software Architecture — AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
- [2] General Requirements on Basic Software Modules — AUTOSAR_SRS_BSWGeneral.pdf
- [3] Specification of Memory Abstraction Interface — AUTOSAR_SWS_MemoryAbstractionInterface.pdf
- [4] Specification of SPI Handler/Driver — AUTOSAR_SWS_SPIHandlerDriver.pdf
- [5] Specification of ECU Configuration — AUTOSAR_TPS_ECUConfiguration.pdf
- [6] Requirements on EEPROM Driver — AUTOSAR_SRS_EEPROMDriver.pdf
- [7] Specification of Default Error Tracer — AUTOSAR_SWS_DefaultErrorTracer.pdf
- [8] Specification of Diagnostics Event Manager — AUTOSAR_SWS_DiagnosticEventManager.pdf
- [9] AUTOSAR Glossary — AUTOSAR_TR_Glossary.pdf
- [10] Specification of MCU Driver — AUTOSAR_SWS_MCUDriver.pdf
- [11] Basic Software Module Description Template — AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
- [12] List of Basic Software Modules — AUTOSAR_TR_BSWModuleList.pdf
- [13] General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral.pdf
### 3.2 相关规范
AUTOSAR 提供基础软件模块通用规范 [13](SWS BSW General),也适用于 EEPROM 驱动。因此,SWS BSW General 规范应被视为 EEPROM 驱动的附加和必需规范。
---
## 4 约束与假设
### 4.1 限制
EEPROM 驱动不提供数据完整性机制(如校验和、冗余存储等)。
不提供 EEPROM 写保护设置。
### 4.2 适用车型领域
无限制。
### 4.3 适用安全相关环境
如果上层软件为安全相关数据提供以下机制,本模块可在安全相关系统中使用:
- 校验和保护
- 使用数据前检查完整性
- 冗余存储
- 写入 EEPROM 后验证数据。可使用 EEPROM 驱动的比较函数。
---
## 5 模块依赖
EEPROM 驱动有两类:
1. **片上 EEPROM 驱动**:微控制器抽象层(MCAL)的一部分。
2. **外部 EEPROM 设备驱动**:ECU 抽象层的一部分。
[SWS_Eep_00082] ⌈外部 EEPROM 驱动的源代码应独立于微控制器平台。⌋ ()
内部 EEPROM 可能依赖系统时钟、预分频器和 PLL。因此,系统时钟的变更(如 PLL 开 → PLL 关)也可能影响 EEPROM 硬件的时钟设置。EEPROM Driver 模块在其 init 函数中不处理配置时钟、预分频器和 PLL 的寄存器。这必须由 MCU 模块 [10] 完成。
外部 EEPROM 驱动依赖所使用板载通信处理程序(如 SPI Handler/Driver)的 API 和能力。
EEPROM 驱动是内存抽象架构的一部分,因此某些类型依赖 Memory Interface (MemIf) 模块。
### 5.1 文件结构
[SWS_Eep_00228] ⌈如果模块实现使用自定义中断处理,中断服务例程应放在 Eep_Irq.c。⌋ ()
---
## 6 需求追溯
(详细需求追溯表请参考原文 PDF 第 6 章。涉及 SRS_BSW_*、SRS_Eep_*、SRS_SPAL_* 等多个需求类别。主要部分:)
| 需求 | 满足者 |
|------|--------|
| SRS_BSW_00101 | SWS_Eep_00004 |
| SRS_BSW_00323 | SWS_Eep_00016, 00017, 00018 |
| SRS_BSW_00335 | SWS_Eep_00138 |
| SRS_BSW_00337 | SWS_Eep_00000, 00200-00203 |
| SRS_BSW_00406 | SWS_Eep_00006, 00033 |
| SRS_Eep_00087 (异步读) | SWS_Eep_00009, 00013, 00256 |
| SRS_Eep_00088 (异步写) | SWS_Eep_00014, 00015, 00063, 00090, 00256 |
| SRS_Eep_00089 (异步擦除) | SWS_Eep_00019, 00020, 00070, 00072 |
| SRS_Eep_00090 (同步取消) | SWS_Eep_00021, 00027, 00028, 00215, 00216 |
| SRS_Eep_00091 (状态返回) | SWS_Eep_00029 |
| SRS_Eep_00092 (写周期减少) | SWS_Eep_00060, 00064 |
| SRS_Eep_00094 (内存分段) | SWS_Eep_00063, 00070, 00072, 00090 |
| SRS_Eep_00095 (单作业处理) | SWS_Eep_00033, 00036 |
| SRS_Eep_12047 (作业处理函数) | SWS_Eep_00030, 00032 |
| SRS_Eep_12050 (硬件能力限制) | SWS_Eep_00051, 00054, 00057, 00069 |
| SRS_Eep_12091 (异步比较) | SWS_Eep_00025, 00026, 00256 |
| SRS_Eep_12124 (SPI 模式访问) | SWS_Eep_00052, 00053, 00055, 00073 |
| SRS_Eep_12156 (模式切换) | SWS_Eep_00042, 00130, 00132 |
| SRS_Eep_12157 (普通模式读) | SWS_Eep_00051, 00052, 00053 |
| SRS_SPAL_12448 | SWS_Eep_00016, 00017, 00018, 00033 |
完整追溯表见原文 PDF。
---
## 7 功能规范
### 7.1 总体行为
[SWS_Eep_00088] ⌈Eep SWS 应同时适用于内部和外部 EEPROM。Eep SWS 定义 EEPROM 操作(读/写/擦除/比较)的异步服务。⌋ (SRS_Eep_12051)
[SWS_Eep_00036] ⌈Eep 模块不应缓存作业。Eep 模块一次只接受一个作业。作业处理期间,Eep 模块不应接受其他作业。⌋ (SRS_Eep_00095)
[SWS_Eep_00037] ⌈Eep 模块不应缓存要读取或写入的数据。Eep 模块应使用通过 API 传递的指针引用的应用数据缓冲区。⌋ (SRS_SPAL_12075)
[SWS_Eep_00256] ⌈Eep 驱动应在内部处理数据缓冲区对齐。它不应对 RAM 缓冲区的对齐(因其为 uint8*)提出任何要求,而应将传入的指针视为仅按字节对齐。⌋
### 7.2 错误分类
#### 7.2.1 开发错误
[SWS_Eep_00000] ⌈Eep 模块应根据其构建选项(开发/生产模式)检测以下错误:
| 错误类型 | 相关性 | 相关错误代码 | 值[hex] |
|----------|--------|--------------|---------|
| 无效配置集选择 | Development | EEP_E_INIT_FAILED | 0x10 |
| | | EEP_E_PARAM_ADDRESS | 0x11 |
| | | EEP_E_PARAM_DATA | 0x12 |
| | | EEP_E_PARAM_LENGTH | 0x13 |
| 用 NULL 指针调用 API 服务 | Development | EEP_E_PARAM_POINTER | 0x23 |
| 模块未初始化即调用 API 服务 | Development | EEP_E_UNINIT | 0x20 |
⌋ (SRS_BSW_00337, SRS_BSW_00385)
#### 7.2.2 运行时错误
[SWS_Eep_00251] ⌈
| 错误类型 | 相关性 | 相关错误代码 | 值[hex] |
|----------|--------|--------------|---------|
| 驱动繁忙时调用 API 服务 | Runtime | EEP_E_BUSY | 0x21 |
| 超时 | Runtime | EEP_E_TIMEOUT | 0x22 |
⌋ ()
#### 7.2.3 瞬态故障
无瞬态故障。
#### 7.2.4 生产错误
无生产错误。
#### 7.2.5 扩展生产错误
包括以下扩展生产错误:
##### EEP_E_ERASE_FAILED
| 项 | 内容 |
|-----|------|
| Error Name | EEP_E_ERASE_FAILED |
| Short Description | EEPROM 擦除失败(HW) |
| Long Description | Eeprom 模块在 EEPROM 擦除作业因硬件错误失败时报告此错误。 |
| Detection Criteria | Fail: EEPROM 擦除作业失败;Pass: EEPROM 擦除作业成功完成 |
##### EEP_E_WRITE_FAILED
| 项 | 内容 |
|-----|------|
| Error Name | EEP_E_WRITE_FAILED |
| Short Description | EEPROM 写失败(HW) |
| Long Description | Eeprom 模块在 EEPROM 写作业因硬件错误失败时报告此错误。 |
##### EEP_E_READ_FAILED
EEPROM 读作业因硬件错误失败。
##### EEP_E_COMPARE_FAILED
EEPROM 比较作业因硬件错误失败。
### 7.3 错误检测
#### 7.3.1 API 参数检查
[SWS_Eep_00016] ⌈如果 Eep 模块的开发错误检测启用:`Eep_Read()``Eep_Write()``Eep_Compare()``Eep_Erase()` 函数应检查 `DataBufferPtr` 不为 NULL。如果 `DataBufferPtr` 为 NULL,它们应引发开发错误 `EEP_E_PARAM_DATA`,否则(如未启用开发错误检测)应返回 E_NOT_OK。⌋ (SRS_BSW_00323, SRS_SPAL_12448)
[SWS_Eep_00017] ⌈如果开发错误检测启用:函数应检查 `EepromAddress` 是否有效。如果不在有效 EEPROM 地址范围内,应引发开发错误 `EEP_E_PARAM_ADDRESS`,否则返回 E_NOT_OK。⌋
[SWS_Eep_00018] ⌈如果开发错误检测启用:函数应检查参数 `Length` 是否在最小值(1)和最大值(`EepSize - EepromAddress`)之间。如不在,引发 `EEP_E_PARAM_LENGTH`,否则返回 E_NOT_OK。⌋
#### 7.3.2 EEPROM 状态检查
[SWS_Eep_00033] ⌈`Eep_SetMode()``Eep_Read()``Eep_Write()``Eep_Compare()``Eep_Erase()` 函数应检查 EEPROM 状态是否为 MEMIF_IDLE。如果不是:
- 如果模块尚未初始化且开发错误检测启用,引发开发错误 `EEP_E_UNINIT`
- 根据 EEPROM 状态引发运行时错误 `EEP_E_BUSY`
- 以 E_NOT_OK 拒绝服务(除 `Eep_SetMode()` 外,因其无返回值)
#### 7.3.3 EEPROM 作业遇到硬件故障
- [SWS_Eep_00200] EEP_E_ERASE_FAILED:EEPROM 擦除函数失败时报告
- [SWS_Eep_00201] EEP_E_WRITE_FAILED:EEPROM 写函数失败时报告
- [SWS_Eep_00202] EEP_E_READ_FAILED:EEPROM 读函数失败时报告
- [SWS_Eep_00203] EEP_E_COMPARE_FAILED:EEPROM 比较函数失败时报告
#### 7.3.4 超时监视
[SWS_Eep_00234] ⌈当读、写、擦或比较作业的超时监视失败时,应报告运行时错误代码 `EEP_E_TIMEOUT`。⌋
### 7.4 错误通知
详见 SWS_BSWGeneral 第 7.2 章。
### 7.5 作业处理 — 通用需求
[SWS_Eep_00128] ⌈Eep 模块应允许通过配置参数 `EepUseInterrupts` (ECUC_Eep_00163) 配置为中断或轮询控制的作业处理。⌋
[SWS_Eep_00129] ⌈如果支持并启用中断控制作业处理,位于 Eep_Irq.c 的外部中断服务例程应调用一个附加的作业处理函数。⌋
[SWS_Eep_00246] ⌈如果底层 EEPROM 技术对读取地址或长度信息要求特定对齐,且读取或比较作业的地址和/或长度参数未正确对齐,`Eep_MainFunction` 函数应在内部补偿此缺失的对齐,即提供按字节的 Flash 内存读访问。⌋
#### SPI EEPROM 驱动额外通用需求
- [SWS_Eep_00056] SPI 访问失败时,Eep 模块行为参考 SWS_Eep_00068
- [SWS_Eep_00052] 普通模式:使用为普通 SPI EEPROM 访问配置的 SPI 通道
- [SWS_Eep_00053] EepNormalReadBlockSize 应匹配普通 SPI 模式可读字节数
- [SWS_Eep_00055] 快速模式:使用为突发访问 SPI EEPROM 配置的 SPI 通道
- [SWS_Eep_00073] EepFastReadBlockSize 应匹配突发 SPI 模式可读字节数
### 7.6 读作业处理
[SWS_Eep_00130] ⌈Eep 模块应提供两种不同的读模式:普通模式、快速模式⌋
[SWS_Eep_00132] ⌈对于驱动外部 EEPROM 的 Eep 模块:如外部 EEPROM 不支持突发模式,应接受快速读模式选择,但行为与普通模式相同。⌋
[SWS_Eep_00051] ⌈普通 EEPROM 模式下,Eep 模块在一个作业处理周期内应读取 `EepNormalReadBlockSize` 参数指定的字节数。⌋
**示例**:`EepNormalReadBlockSize = 4`,读取 21 字节,所需 6 个周期,模式:4-4-4-4-4-1
[SWS_Eep_00054] ⌈快速 EEPROM 模式下,Eep 模块在一个周期内应读取 `EepFastReadBlockSize` 指定的字节数。⌋
**示例**:`EepFastReadBlockSize = 32`,读取 110 字节,所需 4 个周期,模式:32-32-32-14
[SWS_Eep_00058] ⌈读作业成功完成时,Eep 模块应将 EEPROM 状态设置为 MEMIF_IDLE,作业结果设置为 MEMIF_JOB_OK。如已配置,调用 `EepJobEndNotification` 中定义的通知。⌋
[SWS_Eep_00068] ⌈读作业处理期间检测到错误时,Eep 模块应中止作业,EEPROM 状态设为 MEMIF_IDLE,作业结果设为 MEMIF_JOB_FAILED。如已配置,调用 `EepJobErrorNotification` 通知。⌋
### 7.7 写作业处理
[SWS_Eep_00057] ⌈Eep 模块在一个作业处理周期内只应向 EEPROM 写入(和擦除)EEPROM 硬件支持的字节数。⌋
[SWS_Eep_00133] ⌈提供两种写模式:普通、快速⌋
[SWS_Eep_00097] / [SWS_Eep_00098] ⌈分别由 `EepNormalWriteBlockSize``EepFastWriteBlockSize` 指定每周期写入字节数。⌋
[SWS_Eep_00060] ⌈如果要写入 EEPROM 单元的值已包含在该单元中,Eep 模块在 `EepWriteCycleReduction` 配置时应跳过该单元的编程。⌋ (SRS_Eep_00092)
[SWS_Eep_00059] ⌈如果 EEPROM 硬件不自动进行,Eep 模块应在写入前擦除 EEPROM 单元。⌋
[SWS_Eep_00063] [SWS_Eep_00090] ⌈如果要写入字节数小于可擦除/可写数据单元,或地址/长度参数未对齐到可擦除/可写数据单元,Eep 模块应通过读-修改-写操作保留受影响 EEPROM 单元数据。⌋
[SWS_Eep_00064] ⌈写入数据块时,Eep 模块应尽量减少读-修改-写操作次数。⌋
### 7.8 擦除作业处理
- [SWS_Eep_00069] 一周期内只擦 EEPROM 硬件支持的字节数
- [SWS_Eep_00070] 如硬件支持且参数对齐,使用块擦除命令
- [SWS_Eep_00072] 如擦除参数未对齐到可擦除数据单元,使用读-修改-写保留受影响内容
### 7.9 比较作业处理
适用读相关需求:SWS_Eep_00130, 00132, 00051, 00054。
[SWS_Eep_00075] ⌈如比较作业处理期间检测到比较数据区域不相等,EEPROM 驱动应中止作业,EEPROM 状态设为 MEMIF_IDLE,作业结果设为 MEMIF_BLOCK_INCONSISTENT。如已配置,调用 `Eep_JobErrorNotification` 回调函数。⌋
### 7.10 版本检查
详见 SWS_BSWGeneral 第 5.1.8 章。
---
## 8 API 规范
### 8.1 导入的类型
[SWS_Eep_00138] ⌈
| 模块 | 头文件 | 导入类型 |
|------|--------|----------|
| 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 |
⌋ (SRS_BSW_00335, SRS_BSW_00357, SRS_BSW_00377)
### 8.2 类型定义
#### 8.2.1 Eep_ConfigType
| 项 | 内容 |
|-----|------|
| Name | Eep_ConfigType |
| Type | Structure |
| Range | Implementation Specific — 初始化数据结构内容为 EEPROM 特定 |
| Description | 包含 EEPROM 驱动初始化数据的外部数据结构类型。 |
| Available via | Eep.h |
#### 8.2.2 Eep_AddressType
| 项 | 内容 |
|-----|------|
| Name | Eep_AddressType |
| Type | uint(8/16/32 位,取决于目标平台和 EEPROM 设备) |
| Description | 用作从已配置 EEPROM 基地址访问特定 EEPROM 内存区域的地址偏移。 |
#### 8.2.3 Eep_LengthType
| 项 | 内容 |
|-----|------|
| Name | Eep_LengthType |
| Type | 与 Eep_AddressType 相同 |
| Description | 指定要读/写/擦/比较的字节数。 |
### 8.3 函数定义
#### 8.3.1 Eep_Init
```c
void Eep_Init(const Eep_ConfigType* ConfigPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x00 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Description | EEPROM 初始化服务。 |
[SWS_Eep_00004] ⌈`Eep_Init` 函数应使用 `ConfigPtr` 引用结构的值初始化所有 EEPROM 相关寄存器。⌋
[SWS_Eep_00006] ⌈模块初始化完成后,`Eep_Init` 应将 EEPROM 状态设置为 MEMIF_IDLE,作业结果设置为 MEMIF_JOB_OK。⌋
[SWS_Eep_00044] ⌈`Eep_Init` 应将 EEPROM 模式设置为已配置的默认模式。⌋
#### 8.3.2 Eep_SetMode
```c
void Eep_SetMode(MemIf_ModeType Mode)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x01 |
| Parameters | Mode: MEMIF_MODE_SLOW(慢读访问/普通 SPI 访问) 或 MEMIF_MODE_FAST(快读访问/SPI 突发访问) |
[SWS_Eep_00042] ⌈`Eep_SetMode` 应将 EEPROM 操作模式设为给定 mode 参数。⌋
#### 8.3.3 Eep_Read
```c
Std_ReturnType Eep_Read(
Eep_AddressType EepromAddress,
uint8* DataBufferPtr,
Eep_LengthType Length
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x02 |
| Sync/Async | Asynchronous |
| Return | E_OK: 读命令已接受;E_NOT_OK: 未接受 |
[SWS_Eep_00009] ⌈复制参数,启动读作业,EEPROM 状态设为 MEMIF_BUSY,作业结果设为 MEMIF_JOB_PENDING 后返回。⌋
[SWS_Eep_00013] ⌈Eep 模块应在作业处理函数内异步执行读作业,读取 `EepromAddress + EEPROM 基地址``Length` 字节数据块到 `*DataBufferPtr`。⌋
#### 8.3.4 Eep_Write
```c
Std_ReturnType Eep_Write(
Eep_AddressType EepromAddress,
const uint8* DataBufferPtr,
Eep_LengthType Length
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x03 |
| Sync/Async | Asynchronous |
[SWS_Eep_00014] ⌈启动写作业并返回。⌋
[SWS_Eep_00015] ⌈异步写入 `Length` 字节从 `*DataBufferPtr``EepromAddress + EEPROM 基地址`。⌋
#### 8.3.5 Eep_Erase
```c
Std_ReturnType Eep_Erase(
Eep_AddressType EepromAddress,
Eep_LengthType Length
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x04 |
| Sync/Async | Asynchronous |
| Description | 擦除 EEPROM 段的服务。 |
[SWS_Eep_00019] / [SWS_Eep_00020] ⌈启动并异步执行擦除作业。⌋
#### 8.3.6 Eep_Compare
```c
Std_ReturnType Eep_Compare(
Eep_AddressType EepromAddress,
const uint8* DataBufferPtr,
Eep_LengthType Length
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x05 |
| Sync/Async | Asynchronous |
| Description | 比较 EEPROM 中数据块与内存中 EEPROM 块。 |
#### 8.3.7 Eep_Cancel
```c
void Eep_Cancel(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x06 |
| Sync/Async | Synchronous |
| Description | 取消正在运行的作业。 |
[SWS_Eep_00215] ⌈应取消正在进行的 EEPROM 读、写、擦或比较作业。⌋
[SWS_Eep_00021] ⌈同步中止正在运行的作业,函数返回后上层可立即请求新作业。⌋
[SWS_Eep_00027] ⌈应将 EEP 模块状态设为 MEMIF_IDLE。⌋
[SWS_Eep_00028] ⌈如果作业结果当前为 MEMIF_JOB_PENDING,应设为 MEMIF_JOB_CANCELED;否则保持作业结果不变。⌋
#### 8.3.8 Eep_GetStatus
```c
MemIf_StatusType Eep_GetStatus(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x07 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Return | MemIf_StatusType |
[SWS_Eep_00029] ⌈同步返回 EEPROM 状态。⌋
#### 8.3.9 Eep_GetJobResult
```c
MemIf_JobResultType Eep_GetJobResult(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x08 |
| Reentrancy | Reentrant |
[SWS_Eep_00024] ⌈同步返回 Eep 模块上次已接受作业的结果。⌋
#### 8.3.10 Eep_GetVersionInfo
```c
void Eep_GetVersionInfo(Std_VersionInfoType* versioninfo)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0a |
| Reentrancy | Reentrant |
| Description | 获取本模块版本信息的服务。 |
[SWS_Eep_00239] ⌈如开发错误检测启用且以 NULL 指针调用,应引发开发错误 EEP_E_PARAM_POINTER。⌋
### 8.4 回调通知
EEPROM 驱动为内部微控制器外设规范化时,属于 AUTOSAR 软件架构的最低层,因此本模块规范未识别任何回调函数。对于 SPI 外部设备,属于 ECU 抽象层,应根据 SPI Handler/Driver 规范需求提供回调通知。
[SWS_Eep_00137] ⌈ 在 Eep 模块支持 SPI 外部设备的情况下,Eep 模块应根据 SPI Handler/Driver 规范需求提供附加回调通知。⌋
### 8.5 调度函数
#### 8.5.1 Eep_MainFunction
```c
void Eep_MainFunction(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x09 |
| Description | 执行 EEPROM 作业(读/写/擦/比较)处理的服务。 |
| Available via | SchM_Eep.h |
[SWS_Eep_00030] ⌈应执行 EEPROM 读、写、擦除和比较作业的处理。⌋
[SWS_Eep_00031] ⌈作业启动后,Eep 用户应周期性调用 `Eep_MainFunction` 直到作业完成。⌋
[SWS_Eep_00032] ⌈如无待处理作业,应直接返回。⌋
**硬件错误报告**(SWS_Eep_00204~00207):分别报告 EEP_E_ERASE/WRITE/READ/COMPARE_FAILED 给 DEM。
**超时监视**(SWS_Eep_00235~00238):监视读/写/擦/比较作业的截止时间,超时时引发 EEP_E_TIMEOUT 运行时错误。
### 8.6 期望接口
#### 8.6.1 强制接口
[SWS_Eep_00154] ⌈
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Dem_SetEventStatus | Dem.h | 报告监视状态信息到 Dem |
| Det_ReportRuntimeError | Det.h | 报告运行时错误 |
#### 8.6.2 可选接口
[SWS_Eep_00155] ⌈
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Det_ReportError | Det.h | 报告开发错误 |
#### 8.6.3 可配置接口
[SWS_Eep_00047] ⌈如回调函数在后构建时配置,初始化数据结构 `Eep_ConfigType` 应包含相应函数指针。⌋
##### 8.6.3.1 作业结束通知
[SWS_Eep_00045] ⌈作业成功完成(读/写/擦完成 OK 或比较完成且数据相等)时调用 `EepJobEndNotification` 定义的回调函数。⌋
```c
void Eep_JobEndNotification(void)
```
##### 8.6.3.2 作业错误通知
[SWS_Eep_00046] ⌈作业被取消或以负结果结束(读/写/擦中止或失败,比较中止或数据不相等)时调用 `EepJobErrorNotification` 定义的回调函数。⌋
```c
void Eep_JobErrorNotification(void)
```
---
## 9 时序图
### 9.1 初始化
EcuM → Eep:`Eep_Init(const Eep_ConfigType*)`
### 9.2 读/写/擦/比较
NvM → Ea → Eep:`Ea_Write``Eep_Write` → (周期 `Eep_MainFunction` 直至作业完成)→ `Ea_JobEndNotification``NvM_JobEndNotification`
- EEPROM 状态:MEMIF_BUSY → MEMIF_IDLE
- 作业结果:MEMIF_JOB_PENDING → MEMIF_JOB_OK
### 9.3 运行中作业的取消
NvM → Ea → Eep:`Ea_Cancel``Eep_Cancel`(同步)→ 状态变为 MEMIF_IDLE, 结果 MEMIF_JOB_CANCELED → 立即可启动新作业。
---
## 10 配置规范
### 10.1 如何阅读本章
详见 SWS_BSWGeneral 第 10.1 章。
### 10.2 容器与配置参数
#### 10.2.1 Eep
| 项 | 内容 |
|-----|------|
| SWS Item | ECUC_Eep_00205 |
| Module Name | Eep |
| Module Description | Eep(内部或外部 EEPROM 驱动)模块的配置。 |
| Post-Build Variant Support | true |
| Supported Config Variants | VARIANT-POST-BUILD, VARIANT-PRE-COMPILE |
**包含容器:**
| 容器名 | 多重性 | 描述 |
|--------|--------|------|
| EepGeneral | 1 | EEPROM 驱动通用配置参数容器 |
| EepInitConfiguration | 1 | EEPROM 驱动运行时配置参数容器(实现类型:Eep_ConfigType) |
| EepPublishedInformation | 1 | 附加发布参数(不在 CommonPublishedInformation 容器中覆盖) |
#### 10.2.2 EepGeneral
关键参数(摘要):
| 参数 | 描述 |
|------|------|
| EepDevErrorDetect | 开发错误检测开关 |
| EepVersionInfoApi | 版本信息 API 启用开关 |
| EepUseInterrupts | 中断或轮询作业处理选择 |
| EepDriverIndex | 驱动索引 |
| EepBaseAddress | EEPROM 基地址 |
| EepSize | EEPROM 大小(字节) |
#### 10.2.3 EepInitConfiguration
| 参数 | 描述 |
|------|------|
| EepDefaultMode | 默认模式 |
| EepFastReadBlockSize | 快速模式读取块大小 |
| EepNormalReadBlockSize | 普通模式读取块大小 |
| EepFastWriteBlockSize | 快速模式写入块大小 |
| EepNormalWriteBlockSize | 普通模式写入块大小 |
| EepJobCallCycle | 作业调用周期 |
| EepJobEndNotification | 作业结束通知回调 |
| EepJobErrorNotification | 作业错误通知回调 |
| EepEraseTime | 最大擦除时间 |
| EepWriteCycleReduction | 写周期减少开关 |
#### 10.2.4 EepDemEventParameterRefs
引用 DEM 事件参数,用于错误报告。
#### 10.2.5 EepExternalDriver
外部 EEPROM 设备配置:
- 期望硬件 Flash ID
- 最大读访问阻塞时间
#### 10.2.6 SPI 特定扩展
SPI 配置参数(用于外部 SPI EEPROM):
- SPI 通道
- 普通模式与突发模式 SPI 序列
### 10.3 已发布参数
EepPublishedInformation 包含:
- EEPROM 大小
- 已擦除 EEPROM 单元值
- EEPROM 单元大小
- 物理内存分段
### 10.4 配置示例 — 外部 SPI EEPROM 设备
详细配置示例见原文 PDF 第 10.4 章。
---
## 11 不适用需求
[SWS_Eep_00241] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 和 SRS_SPAL_* 需求,详见原文 PDF。
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SWS_EEPROMDriver v4.4.0(Document ID 021,63 页)。
- 保留所有需求 ID(SWS_Eep_xxxxx、SRS_*_xxxxx、ECUC_Eep_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(Eep、Fee、Ea、NvM、MemIf、SPI、DEM、DET、EcuM 等)和 API 函数名保持英文。
- 主要部分已完整翻译;配置参数详细描述请参考原文 PDF。
+605
View File
@@ -0,0 +1,605 @@
# Flash 驱动规范
> **文档标题**: Specification of Flash Driver
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 025
> **文档类型**: SWS (Software Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Specification of Flash Driver |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 025 |
| 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 | 添加对 MCALMulticoreDistribution 的支持 |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 移除 HIS 引用;将"default error"重命名为"development error";引入运行时错误;实例化模块的实例 ID 配置 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 更新追溯信息;澄清内部缓冲区对齐;细化错误处理,新增配置参数 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 调试支持标记为过时;错误分类重做;移除 DEM 引用;澄清 FlsUseInterrupts 配置参数描述 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 需求与特性和 BSW 需求关联 |
| 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 移除 Fls_Init 期间 NULL 指针检查需求;小幅格式更改 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 移除模块主函数的时序需求;Fls_GetStatus 在模块未初始化时返回 MEMIF_UNINIT |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 按新的 SWS_BSWGeneral 重做;生产错误改为扩展生产错误 |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 更正 HW 特定错误的引用;适配配置参数范围;模块短名变更 |
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | 新增 FlsDefaultMode 配置参数;新增带 SPI 引用的容器;新增 NULL 指针检查 |
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | 新增 AUTOSAR 标准错误引用;通知例程多重性更正 |
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 |
| 2008-02-01 | 3.0.2 | AUTOSAR Administration | 表格格式更正 |
| 2007-12-21 | 3.0.1 | AUTOSAR Administration | Fls_Compare 新增 NULL 指针检查 |
| 2007-01-24 | 2.1.15 | AUTOSAR Administration | 文件包含结构更新;类型使用更正 |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 文档结构适配 Release 2.0 SWS 模板;新功能:Read、Compare 和 SetMode 函数;可伸缩性:功能可配置(开/关);适配新 MemHwA 架构 |
| 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 介绍与功能概述
本规范描述 Flash 驱动(FLS)的功能和 API。本规范同时适用于内部和外部 Flash 驱动。
Flash 驱动提供对 Flash 存储器进行读、写、擦除和比较的服务。
服务行为是异步的(写、擦、读、比较)。
内部 Flash 驱动直接访问微控制器硬件,位于微控制器抽象层(MCAL)。外部 Flash 驱动使用处理程序(如 SPI Handler/Driver)或驱动访问外部 Flash 设备,位于 ECU 抽象层。
两种类型驱动的功能需求和功能范围相同。
---
## 2 缩略语
| 缩略语 | 描述 |
|--------|------|
| Flash sector | 一次可擦除的最小 Flash 内存量 |
| Flash page | 一次可写入的最小 Flash 内存量 |
| FLS | Flash 驱动模块缩写 |
| FEE | Flash EEPROM Emulation |
| Fls | 模块名 |
| MemIf | Memory Abstraction Interface |
| NvM | NVRAM Manager |
| EcuM | ECU State Manager |
| DEM | Diagnostic Event Manager |
| DET | Default Error Tracer |
---
## 3 相关文档
### 3.1 AUTOSAR 交付物
- Layered Software Architecture
- General Requirements on Basic Software Modules
- Specification of Memory Abstraction Interface
- Specification of SPI Handler/Driver
- Requirements on Flash Driver — AUTOSAR_SRS_FlashDriver.pdf
- Specification of Default Error Tracer
- Specification of MCU Driver
- List of Basic Software Modules
- General Specification of Basic Software Modules
### 3.2 相关规范
AUTOSAR 提供基础软件模块通用规范(SWS BSW General),也适用于 Flash 驱动。
---
## 4 约束与假设
### 4.1 限制
Flash 驱动不提供数据完整性机制(如校验和、冗余存储等)。
### 4.2 适用车型领域
无限制。
---
## 5 模块依赖
### 5.1 系统时钟
内部 Flash 可能依赖系统时钟、预分频器和 PLL。
### 5.2 通信或 I/O 驱动
外部 Flash 驱动依赖所使用板载通信处理程序(如 SPI Handler/Driver)的 API 和能力。
Flash 驱动是内存抽象架构的一部分,因此某些类型依赖 Memory Interface (MemIf) 模块。
---
## 6 需求追溯
(主要追溯,完整表见原文 PDF)
| 需求 | 满足者 |
|------|--------|
| SRS_BSW_00101 | SWS_Fls_00014 |
| SRS_BSW_00323 | SWS_Fls_00015, 00020, 00021, 00026, 00027 等多个参数检查需求 |
| SRS_BSW_00337 | SWS_Fls_00310, 00312-00319 |
| SRS_BSW_00406 | SWS_Fls_00065, 00066, 00268 等 |
| SRS_Fls_12107 (Flash 类型检查) | SWS_Fls_00144 |
| SRS_Fls_12132 (静态配置) | SWS_Fls_00048, 00208, 00209, 00216, 00217 |
| SRS_Fls_12134 (异步读) | SWS_Fls_00001, 00035, 00097, 00098 等 |
| SRS_Fls_12135 (异步写) | SWS_Fls_00001, 00026, 00027, 00035 等 |
| SRS_Fls_12136 (异步擦除) | SWS_Fls_00001, 00020, 00021, 00035 等 |
| SRS_Fls_12137 (同步取消) | SWS_Fls_00033, 00035, 00183, 00229 等 |
| SRS_Fls_12138 (同步状态) | SWS_Fls_00034, 00184, 00253 |
| SRS_Fls_12141 (数据验证) | SWS_Fls_00056, 00200 |
| SRS_Fls_12143 (单作业) | SWS_Fls_00002, 00003, 00023, 00030, 00033, 00036 等 |
| SRS_Fls_12144 (作业处理函数) | SWS_Fls_00037, 00038, 00039 等 |
| SRS_Fls_12158 (写前擦除检查) | SWS_Fls_00055 |
| SRS_Fls_12159 (地址参数检查) | SWS_Fls_00020, 00021, 00026, 00027 等 |
| SRS_Fls_12160 (擦后验证) | SWS_Fls_00022 |
| SRS_Fls_12193 (代码加载到 RAM) | SWS_Fls_00137, 00140, 00141, 00214 |
| SRS_Fls_12194 (从 RAM 执行) | SWS_Fls_00211, 00212, 00213, 00215 |
| SRS_Fls_13300 (从 RAM 卸载) | SWS_Fls_00143 |
| SRS_Fls_13301 (异步比较) | SWS_Fls_00001, 00150-00153, 00186 等 |
| SRS_Fls_13302 (同步选择/模式) | SWS_Fls_00155, 00156, 00187, 00258 |
完整追溯表见原文 PDF。
---
## 7 功能规范
### 7.1 通用设计规则
[SWS_Fls_00001] ⌈FLS 模块应为 Flash 存储器操作(读/擦/写)提供异步服务。⌋ (SRS_Fls_12134, SRS_Fls_12135, SRS_Fls_12136, SRS_Fls_13301)
[SWS_Fls_00002] ⌈FLS 模块不应缓存数据。FLS 模块应使用通过 API 传递指针引用的应用数据缓冲区。⌋
[SWS_Fls_00003] ⌈FLS 模块不应保证给定应用缓冲区的数据一致性。⌋
[SWS_Fls_00205] ⌈FLS 模块应静态(最晚在编译时)检查静态配置参数的正确性。⌋
[SWS_Fls_00208] ⌈FLS 模块应将所有可用 Flash 内存区域组合为一个线性地址空间(由 `FlsBaseAddress``FlsTotalSize` 参数表示)。⌋
[SWS_Fls_00209] ⌈FLS 模块应根据 Flash 内存区域的物理结构将读、写、擦除和比较函数的地址和长度参数作为"虚拟"地址映射到物理地址。⌋
[SWS_Fls_00389] ⌈FLS 模块应在内部处理数据缓冲区对齐,将传入指针视为按字节对齐。⌋
[SWS_Fls_00390] ⌈如果在 ECU 中使用 Flash 驱动的多个实例,每个实例必须有唯一的实例 ID。该实例 ID 应配置为参数 `FlsDriverIndex`。如果 ECU 中只使用一个实例,该实例的 `FlsDriverIndex` 应配置为 0。⌋
### 7.2 错误处理
#### 7.2.1 开发错误
[SWS_Fls_00004] ⌈
| 错误类型 | 相关错误代码 | 值[hex] |
|----------|--------------|---------|
| 用错误参数调用 API 服务 | FLS_E_PARAM_CONFIG | 0x01 |
| | FLS_E_PARAM_ADDRESS | 0x02 |
| | FLS_E_PARAM_LENGTH | 0x03 |
| | FLS_E_PARAM_DATA | 0x04 |
| 模块未初始化调用 API 服务 | FLS_E_UNINIT | 0x05 |
| 驱动繁忙时调用 API 服务 | FLS_E_BUSY | 0x06 |
| 用 NULL 指针调用 API 服务 | FLS_E_PARAM_POINTER | 0x0a |
#### 7.2.2 运行时错误
| 错误类型 | 相关错误代码 | 值[hex] |
|----------|--------------|---------|
| 擦除验证(空白检查)失败 | FLS_E_VERIFY_ERASE_FAILED | 0x07 |
| 写验证(比较)失败 | FLS_E_VERIFY_WRITE_FAILED | 0x08 |
| 超时 | FLS_E_TIMEOUT | 0x09 |
#### 7.2.3 瞬态故障
| 错误类型 | 相关错误代码 | 值[hex] |
|----------|--------------|---------|
| Flash 擦除失败(HW) | FLS_E_ERASE_FAILED | 0x01 |
| Flash 写失败(HW) | FLS_E_WRITE_FAILED | 0x02 |
| Flash 读失败(HW) | FLS_E_READ_FAILED | 0x03 |
| Flash 比较失败(HW) | FLS_E_COMPARE_FAILED | 0x04 |
| 期望硬件 ID 不匹配 | FLS_E_UNEXPECTED_FLASH_ID | 0x05 |
#### 7.2.4 扩展生产错误与生产错误
本模块未规定任何生产错误。
### 7.3 外部 Flash 驱动
[SWS_Fls_00144] ⌈外部 Flash 驱动初始化期间,FLS 模块应将外部 Flash 设备的硬件 ID 与相应已发布参数对比。如硬件 ID 不匹配,FLS 模块应将错误代码 `FLS_E_UNEXPECTED_FLASH_ID` 报告给 Default Error Tracer (DET),将 FLS 模块状态设为 `FLS_E_UNINIT`,且不应初始化自身。⌋
### 7.4 Flash 访问代码的加载、执行和移除
技术背景:Flash 技术或 Flash 内存分段可能要求访问 Flash 硬件的例程(内部擦除和写入例程)从 RAM 执行,因为在编程 Flash 时无法读取 Flash(用于代码执行所需的指令获取)。
[SWS_Fls_00137] ⌈FLS 模块的实现者应将 Flash 访问例程的代码放在单独的 C 模块 Fls_ac.c 中。⌋
[SWS_Fls_00215] ⌈FLS 模块的 Flash 访问例程应仅在必要时禁用中断并等待擦除/写命令完成。⌋
[SWS_Fls_00140] [SWS_Fls_00141] ⌈如果 FLS 模块配置为在作业启动时将 Flash 访问代码加载到 RAM,Flash 擦除/写入例程应将相应 Flash 访问代码加载到由配置集中函数指针指向的 RAM 位置。⌋
[SWS_Fls_00143] ⌈擦除或写入作业完成或取消后,如 Flash 驱动已将 Flash 访问代码加载到 RAM,FLS 模块的主处理例程应从 RAM 卸载(即覆盖)Flash 访问代码。⌋
[SWS_Fls_00214] ⌈FLS 模块仅在 Flash ROM 中无法执行访问代码时才应将访问代码加载到 RAM。⌋
---
## 8 API 规范
### 8.1 导入的类型
[SWS_Fls_00248] ⌈
| 模块 | 头文件 | 导入类型 |
|------|--------|----------|
| MemIf | MemIf.h | MemIf_JobResultType, MemIf_ModeType, MemIf_StatusType |
| Std_Types | StandardTypes.h | Std_ReturnType, Std_VersionInfoType |
### 8.2 类型定义
#### 8.2.1 Fls_ConfigType
| 项 | 内容 |
|-----|------|
| Name | Fls_ConfigType |
| Type | Structure |
| Range | Hardware dependend structure — 初始化数据结构内容为 Flash 内存硬件特定 |
| Description | 保存 Flash 驱动配置集的结构。指向此结构的指针提供给 Flash 驱动初始化例程。 |
| Available via | Fls.h |
#### 8.2.2 Fls_AddressType
| 项 | 内容 |
|-----|------|
| Name | Fls_AddressType |
| Type | uint(8/16/32 位,取决于目标平台和 Flash 设备) |
| Description | 用作从已配置 Flash 基地址访问特定 Flash 内存区域的地址偏移。 |
[SWS_Fls_00216] ⌈`Fls_AddressType` 的下限应为 0。⌋
[SWS_Fls_00217] ⌈如有必要,FLS 模块应添加设备特定基地址。⌋
#### 8.2.3 Fls_LengthType
| 项 | 内容 |
|-----|------|
| Name | Fls_LengthType |
| Type | 与 Fls_AddressType 相同 |
| Description | 指定要读/写/擦/比较的字节数。 |
### 8.3 函数定义
#### 8.3.1 Fls_Init
```c
void Fls_Init(const Fls_ConfigType* ConfigPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x00 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Description | 初始化 Flash 驱动。 |
[SWS_Fls_00014] ⌈`Fls_Init` 函数应使用给定配置集中的参数初始化 FLS 模块(软件)和所有 Flash 内存相关寄存器(硬件)。⌋
[SWS_Fls_00323] ⌈完成初始化后,应将 FLS 模块状态设为 MEMIF_IDLE。⌋
[SWS_Fls_00324] ⌈完成初始化后,应将 Flash 作业结果设为 MEMIF_JOB_OK。⌋
[SWS_Fls_00048] ⌈如硬件支持,应按配置集设置 Flash 内存擦除/写保护。⌋
#### 8.3.2 Fls_Erase
```c
Std_ReturnType Fls_Erase(
Fls_AddressType TargetAddress,
Fls_LengthType Length
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x01 |
| Sync/Async | Asynchronous |
| Description | 擦除 Flash 扇区。 |
| Return | E_OK: 擦除命令已接受;E_NOT_OK: 未接受 |
[SWS_Fls_00218] ⌈`Fls_Erase` 作业应擦除一个或多个完整 Flash 扇区。⌋
[SWS_Fls_00220] [SWS_Fls_00221] ⌈应在 FLS 模块主函数内异步执行,从 `FlsBaseAddress + TargetAddress` 起擦除大小为 `Length` 的 Flash 内存块。Length 将四舍五入到下一个完整扇区边界。⌋
参数检查:
- [SWS_Fls_00020] 擦除起始地址必须对齐到 Flash 扇区边界,在指定地址边界内,否则报 FLS_E_PARAM_ADDRESS
- [SWS_Fls_00021] 擦除长度必须大于 0,擦除结束地址对齐到 Flash 扇区边界,在上边界内,否则报 FLS_E_PARAM_LENGTH
#### 8.3.3 Fls_Write
```c
Std_ReturnType Fls_Write(
Fls_AddressType TargetAddress,
const uint8* SourceAddressPtr,
Fls_LengthType Length
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x02 |
| Sync/Async | Asynchronous |
| Description | 写入一个或多个完整 Flash 页。 |
[SWS_Fls_00223] ⌈`Fls_Write` 作业应向 Flash 设备写入一个或多个完整 Flash 页。⌋
[SWS_Fls_00226] ⌈从 `FlsBaseAddress + TargetAddress` 起,使用 `SourceAddressPtr` 提供的数据编程大小为 `Length` 的 Flash 内存块。⌋
参数检查:
- [SWS_Fls_00026] 写起始地址对齐到 Flash 页边界,否则报 FLS_E_PARAM_ADDRESS
- [SWS_Fls_00027] 写长度 > 0,结束地址对齐到 Flash 页边界,否则报 FLS_E_PARAM_LENGTH
- [SWS_Fls_00157] 检查 DataBuffer 指针非 NULL,否则报 FLS_E_PARAM_DATA
#### 8.3.4 Fls_Cancel
```c
void Fls_Cancel(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x03 |
| Sync/Async | Synchronous |
| Description | 取消正在进行的作业。 |
[SWS_Fls_00229] ⌈应取消正在进行的 Flash 读、写、擦除或比较作业。⌋
[SWS_Fls_00033] / [SWS_Fls_00335] ⌈同步中止作业,将模块状态设为 MEMIF_IDLE。⌋
[SWS_Fls_00336] ⌈如作业结果为 MEMIF_JOB_PENDING,设为 MEMIF_JOB_CANCELED。⌋
#### 8.3.5 Fls_GetStatus
```c
MemIf_StatusType Fls_GetStatus(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x04 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Description | 同步返回 Flash 状态。 |
#### 8.3.6 Fls_GetJobResult
```c
MemIf_JobResultType Fls_GetJobResult(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x05 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Description | 同步返回上次作业的结果。 |
#### 8.3.7 Fls_Read
```c
Std_ReturnType Fls_Read(
Fls_AddressType SourceAddress,
uint8* TargetAddressPtr,
Fls_LengthType Length
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x07 |
| Sync/Async | Asynchronous |
| Description | 从 Flash 内存读取一个或多个字节。 |
#### 8.3.8 Fls_Compare
```c
Std_ReturnType Fls_Compare(
Fls_AddressType SourceAddress,
const uint8* TargetAddressPtr,
Fls_LengthType Length
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x08 |
| Sync/Async | Asynchronous |
| Description | 将 Flash 中数据与给定数据缓冲区进行比较。 |
#### 8.3.9 Fls_SetMode
```c
void Fls_SetMode(MemIf_ModeType Mode)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x09 |
| Description | 设置 Flash 操作模式。 |
#### 8.3.10 Fls_GetVersionInfo
```c
void Fls_GetVersionInfo(Std_VersionInfoType* VersioninfoPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x10 |
| Reentrancy | Reentrant |
### 8.4 回调通知
无,FLS 是基础模块。
### 8.5 调度函数
#### 8.5.1 Fls_MainFunction
```c
void Fls_MainFunction(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x06 |
| Description | 执行 Flash 作业(读/写/擦/比较)的处理。 |
| Available via | SchM_Fls.h |
执行作业处理、超时监视、报告硬件错误(FLS_E_ERASE/WRITE/READ/COMPARE_FAILED)。
### 8.6 期望接口
#### 8.6.1 强制接口
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Det_ReportRuntimeError | Det.h | 报告运行时错误 |
#### 8.6.2 可选接口
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Det_ReportError | Det.h | 报告开发错误 |
| Dem_ReportErrorStatus | Dem.h | 报告 DEM 状态(如硬件错误) |
#### 8.6.3 可配置接口
##### 作业结束通知
```c
void Fls_JobEndNotification(void)
```
作业成功完成时调用。
##### 作业错误通知
```c
void Fls_JobErrorNotification(void)
```
作业被取消或以负结果结束时调用。
---
## 9 时序图
类似 EEPROM 驱动:
- 初始化:EcuM → Fls:`Fls_Init`
- 读/写/擦/比较:NvM → Fee → Fls → 周期 `Fls_MainFunction` → JobEndNotification 回调
- 取消运行中作业:`Fls_Cancel` 同步,状态变为 MEMIF_IDLE,作业结果 MEMIF_JOB_CANCELED
---
## 10 配置规范
### 10.1 容器与配置参数
#### 10.1.1 Fls
| 项 | 内容 |
|-----|------|
| SWS Item | ECUC_Fls_00200 |
| Module Name | Fls |
| Module Description | Flash 驱动配置 |
| Post-Build Variant Support | true |
| Supported Config Variants | VARIANT-POST-BUILD, VARIANT-PRE-COMPILE |
#### 10.1.2 FlsGeneral
| 参数 | 描述 |
|------|------|
| FlsDevErrorDetect | 开发错误检测开关 |
| FlsVersionInfoApi | 版本信息 API 启用开关 |
| FlsCancelApi | Cancel API 启用 |
| FlsCompareApi | Compare API 启用 |
| FlsGetJobResultApi | GetJobResult API 启用 |
| FlsGetStatusApi | GetStatus API 启用 |
| FlsSetModeApi | SetMode API 启用 |
| FlsUseInterrupts | 中断/轮询作业处理选择 |
| FlsEraseVerificationEnabled | 擦除验证启用 |
| FlsWriteVerificationEnabled | 写验证启用 |
| FlsTimeoutSupervisionEnabled | 超时监视启用 |
| FlsDriverIndex | 驱动实例 ID(多实例时唯一) |
#### 10.1.3 FlsConfigSet
| 参数 | 描述 |
|------|------|
| FlsBaseAddress | Flash 基地址 |
| FlsTotalSize | Flash 总大小 |
| FlsDefaultMode | 默认模式 |
| FlsMaxReadFastMode | 快速模式最大读块大小 |
| FlsMaxReadNormalMode | 普通模式最大读块大小 |
| FlsMaxWriteFastMode | 快速模式最大写块大小 |
| FlsMaxWriteNormalMode | 普通模式最大写块大小 |
| FlsCallCycle | 作业调用周期 |
| FlsAcLoadOnJobStart | 作业启动时加载访问代码到 RAM 开关 |
| FlsAcErase | 擦除访问代码函数指针 |
| FlsAcWrite | 写访问代码函数指针 |
| FlsJobEndNotification | 作业结束通知回调 |
| FlsJobErrorNotification | 作业错误通知回调 |
#### 10.1.4 FlsSectorList / FlsSector
每个 Flash 扇区配置:
- FlsNumberOfSectors
- FlsPageSize
- FlsSectorSize
- FlsSectorStartaddress
#### 10.1.5 FlsPublishedInformation
已发布参数:
- 已擦除 Flash 单元值
- Flash 单元大小
### 10.2 SPI 特定扩展(外部 Flash)
引用 SPI 配置参数。
---
## 11 不适用需求
[SWS_Fls_00366] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 和 SRS_SPAL_* 需求,详见原文 PDF。
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SWS_FlashDriver v4.4.0(Document ID 025,67 页)。
- 保留所有需求 ID(SWS_Fls_xxxxx、SRS_Fls_xxxxx、ECUC_Fls_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(Fls、Fee、Ea、NvM、MemIf、SPI、DEM、DET、EcuM 等)和 API 函数名保持英文。
- 完整配置参数详细描述请参考原文 PDF 第 10 章。
+563
View File
@@ -0,0 +1,563 @@
# 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 章。
+658
View File
@@ -0,0 +1,658 @@
# Flash 测试规范
> **文档标题**: Specification of Flash Test
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 261
> **文档类型**: SWS (Software Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Specification of Flash Test |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 261 |
| 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 | 移除 FlsTstBlockBgndConfigSet 和 FlsTstBlockFgndConfigSet;新增 FlsTstEcucPartitionRef 配置参数 |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 数值定义;小幅更正/澄清/编辑性修订 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 新增 ECUC_FlsTst_00172: FlsTstMainFunctionPeriod;移除 SWS_FlsTst_00081 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 调试支持标记为过时;扩展生产错误表带通过/失败标准;Default Error Tracer 重命名 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 多项 SWS_FlsTst 文本修改;ECUC_FlsTst_00086 新增 FlsTstConfigurationOfOptApiServices |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 编辑性修订 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 按新 SWS_BSWGeneral 文档重做;MemMap.h 重命名为 FlsTst_MemMap.h;移除生产错误;新增生产错误和扩展生产错误章节 |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | SWS_FlsTst_00026 文本变更;SWS_FlsTst_00052 参数范围修改 |
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | FlsTst_BlockIdFgndType 类型变为 uint8-32;参数范围限制为最大值 0xFFFFFFFF |
| 2010-02-02 | 3.1.4 | 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 基础软件模块 Flash Test Driver 的功能、API 和配置。
Flash Test 模块提供测试不变内存(invariable memory)的算法。不变内存可以是数据/程序 Flash、程序 SRAM、锁定缓存,可嵌入微控制器或通过内存映射连接。
主要特性:
- **后台测试**(Background Test):周期性调用,可中断,在多个调度任务上分散执行
- **前台测试**(Foreground Test):由用户调用,同步,不可中断
- 支持多种算法:ECC 检查、CRC 签名(8/16/32 位)、校验和、重复块比较
- 测试间隔标识符
---
## 2 缩略语
| 缩略语 | 描述 |
|--------|------|
| FlsTst | Flash Test 模块名 |
| ECU | Electric Control Unit |
| EOL | End Of Line |
| CRC | Cyclic Redundancy Check |
| MCAL | Microcontroller Abstraction Layer |
| MCU | Microcontroller Unit |
| DEM | Diagnostic Event Manager |
| DET | Default Error Tracer |
| ECC | Error Correction Code |
| Invariable memory | 不变内存(程序 Flash、程序 SRAM、锁定缓存、ROM) |
| Background test | 由调度程序周期调用、可中断 |
| Foreground test | 由用户调用,同步 |
| Test interval | 后台模式下完整 Flash 测试的间隔 |
| Signature | 内存块内容的唯一计算结果 |
| Memory scrubbing | 自动顺序数据读取触发检测/验证机制 |
---
## 3 相关文档
### 3.1 输入文档
- List of Basic Software Modules
- Layered Software Architecture
- General Requirements on Basic Software Modules
- Requirements on Flash Test — AUTOSAR_SRS_FlashTest.pdf
- Specification of Default Error Tracer
- Specification of Diagnostic Event Manager
- Specification of ECU State Manager
- General Specification of Basic Software Modules
### 3.2 相关规范
AUTOSAR 提供基础软件模块通用规范(SWS BSW General),也适用于 Flash Test。
---
## 4 约束与假设
### 4.1 限制
Flash Test 模块旨在集成于整体安全概念中,本身不会提供所需的诊断覆盖率。
### 4.2 适用车型领域
无限制。
---
## 5 模块依赖
### 5.1 文件结构
#### 5.1.1 代码文件结构
[SWS_FlsTst_00003] ⌈Flash Test 模块的内存映射应通过 FlsTst_MemMap.h 实现。⌋
---
## 6 需求追溯
(主要追溯关系,完整表见原文 PDF)
| 需求 | 描述 | 满足者 |
|------|------|--------|
| SRS_BSW_00337 | 开发错误分类 | SWS_FlsTst_00007 |
| SRS_BSW_00377 | 模块特定类型 | SWS_FlsTst_00048 |
| SRS_BSW_00385 | 错误通知列表 | SWS_FlsTst_00007 |
| SRS_BSW_00405 | 配置结构 | SWS_FlsTst_00018, 00019 |
| SRS_BSW_00406 | 模块初始化 | SWS_FlsTst_00011 |
| SRS_FlsTst_14200 (Flash 测试服务配置) | SWS_FlsTst_00018, 00019 |
| SRS_FlsTst_14202 (ECC) | SWS_FlsTst_00161 |
| SRS_FlsTst_14203 (校验和) | SWS_FlsTst_00161 |
| SRS_FlsTst_14204/14205/14206 (8/16/32 位 CRC) | SWS_FlsTst_00161 |
| SRS_FlsTst_14207 (重复块比较) | SWS_FlsTst_00161 |
| SRS_FlsTst_14208 (后台 Flash 可中断) | SWS_FlsTst_00139, 00140 |
| SRS_FlsTst_14209 (内存分散) | SWS_FlsTst_00139 |
| SRS_FlsTst_14211 (测试执行状态) | SWS_FlsTst_00043 |
| SRS_FlsTst_14212 (通知机制) | SWS_FlsTst_00040, 00042 |
| SRS_FlsTst_14213 (签名/校验和) | SWS_FlsTst_00046, 00079 |
| SRS_FlsTst_14215 (暂停) | SWS_FlsTst_00071 |
| SRS_FlsTst_14216 (恢复) | SWS_FlsTst_00067 |
| SRS_FlsTst_14217 (停止) | SWS_FlsTst_00115, 00116, 00117 |
| SRS_FlsTst_14219 (前台测试) | SWS_FlsTst_00137, 00143 |
| SRS_FlsTst_14223 (错误细节) | SWS_FlsTst_00132 |
| SRS_FlsTst_14224 (ECC 电路测试) | SWS_FlsTst_00164 |
| SRS_FlsTst_14225 (测试间隔标识符) | SWS_FlsTst_00153, 00154, 00155, 00156 |
| SRS_SPAL_12057 (初始化) | SWS_FlsTst_00017, 00020 |
| SRS_SPAL_12163 (反初始化) | SWS_FlsTst_00027, 00028 |
| SRS_SPAL_12448 (开发错误检测后行为) | SWS_FlsTst_00025, 00033, 00039 |
完整追溯表见原文 PDF。
---
## 7 功能规范
### 7.1 总体行为
[SWS_FlsTst_00137] ⌈Flash 测试模块提供后台和前台模式的测试执行服务。⌋
[SWS_FlsTst_00138] ⌈待测内存块应可分别为后台和前台模式配置。⌋
#### 后台模式
[SWS_FlsTst_00139] ⌈后台模式下,测试块应按配置结构中的顺序进行测试。当所有块测试完毕,完成一个测试间隔。后台测试中,部分测试通过 `FlsTst_MainFunction` 触发。⌋
[SWS_FlsTst_00140] ⌈部分测试长度由一个调度任务中被测试的单元数定义(`ECUC_FlsTst_00161`)。不中断的部分测试所需时间定义为"测试时间"。⌋
[SWS_FlsTst_00142] ⌈后台测试应可通过 `FlsTst_Abort()``FlsTst_Suspend()` API 服务中止或暂停。API 调用请求处理的最大延迟时间应可配置。⌋
[SWS_FlsTst_00156] ⌈每个 Flash 测试间隔应有一个标识符,在后台模式下每次新测试间隔启动时递增。⌋
#### 7.1.1 状态图
后台模式下 Flash 测试驱动状态:
```
FlsTst_Init()
[Reset] → FLSTST_UNINIT ─────────→ FLSTST_INIT
↑ │ autostart
│ ↓
FlsTst_DeInit() FLSTST_RUNNING
↑ ↑ ↓
│ FlsTst_Resume│ │ Test completed
│ │ │ FlsTst_Suspend()
│ │ │
↑ FLSTST_SUSPENDED↓
FLSTST_ABORTED ←─── FlsTst_Abort() ──┘
↑ ↑
└────FlsTst_Abort()────┘
```
[SWS_FlsTst_00143] ⌈前台测试定义为同步、不可中断的测试。前台测试执行可配置,可在模块初始化后随时调用。⌋
### 7.2 错误分类
[SWS_FlsTst_00007] ⌈
| 错误类型 | 错误类别 | 相关错误代码 | 值[hex] |
|----------|----------|--------------|---------|
| Flash 测试执行状态故障 | Development | FLSTST_E_STATE_FAILURE | 0x01 |
| API 参数超出规定范围 | Development | FLSTST_E_PARAM_INVALID | 0x02 |
| 模块未初始化即调用 API 服务 | Development | FLSTST_E_UNINIT | 0x03 |
| Flash 测试模块已初始化 | Development | FLSTST_E_ALREADY_INITIALIZED | 0x04 |
| 配置指针错误(PB:为 NULL;PC:不为 NULL) | Development | FLSTST_E_INIT_FAILED | 0x05 |
| NULL 指针 | Development | FLSTST_E_PARAM_POINTER | 0x06 |
### 7.3 生产错误
Flash Test 模块未规定生产错误。
### 7.4 扩展生产错误
[SWS_FlsTst_00168] ⌈
| 项 | 内容 |
|-----|------|
| Error Name | FLSTST_E_FLSTST_FAILURE |
| Short Description | 后台模式中的失败检测 |
| Long Description | 在测试间隔内后台模式检测到故障时发出此扩展生产错误。 |
| Detection Criteria | Fail: 后台模式测试间隔内至少一个块为 NOT OK;Pass: 所有块以 OK 结果测试 |
| Monitor Frequency | continuous |
### 7.5 运行时错误
Flash Test 模块未规定运行时错误。
### 7.6 瞬态故障
Flash Test 模块未规定瞬态故障。
### 7.7 错误检测
[SWS_FlsTst_00011] ⌈在调用任何其他 Flash Test 函数(除 `FlsTst_GetCurrentState`)之前必须先调用 `FlsTst_Init`。如不遵守此顺序,应向 Default Error Tracer 报告错误代码 `FLSTST_E_UNINIT`(如启用开发错误检测)。⌋
### 7.8 错误通知
参考 SWS_BSWGeneral 文档。
### 7.9 版本检查
参考 SWS_BSWGeneral 文档。
### 7.10 调试支持
无需求定义。
---
## 8 API 规范
### 8.1 导入的类型
[SWS_FlsTst_00016] ⌈
| 模块 | 头文件 | 导入类型 |
|------|--------|----------|
| Dem | Rte_Dem_Type.h | Dem_EventIdType, Dem_EventStatusType |
| Std_Types | StandardTypes.h | Std_ReturnType, Std_VersionInfoType |
### 8.2 类型定义
#### 8.2.1 FlsTst_ConfigType
| 项 | 内容 |
|-----|------|
| Name | FlsTst_ConfigType |
| Type | Structure |
| Range | 实现特定 |
| Description | 包含 Flash 测试初始化数据的外部数据结构类型。 |
强制配置参数:
- 前台模式测试内存块定义
- 后台模式测试内存块定义
- 后台模式测试序列指示
- 硬件特定配置
#### 8.2.2 FlsTst_StateType
| 项 | 内容 |
|-----|------|
| Name | FlsTst_StateType |
| Type | Enumeration |
| Range | FLSTST_UNINIT (0x00) — 未初始化或不可用;FLSTST_INIT (0x01) — 已初始化,准备启动;FLSTST_RUNNING (0x02) — 当前正在运行;FLSTST_ABORTED (0x03) — 已中止;FLSTST_SUSPENDED (0x04) — 等待恢复或等待启动前台模式测试 |
| Description | 由 `FlsTst_GetCurrentState()` API 服务返回的状态值。 |
#### 8.2.3 FlsTst_TestResultFgndType
| 项 | 内容 |
|-----|------|
| Range | FLSTST_NOT_TESTED (0x00); FLSTST_OK (0x01); FLSTST_NOT_OK (0x02) |
| Description | `FlsTst_GetResultFgnd()` API 服务的返回类型。 |
#### 8.2.4 FlsTst_TestResultBgndType
| 项 | 内容 |
|-----|------|
| Type | Structure |
| Elements | 当前 FlsTstTestIntervalId 值;FlsTst_TestResultType 结果 |
| Description | `FlsTst_GetTestResultBgnd()` 的返回类型。 |
#### 8.2.5 FlsTst_BlockIdFgndType
uint8/uint16/uint32 — 前台模式 Flash 块的 ID。
#### 8.2.6 FlsTst_ErrorDetailsType
| 项 | 内容 |
|-----|------|
| Type | Structure (实现特定) |
| Description | 实现特定的错误信息。 |
#### 8.2.7 FlsTst_TestSignatureFgndType
| 项 | 内容 |
|-----|------|
| Type | Structure (实现特定) |
| Description | 前台模式测试签名。 |
#### 8.2.8 FlsTst_TestSignatureBgndType
| 项 | 内容 |
|-----|------|
| Type | Structure |
| Elements | 当前 FlsTstTestIntervalId 值;签名值 |
| Description | 后台模式测试签名。 |
#### 8.2.9 FlsTst_TestResultType
| 项 | 内容 |
|-----|------|
| Range | FLSTST_RESULT_NOT_TESTED (0x00); FLSTST_RESULT_OK (0x01); FLSTST_RESULT_NOT_OK (0x02) |
### 8.3 函数定义
#### 8.3.1 FlsTst_Init
```c
void FlsTst_Init(const FlsTst_ConfigType* ConfigPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x00 |
| Sync/Async | Synchronous |
| Description | 初始化 Flash Test 模块。 |
#### 8.3.2 FlsTst_DeInit
```c
void FlsTst_DeInit(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x01 |
| Description | 反初始化 Flash Test 模块。 |
#### 8.3.3 FlsTst_StartFgnd
```c
Std_ReturnType FlsTst_StartFgnd(FlsTst_BlockIdFgndType BlockId)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x02 |
| Sync/Async | Synchronous |
| Description | 启动前台模式 Flash 测试。 |
#### 8.3.4 FlsTst_Abort
```c
Std_ReturnType FlsTst_Abort(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x03 |
| Description | 中止后台 Flash 测试。 |
#### 8.3.5 FlsTst_Suspend
```c
Std_ReturnType FlsTst_Suspend(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x04 |
| Description | 暂停后台 Flash 测试。 |
#### 8.3.6 FlsTst_Resume
```c
Std_ReturnType FlsTst_Resume(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x05 |
| Description | 恢复后台 Flash 测试。 |
#### 8.3.7 FlsTst_GetCurrentState
```c
FlsTst_StateType FlsTst_GetCurrentState(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x06 |
| Description | 返回当前 Flash 测试状态。 |
#### 8.3.8 FlsTst_GetTestResultBgnd
```c
Std_ReturnType FlsTst_GetTestResultBgnd(FlsTst_TestResultBgndType* TestResultBgndPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x07 |
| Description | 返回后台测试结果。 |
#### 8.3.9 FlsTst_GetTestResultFgnd
```c
FlsTst_TestResultFgndType FlsTst_GetTestResultFgnd(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x08 |
| Description | 返回前台测试结果。 |
#### 8.3.10 FlsTst_GetVersionInfo
```c
void FlsTst_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x09 |
#### 8.3.11 FlsTst_GetTestSignatureBgnd
```c
Std_ReturnType FlsTst_GetTestSignatureBgnd(FlsTst_TestSignatureBgndType* TestSignaturePtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0a |
| Description | 返回后台测试签名。 |
#### 8.3.12 FlsTst_GetTestSignatureFgnd
```c
Std_ReturnType FlsTst_GetTestSignatureFgnd(FlsTst_TestSignatureFgndType* TestSignaturePtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0b |
| Description | 返回前台测试签名。 |
#### 8.3.13 FlsTst_GetErrorDetails
```c
Std_ReturnType FlsTst_GetErrorDetails(FlsTst_ErrorDetailsType* ErrorDetailsPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0c |
| Description | 返回错误细节。 |
#### 8.3.14 FlsTst_TestEcc
```c
Std_ReturnType FlsTst_TestEcc(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0d |
| Description | 测试 ECC 电路。 |
### 8.4 回调通知
无。
### 8.5 调度函数
#### FlsTst_MainFunction
```c
void FlsTst_MainFunction(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0e |
| Description | 执行后台 Flash 测试的服务。 |
| Available via | SchM_FlsTst.h |
### 8.6 期望接口
#### 强制接口
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Dem_SetEventStatus | Dem.h | 报告监视状态信息到 Dem |
#### 可选接口
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Det_ReportError | Det.h | 报告开发错误 |
#### 可配置接口
##### FlsTst_TestCompleted 通知
测试完成时调用的可配置回调函数。
---
## 9 时序图
### 9.1 初始化
EcuM → FlsTst:`FlsTst_Init`
### 9.2 反初始化
EcuM → FlsTst:`FlsTst_DeInit`
### 9.3 后台测试
调度程序周期调用 `FlsTst_MainFunction`,执行部分测试。可选地:
- 在驱动内部计算测试结果
- 将测试签名提供给调用者
### 9.4 暂停和恢复后台测试
用户 → FlsTst:`FlsTst_Suspend``FlsTst_Resume`
### 9.5 前台任务中断后台任务
后台测试运行时,通过 `FlsTst_StartFgnd` 启动前台测试。
---
## 10 配置规范
### 10.1 容器与配置参数
#### 10.1.1 FlsTst
| 项 | 内容 |
|-----|------|
| SWS Item | ECUC_FlsTst_00150 |
| Module Name | FlsTst |
| Module Description | Flash Test 模块配置 |
| Post-Build Variant Support | true |
| Supported Config Variants | VARIANT-POST-BUILD, VARIANT-PRE-COMPILE |
#### 10.1.2 FlsTstGeneral
| 参数 | 描述 |
|------|------|
| FlsTstDevErrorDetect | 开发错误检测开关 |
| FlsTstVersionInfoApi | 版本信息 API 启用 |
| FlsTstNumberOfTestedCells | 一周期测试的单元数 |
| FlsTstNumberOfTestedCellsAtomic | 部分测试中可中断的最小单元数 |
| FlsTstTestIntervalIdEndValue | 测试间隔标识符结束值 |
| FlsTstMainFunctionPeriod | 主函数周期(秒) |
| FlsTstEcucPartitionRef | ECUC 分区引用 |
#### 10.1.3 FlsTstConfigurationOfOptApiServices
可选 API 服务配置:启用/禁用以下 API:
- FlsTst_StartFgnd
- FlsTst_GetTestResultBgnd
- FlsTst_GetTestResultFgnd
- FlsTst_GetTestSignatureBgnd
- FlsTst_GetTestSignatureFgnd
- FlsTst_GetErrorDetails
- FlsTst_TestEcc
#### 10.1.4 FlsTstDemEventParameterRefs
引用 DEM 事件参数:
- FLSTST_E_FLSTST_FAILURE
#### 10.1.5 FlsTstBlockBgnd
每个后台测试块:
| 参数 | 描述 |
|------|------|
| FlsTstBlockNumberBgnd | 后台块编号 |
| FlsTstBlockIndex | 块索引 |
| FlsTstBlockSize | 块大小 |
| FlsTstBlockType | 块类型(算法选择) |
| FlsTstBlockStartAddress | 块起始地址 |
#### 10.1.6 FlsTstBlockFgnd
每个前台测试块:
| 参数 | 描述 |
|------|------|
| FlsTstBlockNumberFgnd | 前台块编号 |
| FlsTstBlockIndex | 块索引 |
| FlsTstBlockSize | 块大小 |
| FlsTstBlockType | 块类型(算法选择) |
| FlsTstBlockStartAddress | 块起始地址 |
### 10.2 已发布信息
发布的参数包括版本信息等。
---
## 11 不适用需求
[SWS_FlsTst_00166] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 和 SRS_SPAL_* 需求,详见原文 PDF。
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SWS_FlashTest v4.4.0(Document ID 261,56 页)。
- 保留所有需求 ID(SWS_FlsTst_xxxxx、SRS_FlsTst_xxxxx、ECUC_FlsTst_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(FlsTst、Fls、ECC、CRC、DEM、DET 等)和 API 函数名保持英文。
- 详细配置参数和示例请参考原文 PDF 第 10 章。
@@ -0,0 +1,607 @@
# 内存抽象接口规范
> **文档标题**: Specification of Memory Abstraction Interface
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 285
> **文档类型**: SWS (Software Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Specification of Memory Abstraction Interface |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 285 |
| 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 | 更新追溯信息;编辑性修订 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 块结果 MEMIF_BLOCK_INCONSISTENT 扩展为找不到的块;错误分类重做;增加需求链接 |
| 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 重做;第 10 章表格中增加 Scope 属性;包含文件结构变更(清理);为类型定义增加需求 ID |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 模块简称变更;一致性检查重新表述 |
| 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 | 文件包含结构更新;各种 API 返回类型适配;配置参数范围调整 |
| 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 基础软件模块 "Memory Abstraction Interface" (MemIf) 的功能、API 和配置。本模块允许 NVRAM 管理器访问多个内存抽象模块(FEE 或 EA 模块)。
```
NVRAM Manager
Memory Hardware Abstraction
├── Memory Abstraction Interface (MemIf)
│ │
│ ▼
├── Flash EEPROM Emulation (FEE) ─── ▶ Flash Driver
└── EEPROM Abstraction (EA) ─── ▶ EEPROM Driver
Vendor Specific Library
```
*图 1:内存硬件抽象层模块概览*
Memory Abstraction Interface (MemIf) 应抽象出底层 FEE 或 EA 模块的数量,并为上层提供统一线性地址空间上的虚拟分段。
---
## 2 缩略语
| 缩写/缩略语 | 描述 |
|--------|------|
| EA | EEPROM Abstraction(EEPROM 抽象) |
| EEPROM | 电可擦可编程只读存储器 |
| FEE | Flash EEPROM Emulation(Flash EEPROM 仿真) |
| LSB | 最低有效位/字节(根据上下文)。此处指位。 |
| MemIf | Memory Abstraction Interface(内存抽象接口) |
| MSB | 最高有效位/字节(根据上下文)。此处指位。 |
| NvM | NVRAM Manager |
| NVRAM | 非易失 RAM |
| Fast Mode(快速模式) | 例如在启动/关机期间,底层驱动可切换到快速模式,以便在那些阶段进行快速读/写。<br>注:这是否可能取决于驱动的实现和底层设备的能力。是否这样做取决于 NVRAM 管理器的配置以及特定项目的需求。 |
| Slow Mode(慢速模式) | 在正常运行期间,底层驱动可在慢速模式下使用,以减少运行时间或底层设备/通信媒体的阻塞时间方面的资源使用。 |
| Vendor specific library(厂商特定库) | 厂商特定库分别是 FEE/FLS 和 EA/EEP 模块的 ICC-2 实现。它提供与相应 ICC-3 实现相同的上层接口(API)和功能。 |
---
## 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] General Requirements on SPAL — AUTOSAR_SRS_SPALGeneral.pdf
[5] Requirements on Memory Hardware Abstraction Layer — AUTOSAR_SRS_MemoryHWAbstractionLayer
[6] Specification of Default Error Tracer — AUTOSAR_SWS_DefaultErrorTracer.pdf
[7] General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral.pdf
### 3.2 相关标准与规范
[7] Specification of NVRAM Manager — AUTOSAR_SWS_NVRAMManager
[8] Specification of Flash EEPROM Emulation — AUTOSAR_SWS_FlashEEPROMEmulation.pdf
[9] Specification of EEPROM Abstraction — AUTOSAR_SWS_EEPROMAbstraction.pdf
### 3.3 相关规范
AUTOSAR 提供基础软件模块的通用规范(SWS BSW General),也适用于 Memory Abstraction Interface。
---
## 4 约束与假设
### 4.1 限制
无限制。
### 4.2 适用车型领域
无限制。
---
## 5 模块依赖
(无具体描述)
---
## 6 需求追溯
| 需求 | 描述 | 满足者 |
|------|------|--------|
| RS_BRF_01472 | AUTOSAR 应支持模式 | SWS_MemIf_00038 |
| RS_BRF_02272 | AUTOSAR 应提供应用软件行为的追踪 | SWS_MemIf_00042 |
| SRS_BSW_00323 | 所有 AUTOSAR BSW 模块应检查传入的 API 参数有效性 | SWS_MemIf_00022 |
| SRS_BSW_00327 | 错误值命名规范 | SWS_MemIf_00006 |
| SRS_BSW_00386 | 公约的产品错误代码 | SWS_MemIf_00023 |
| SRS_BSW_00392 | 模块特定类型定义 | SWS_MemIf_00037, 00064, 00065, 00066 |
| SRS_BSW_00407 | 版本信息 API | SWS_MemIf_00045 |
| SRS_MemHwAb_14010 | FEE 与 EA 模块应提供仅操作完整已配置逻辑块的写服务 | SWS_MemIf_00040 |
| SRS_MemHwAb_14019 | 内存抽象接口应提供对底层内存抽象模块 API 服务的统一访问 | SWS_MemIf_00017 |
| SRS_MemHwAb_14020 | 内存抽象接口应允许使用设备索引选择底层内存抽象模块 | SWS_MemIf_00011, 00018, 00035 |
| SRS_MemHwAb_14021 | 内存抽象接口应允许预编译时配置底层内存抽象模块的数量 | SWS_MemIf_00018, 00019, 00020, 00022 |
| SRS_MemHwAb_14022 | 内存抽象接口应保留底层内存抽象模块的功能 | SWS_MemIf_00010, 00017, 00038, 00039, 00040, 00041, 00042, 00043, 00044, 00046 |
| SRS_MemHwAb_14023 | 内存抽象接口应仅检查接口本身内使用的参数 | SWS_MemIf_00022 |
| SRS_MemHwAb_14028 | FEE 与 EA 模块应提供使逻辑块无效化的服务 | SWS_MemIf_00044 |
| SRS_MemHwAb_14029 | FEE 与 EA 模块应提供允许读取逻辑块全部或部分的读服务 | SWS_MemIf_00039 |
| SRS_MemHwAb_14031 | FEE 与 EA 模块应提供允许取消正在进行的异步操作的服务 | SWS_MemIf_00041 |
| SRS_MemHwAb_14032 | FEE 与 EA 模块应提供仅操作包含立即数据的完整逻辑块的擦除服务 | SWS_MemIf_00046 |
| SRS_SPAL_12078 | 驱动应以内存和运行时资源最有效的方式编码 | SWS_MemIf_00019, 00020 |
| SRS_SPAL_12448 | 所有驱动模块在检测到开发错误后应有特定行为 | SWS_MemIf_00023 |
更多 SRS_BSW_* 与 SRS_SPAL_* 需求由 SWS_MemIf_00999(不适用)满足,详见第 11 章。
---
## 7 功能规范
### 7.1 错误分类
#### 7.1.1 开发错误
[SWS_MemIf_00006] ⌈Memory Abstraction Interface 应根据其配置(开发/生产)能够检测以下错误和异常:
| 错误类型 | 相关性 | 相关错误代码 | 值[hex] |
|---------|--------|--------------|---------|
| 用错误设备索引参数调用 API 服务 | Development | MEMIF_E_PARAM_DEVICE | 0x01 |
| 用 NULL 指针参数调用 API 服务 | Development | MEMIF_E_PARAM_POINTER | 0x02 |
⌋ (SRS_BSW_00337, SRS_BSW_00386, SRS_BSW_00327)
#### 7.1.2 运行时错误
无此类错误。
#### 7.1.3 瞬态故障
无此类错误。
#### 7.1.4 生产错误
无此类错误。
#### 7.1.5 扩展生产错误
无此类错误。
---
## 8 API 规范
### 8.1 导入的类型
#### 8.1.1 标准类型
[SWS_MemIf_00037] ⌈
| 模块 | 头文件 | 导入类型 |
|------|--------|----------|
| Std_Types | StandardTypes.h | Std_ReturnType |
| Std_Types | StandardTypes.h | Std_VersionInfoType |
⌋ (SRS_BSW_00392)
### 8.2 类型定义
[SWS_MemIf_00010] ⌈本章规定的类型不应针对特定内存抽象模块或硬件平台被更改或扩展。⌋ (SRS_MemHwAb_14022)
[SWS_MemIf_00011] ⌈内存设备索引的数据类型应为 uint8。此设备索引使用的最低值应为 0。因此允许的索引范围应为 `0..MEMIF_NUMBER_OF_DEVICES-1`。⌋ (SRS_MemHwAb_14020)
#### 8.2.1 MemIf_StatusType
[SWS_MemIf_00064] ⌈
| 项 | 内容 |
|-----|------|
| Name | MemIf_StatusType |
| Type | Enumeration |
| Range | MEMIF_UNINIT — 底层抽象模块或设备驱动尚未初始化<br>MEMIF_IDLE — 底层抽象模块或设备驱动当前空闲<br>MEMIF_BUSY — 底层抽象模块或设备驱动当前忙<br>MEMIF_BUSY_INTERNAL — 底层抽象模块正忙于内部管理操作。底层设备驱动可以忙或空闲。 |
| Description | 表示底层抽象模块和设备驱动的当前状态。 |
| Available via | MemIf.h |
⌋ (SRS_BSW_00392)
#### 8.2.2 MemIf_JobResultType
[SWS_MemIf_00065] ⌈
| 项 | 内容 |
|-----|------|
| Name | MemIf_JobResultType |
| Type | Enumeration |
| Range | MEMIF_JOB_OK — 作业已成功完成<br>MEMIF_JOB_FAILED — 作业未成功完成<br>MEMIF_JOB_PENDING — 作业尚未完成<br>MEMIF_JOB_CANCELED — 作业已被取消<br>MEMIF_BLOCK_INCONSISTENT — 1. 请求的块不一致,可能包含损坏数据;2. 块未找到<br>MEMIF_BLOCK_INVALID — 请求的块已被标记为无效,无法执行请求的操作 |
| Description | 表示上次作业的结果。 |
| Available via | MemIf.h |
⌋ (SRS_BSW_00392)
#### 8.2.3 MemIf_ModeType
[SWS_MemIf_00066] ⌈
| 项 | 内容 |
|-----|------|
| Name | MemIf_ModeType |
| Type | Enumeration |
| Range | MEMIF_MODE_SLOW — 底层内存抽象模块和驱动工作于慢速模式<br>MEMIF_MODE_FAST — 底层内存抽象模块和驱动工作于快速模式 |
| Description | 表示底层抽象模块和设备驱动的操作模式。 |
| Available via | MemIf.h |
⌋ (SRS_BSW_00392)
### 8.3 函数定义
[SWS_MemIf_00017] ⌈本章规定的 API 应映射到底层内存抽象模块的 API。功能行为请分别参考那些模块的规范或底层内存驱动的规范。⌋ (SRS_MemHwAb_14019, SRS_MemHwAb_14022)
[SWS_MemIf_00018] ⌈参数 DeviceIndex 应用于选择内存抽象模块(从而选择内存设备)。如果仅配置了一个内存抽象模块,参数 DeviceIndex 应被忽略。⌋ (SRS_MemHwAb_14020, SRS_MemHwAb_14021)
[SWS_MemIf_00019] ⌈如果仅配置了一个内存抽象模块,Memory Abstraction Interface 应实现为一组宏,将 Memory Abstraction Interface API 映射到相应内存抽象模块的 API。⌋ (SRS_SPAL_12078, SRS_MemHwAb_14021)
**示例:**
```c
#define MemIf_Write(DeviceIndex, BlockNumber, DataPtr) \
Fee_Write(BlockNumber, DataPtr)
```
[SWS_MemIf_00020] ⌈如果配置了多个内存抽象模块,Memory Abstraction Interface 应使用高效机制将 API 调用映射到适当的内存抽象模块。⌋ (SRS_SPAL_12078, SRS_MemHwAb_14021)
**注**:一种解决方案是使用函数指针表,以参数 DeviceIndex 作为数组索引。
**示例:**
```c
#define MemIf_Write(DeviceIndex, BlockNumber, DataPtr) \
MemIf_WriteFctPtr[DeviceIndex](BlockNumber,DataPtr)
```
[SWS_MemIf_00022] ⌈如果配置了多个内存抽象模块且为此模块启用了开发错误检测,Memory Abstraction Interface API 的函数应在模块的服务内检查参数 DeviceIndex 是否为现有设备或广播标识符。⌋ (SRS_BSW_00323, SRS_MemHwAb_14021, SRS_MemHwAb_14023)
[SWS_MemIf_00023] ⌈Memory Abstraction Interface API 的函数应将归因于非法参数 DeviceIndex 的检测错误以错误码 `MEMIF_E_PARAM_DEVICE` 报告给 Default Error Tracer (DET),且不应执行被调用的服务。⌋ (SRS_BSW_00386, SRS_SPAL_12448)
[SWS_MemIf_00024] ⌈如果 Memory Abstraction Interface API 的被调用函数检测到归因于非法参数 DeviceIndex 的错误且具有返回值,应设置如下:
- `MemIf_GetStatus`: `MEMIF_UNINIT`
- `MemIf_GetJobResult`: `MEMIF_JOB_FAILED`
- 所有其他函数: `E_NOT_OK`⌋ (SRS_BSW_00369)
#### 8.3.1 MemIf_SetMode
[SWS_MemIf_00038] ⌈
| 项 | 内容 |
|-----|------|
| Service name | MemIf_SetMode |
| Syntax | `void MemIf_SetMode(MemIf_ModeType Mode)` |
| Service ID[hex] | 0x01 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | Mode |
| Return value | None |
| Description | 调用所有底层内存抽象模块的 "SetMode" 函数。 |
| Available via | MemIf.h |
⌋ (RS_BRF_01472, SRS_MemHwAb_14022)
**注**:上面函数中故意省略了设备索引,即 Memory Interface 应将所有底层模块切换到请求的模式。在这种情况下,不需要额外的"广播"参数,因为设备不应单独切换到不同的模式。
#### 8.3.2 MemIf_Read
[SWS_MemIf_00039] ⌈
| 项 | 内容 |
|-----|------|
| Service name | MemIf_Read |
| Syntax | `Std_ReturnType MemIf_Read(uint8 DeviceIndex, uint16 BlockNumber, uint16 BlockOffset, uint8* DataBufferPtr, uint16 Length)` |
| Service ID[hex] | 0x02 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | DeviceIndex, BlockNumber, BlockOffset, Length |
| Parameters (out) | DataBufferPtr |
| Return value | Std_ReturnType — 如果开发错误检测被启用且检测到开发错误(根据 SWS_MemIf_00022),则函数应返回 E_NOT_OK,否则应返回所调用底层模块函数的返回值。 |
| Description | 调用由参数 DeviceIndex 选择的底层内存抽象模块的 "Read" 函数。 |
| Available via | MemIf.h |
⌋ (SRS_MemHwAb_14029, SRS_MemHwAb_14022)
#### 8.3.3 MemIf_Write
[SWS_MemIf_00040] ⌈
| 项 | 内容 |
|-----|------|
| Service name | MemIf_Write |
| Syntax | `Std_ReturnType MemIf_Write(uint8 DeviceIndex, uint16 BlockNumber, const uint8* DataBufferPtr)` |
| Service ID[hex] | 0x03 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | DeviceIndex, BlockNumber, DataBufferPtr |
| Return value | Std_ReturnType — 如开发错误检测启用且检测到开发错误,返回 E_NOT_OK,否则返回底层模块函数的返回值。 |
| Description | 调用由参数 DeviceIndex 选择的底层内存抽象模块的 "Write" 函数。 |
| Available via | MemIf.h |
⌋ (SRS_MemHwAb_14010, SRS_MemHwAb_14022)
#### 8.3.4 MemIf_Cancel
[SWS_MemIf_00041] ⌈
| 项 | 内容 |
|-----|------|
| Service name | MemIf_Cancel |
| Syntax | `void MemIf_Cancel(uint8 DeviceIndex)` |
| Service ID[hex] | 0x04 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | DeviceIndex |
| Return value | None |
| Description | 调用由参数 DeviceIndex 选择的底层内存抽象模块的 "Cancel" 函数。 |
| Available via | MemIf.h |
⌋ (SRS_MemHwAb_14031, SRS_MemHwAb_14022)
#### 8.3.5 MemIf_GetStatus
[SWS_MemIf_00042] ⌈
| 项 | 内容 |
|-----|------|
| Service name | MemIf_GetStatus |
| Syntax | `MemIf_StatusType MemIf_GetStatus(uint8 DeviceIndex)` |
| Service ID[hex] | 0x05 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | DeviceIndex |
| Return value | MemIf_StatusType |
| Description | 调用由参数 DeviceIndex 选择的底层内存抽象模块的 "GetStatus" 函数。 |
| Available via | MemIf.h |
⌋ (RS_BRF_02272, SRS_MemHwAb_14022)
[SWS_MemIf_00035] ⌈如果以广播到所有配置设备的设备索引(`MEMIF_BROADCAST_ID`)调用 `MemIf_GetStatus`,Memory Abstraction Interface 模块应依次调用所有底层设备的 "GetStatus" 函数。它应返回以下值:
- `MEMIF_IDLE` — 如果所有底层设备都返回此状态
- `MEMIF_UNINIT` — 如果至少一个设备返回此状态,所有其他返回状态应被忽略
- `MEMIF_BUSY` — 如果至少一个已配置设备返回此状态且没有其他设备返回 MEMIF_UNINIT
- `MEMIF_BUSY_INTERNAL` — 如果至少一个已配置设备返回此状态且没有其他设备返回 MEMIF_BUSY 或 MEMIF_UNINIT
⌋ (SRS_MemHwAb_14020)
**注**:`MemIf_GetStatus` 调用中的特殊"广播"设备 ID 用于查询所有设备是否空闲以关闭 ECU。
#### 8.3.6 MemIf_GetJobResult
[SWS_MemIf_00043] ⌈
| 项 | 内容 |
|-----|------|
| Service name | MemIf_GetJobResult |
| Syntax | `MemIf_JobResultType MemIf_GetJobResult(uint8 DeviceIndex)` |
| Service ID[hex] | 0x06 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | DeviceIndex |
| Return value | MemIf_JobResultType — 如开发错误检测启用且检测到开发错误,返回 MEMIF_JOB_FAILED,否则返回底层模块函数的返回值。 |
| Description | 调用由参数 DeviceIndex 选择的底层内存抽象模块的 "GetJobResult" 函数。 |
| Available via | MemIf.h |
⌋ (SRS_MemHwAb_14022)
#### 8.3.7 MemIf_InvalidateBlock
[SWS_MemIf_00044] ⌈
| 项 | 内容 |
|-----|------|
| Service name | MemIf_InvalidateBlock |
| Syntax | `Std_ReturnType MemIf_InvalidateBlock(uint8 DeviceIndex, uint16 BlockNumber)` |
| Service ID[hex] | 0x07 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | DeviceIndex, BlockNumber |
| Return value | Std_ReturnType |
| Description | 调用由参数 DeviceIndex 选择的底层内存抽象模块的 "InvalidateBlock" 函数。 |
| Available via | MemIf.h |
⌋ (SRS_MemHwAb_14028, SRS_MemHwAb_14022)
#### 8.3.8 MemIf_GetVersionInfo
[SWS_MemIf_00045] ⌈
| 项 | 内容 |
|-----|------|
| Service name | MemIf_GetVersionInfo |
| Syntax | `void MemIf_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr)` |
| Service ID[hex] | 0x08 |
| Sync/Async | Synchronous |
| Reentrancy | Reentrant |
| Parameters (out) | VersionInfoPtr — 指向标准版本信息结构的指针。 |
| Description | 返回版本信息。 |
| Available via | MemIf.h |
⌋ (SRS_BSW_00407)
#### 8.3.9 MemIf_EraseImmediateBlock
[SWS_MemIf_00046] ⌈
| 项 | 内容 |
|-----|------|
| Service name | MemIf_EraseImmediateBlock |
| Syntax | `Std_ReturnType MemIf_EraseImmediateBlock(uint8 DeviceIndex, uint16 BlockNumber)` |
| Service ID[hex] | 0x09 |
| Sync/Async | Synchronous |
| Reentrancy | Non Reentrant |
| Parameters (in) | DeviceIndex, BlockNumber |
| Return value | Std_ReturnType |
| Description | 调用由参数 DeviceIndex 选择的底层内存抽象模块的 "EraseImmediateBlock" 函数。 |
| Available via | MemIf.h |
⌋ (SRS_MemHwAb_14032, SRS_MemHwAb_14022)
### 8.4 回调通知
无。NVRAM 管理器应为底层内存抽象模块提供回调例程。
### 8.5 调度函数
无,本模块无异步函数。
### 8.6 期望接口
#### 8.6.1 强制接口
本章定义实现模块核心功能所需的所有接口。
[SWS_MemIf_00047] ⌈
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Ea_Cancel | Ea.h | 取消正在进行的异步操作。 |
| Ea_EraseImmediateBlock | Ea.h | 擦除 BlockNumber 块。 |
| Ea_GetJobResult | Ea.h | 返回 JobResult 的服务。 |
| Ea_GetStatus | Ea.h | 返回状态的服务。 |
| Ea_InvalidateBlock | Ea.h | 使 BlockNumber 块无效。 |
| Ea_Read | Ea.h | 从 BlockNumber 块的 BlockOffset 偏移读取 Length 字节到缓冲区 DataBufferPtr。 |
| Ea_SetMode | Ea.h | 切换底层 EEPROM 驱动模式的函数。 |
| Ea_Write | Ea.h | 将 DataBufferPtr 内容写入 BlockNumber 块。 |
| Fee_Cancel | Fee.h | 调用底层 Flash 驱动的取消函数。 |
| Fee_EraseImmediateBlock | Fee.h | 擦除逻辑块的服务。 |
| Fee_GetJobResult | Fee.h | 查询上层软件发起的上次已接受作业的结果。 |
| Fee_GetStatus | Fee.h | 返回状态的服务。 |
| Fee_InvalidateBlock | Fee.h | 使逻辑块无效的服务。 |
| Fee_Read | Fee.h | 启动读作业的服务。 |
| Fee_SetMode | Fee.h | 切换底层 Flash 驱动模式的函数。 |
| Fee_Write | Fee.h | 启动写作业的服务。 |
⌋ (SRS_BSW_00384)
#### 8.6.2 可选接口
本章定义实现模块可选功能所需的所有接口。
[SWS_MemIf_00048] ⌈
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Det_ReportError | Det.h | 报告开发错误的服务。 |
⌋ (SRS_BSW_00385)
#### 8.6.3 可配置接口
本章列出可配置目标函数的所有接口。目标函数通常是回调函数。
本模块没有可配置接口。
---
## 9 时序图
参考各内存抽象模块的规范。
---
## 10 配置规范
### 10.1 容器与配置参数
以下章节汇总所有配置参数。参数的详细含义在第 7 章和第 8 章中描述。
#### 10.1.1 MemIf
| 项 | 内容 |
|-----|------|
| SWS Item | ECUC_MemIf_00025 |
| Module Name | MemIf |
| Module Description | MemIf (Memory Abstraction Interface) 模块的配置。 |
| Post-Build Variant Support | false |
| Supported Config Variants | VARIANT-PRE-COMPILE |
**包含容器:**
| 容器名 | 多重性 | 范围/依赖 |
|--------|--------|-----------|
| MemIfGeneral | 1 | Memory Abstraction Interface (MemIf) 模块的配置。 |
#### 10.1.2 MemIfGeneral
| 项 | 内容 |
|-----|------|
| SWS Item | ECUC_MemIf_00034 |
| Container Name | MemIfGeneral |
| Description | Memory Abstraction Interface (MemIf) 模块的配置。 |
**配置参数:**
##### MemIfDevErrorDetect
| 项 | 内容 |
|-----|------|
| SWS Item | ECUC_MemIf_00035 |
| Name | MemIfDevErrorDetect |
| Parent Container | MemIfGeneral |
| Description | 开启或关闭开发错误检测与通知。<br>true:启用检测与通知;<br>false:禁用检测与通知。 |
| Multiplicity | 1 |
| Type | EcucBooleanParamDef |
| Default value | false |
| Value Configuration Class | Pre-compile time(所有变体) |
##### MemIfNumberOfDevices
| 项 | 内容 |
|-----|------|
| SWS Item | ECUC_MemIf_00033 |
| Name | MemIfNumberOfDevices |
| Parent Container | MemIfGeneral |
| Description | 底层内存抽象模块的具体数量。<br>计算公式:计算已配置 EA 和 FEE 模块的数量。 |
| Multiplicity | 1 |
| Type | EcucIntegerParamDef |
| Range | 1..2 |
| Value Configuration Class | Pre-compile time(所有变体) |
##### MemIfVersionInfoApi
| 项 | 内容 |
|-----|------|
| SWS Item | ECUC_MemIf_00032 |
| Name | MemIfVersionInfoApi |
| Parent Container | MemIfGeneral |
| Description | 预处理器开关,启用/禁用读取模块版本信息的 API。<br>true:启用版本信息 API;<br>false:禁用版本信息 API。 |
| Multiplicity | 1 |
| Type | EcucBooleanParamDef |
| Default value | false |
---
## 11 不适用需求
[SWS_MemIf_00999] ⌈以下需求不适用于本规范。⌋
(SRS_BSW_00404, SRS_BSW_00405, SRS_BSW_00159, SRS_BSW_00170, SRS_BSW_00380, SRS_BSW_00412, SRS_BSW_00398, SRS_BSW_00399, SRS_BSW_00400, SRS_BSW_00375, SRS_BSW_00101, SRS_BSW_00416, SRS_BSW_00406, SRS_BSW_00168, SRS_BSW_00423~00429, 00432, 00433, 00336, 00339, 00422, 00417, 00161, 00162, 00005, 00415, 00164, 00325, 00342, 00343, 00160, 00007, 00300, 00413, 00347, 00307, 00373, 00314, 00348, 00353, 00361, 00302, 00328, 00312, 00006, 00304, 00378, 00306, 00308, 00309, 00371, 00358, 00414, 00359, 00360, 00330, 00009, 00401, 00172, 00010, 00333, 00321, 00341, 00334, SRS_SPAL_12263, 12056, 12267, 12057, 12125, 12163, 12461, 12462, 12463, 12068, 12069, 00157, 12063, 12075, 12129, 12064, 12067, 12077, 12092, 12265)
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SWS_MemoryAbstractionInterface v4.4.0(Document ID 285)。
- 保留所有需求 ID(SWS_MemIf_xxxxx、SRS_xxx_xxxxx、ECUC_MemIf_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(MemIf、Fee、Ea、NvM、Fls 等)和 API 函数名保持英文。
- 完整 SWS_MemIf_00999 不适用需求列表见原文 PDF。
+517
View File
@@ -0,0 +1,517 @@
# 内存映射规范
> **文档标题**: Specification of Memory Mapping
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 128
> **文档类型**: SWS (Software Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Specification of Memory Mapping |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 128 |
| 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 | 支持指针变量的专用分配;移除过时规范内容;修订示例 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 支持核心范围特定内存分配;清理需求追溯 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 支持安全系统的 BSW 分区;移除 Recommendation A 中过时内存段;澄清 SIZE 与 ALIGNMENT 的处理 |
| 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 澄清 `<X>` 在恢复区和保存数据区的使用 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 澄清默认 section 用法 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 内存分配关键字的一致命名模式;预定义 MemorySection 与 SwAddrMethod 的 M1 值;新增编译器抽象配置;支持 BSW 模块特定 MemMap 头文件 |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 引入内存分配关键字的一致命名模式 |
| 2009-12-18 | 4.0.1 | AUTOSAR Administration | 为 MemMap 定义 ECU 配置参数;定义 MemMap 头文件的生成;新增初始化策略 CLEARED 标准化内存分配关键字 |
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | 内存映射章节扩展用于应用 SWC;通用已发布信息更新 |
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 |
| 2006-11-28 | 2.1 | AUTOSAR Administration | MEMMAP004 列出内存段名的所有大小后缀;新增 BOOLEAN 关键字 |
| 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 介绍与功能概述
本文档规定通过内存映射文件将代码和数据映射到特定内存段的机制。对于许多 ECU 和微控制器平台,按模块将代码、变量和常量映射到特定内存段至关重要。
**重要用例**:
### 避免 RAM 浪费
如果在 32 位平台上多个模块使用不同大小变量(8、16、32 位),链接器在 RAM 中分配变量时会留下间隙。通过将变量按大小映射到特定内存段,可最小化 RAM 中未使用空间。
### 使用特定 RAM 属性
某些变量(如 NVRAM 管理器的 RAM 镜像)不应在上电复位后初始化。应可将它们映射到复位后不初始化的 RAM 段。
某些变量(如通过位掩码访问的)若位于允许编译器位操作指令的 RAM 段(如"近页"或"零页")中可提升性能和减小代码大小。
### 使用特定 ROM 属性
在带外部 Flash 内存的大型 ECU 中,需将频繁调用函数的模块映射到允许快速访问的内部 Flash 内存,实现更高性能。
### 同一模块源代码用于 boot loader 和应用
如果模块同时用于 boot loader 和应用,需要允许将代码和数据映射到不同内存段。
### 支持内存保护
硬件内存保护使用要求将模块变量分离到不同内存区域。内部变量映射到受保护内存,数据交换缓冲区映射到非保护内存。
### 支持分区
如果 BSW 模块应支持跨多个分区拆分,需将模块变量额外分离到不同的内存(分区)区域。
---
## 2 缩略语
| 缩略语 | 描述 |
|--------|------|
| BSW | Basic Software |
| ISR | Interrupt Service Routine |
| NVRAM | Non-Volatile RAM |
---
## 3 相关文档
### 3.1 输入文档
[1] Glossary — AUTOSAR_TR_Glossary
[2] General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral
[3] General Requirements on Basic Software Modules — AUTOSAR_SRS_BSWGeneral
[4] Software Component Template — AUTOSAR_TPS_SoftwareComponentTemplate
[5] Basic Software Module Description Template — AUTOSAR_TPS_BSWModuleDescriptionTemplate
[6] Methodology — AUTOSAR_TR_Methodology
[7] Specification of RTE Software — AUTOSAR_SWS_RTE
### 3.2 相关标准与规范
不适用。
### 3.3 相关规范
AUTOSAR 提供基础软件模块通用规范(SWS BSW General),也适用于 SWS Memory Mapping。
---
## 4 约束与假设
### 4.1 限制
考虑了第 3.1 章列出的编译器。如果其他编译器需要不能映射到此规范所描述机制的关键字,该编译器将不被 AUTOSAR 支持。
不支持结构的专用 pack 控制。代码、变量和常量的专用对齐控制不支持,需通过编译器/链接器参数全局设置。
### 4.2 适用车型领域
无限制。
---
## 5 模块依赖
[SWS_MemMap_00020] ⌈SWS Memory Mapping 适用于每个 AUTOSAR 基础软件模块和软件组件。⌋
### 5.1 文件结构
#### 5.1.1 代码文件结构
不适用。
#### 5.1.2 头文件结构
[SWS_MemMap_00028] ⌈如果任何 BSW 模块描述以 DependencyOnArtifact 作为 requiredArtifact 描述了 MEMMAP 类别,Memory Mapping 应提供 BSW 内存映射头文件。文件名由 BSW 模块描述中的 `artifactDescriptor.shortLabel` 属性值定义。⌋
[SWS_MemMap_00032] ⌈对于每个非 MEMMAP 类别的 BSW 模块描述,Memory Mapping 应提供 BSW 模块特定的内存映射头文件 `{Mip}_MemMap.h`,其中 `{Mip}``<Msn>[_<vi>_<ai>]` 组成:
- `<Msn>`:BswModuleDescription 的 shortName(大小写敏感)
- `<vi>`:BSW 模块的 vendorId
- `<ai>`:BSW 模块的 vendorApiInfix
[SWS_MemMap_00029] ⌈对于每个软件组件类型,应提供软件组件类型特定的内存映射头文件 `{componentTypeName}_MemMap.h`。⌋
---
## 6 需求追溯
本文档主要满足 SRS_BSW_00351(封装编译器特定方法以映射对象)需求。其他多个 SRS_BSW_* 通用需求由 SWS_MemMap_00999 标记为不适用。
详细需求追溯表见原文 PDF 第 6 章。
---
## 7 功能规范
### 7.1 总体问题
内存映射文件将编译器和链接器特定的内存分配关键字包含在头文件和源文件中。这些关键字控制变量和函数到特定段的分配,从而使实现与编译器和微控制器特定属性无关。段到专用内存区域/地址范围的分配不在内存映射文件范围,通常通过链接器控制文件完成。
[SWS_MemMap_00001] ⌈对于每个构建场景(如 Boot loader、ECU 应用),应提供自己的一组内存映射文件。⌋
[SWS_MemMap_00002] ⌈内存映射文件名应为 BSW 模块的 `{Mip}_MemMap.h` 和软件组件的 `{componentTypeName}_MemMap.h`。⌋
[SWS_MemMap_00010] ⌈如编译器/链接器不需要特定命令实现 SWS Memory Mapping 功能,内存分配关键字定义可为未定义而无影响。⌋
[SWS_MemMap_00036] ⌈如编译器/链接器不支持 BSW 模块或软件组件使用的 MemorySection 种类的强制功能,内存分配关键字应定义为引发错误。⌋
**示例 7.1**:
```c
#ifdef EEP_START_SEC_VAR_CLEARED_16
#undef EEP_START_SEC_VAR_CLEARED_16
#endif
```
### 7.2 变量和代码的映射
#### 7.2.1 使用内存映射头文件的实现需求
[SWS_MemMap_00038] ⌈每个 AUTOSAR 基础软件模块和软件组件应支持以下内存类型的配置:
- VAR
- VAR_FAST
- VAR_SLOW
- INTERNAL_VAR
- VAR_SAVED_ZONE
- CONST_SAVED_RECOVERY_ZONE
- CONST
- CALIB
- CONFIG_DATA
- CODE
- CALLOUT_CODE
- CODE_FAST
- CODE_SLOW
##### {ALIGNMENT} 后缀
- **BOOLEAN**:1 位变量和常量
- **8**:8 位对齐
- **16**:16 位对齐
- **32**:32 位对齐
- **PTR**:指针变量和常量
- **UNSPECIFIED**:大小不符合上述标准
##### {INIT_POLICY} 后缀
- **NO_INIT**:从不清零、从不初始化
- **CLEARED**:每次复位后清零
- **POWER_ON_CLEARED**:仅上电复位后清零
- **INIT**:每次复位后初始化值
- **POWER_ON_INIT**:仅上电复位后初始化
#### 7.2.1.1 模块在可分配内存部分拆分
[SWS_MemMap_00040] ⌈当 BSW 模块或软件组件拆分为可分配内存部分时,`<PREFIX>` 应按以下方式子结构化:
`<PREFIX> = <snp>[_<vi>_<ai>]_<feature>`
#### 7.2.1.2 config 常量与非 config 常量
两种常量:
1. **Config 常量**:实现可配置行为(在 `<Mip>_Lcfg.c``<Mip>_PBcfg.c` 中)
- 语法:`{PREFIX}_START_SEC_CONFIG_DATA_{configClass}[_{safety}]_{ALIGNMENT}`
- `{configClass}` 可为 PREBUILD 或 POSTBUILD
2. **非 Config 常量**:实现固定值(在 `<Mip>.[ch]` 或扩展中)
- 语法:`{PREFIX}_START_SEC_CONST[_{accessPeriod}][_{safety}][_{coreScope}]`
#### 7.2.1.3 数据段
##### 表 7.1: Section Type VAR
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_VAR_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` / `{PREFIX}_STOP_SEC_VAR_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` |
| Description | 用于所有全局或静态变量。 |
| Section Type | VAR |
| Init Policy | {INIT_POLICY} |
##### 表 7.2: Section Type VAR_FAST
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_VAR_FAST_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` |
| Description | 用于具有以下属性的全局或静态变量:按位访问、频繁使用、源代码中高访问次数。 |
##### 表 7.3: Section Type VAR_SLOW
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_VAR_SLOW_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` |
| Description | 用于所有不频繁访问的全局或静态变量。 |
##### 表 7.4: Section Type INTERNAL_VAR
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_INTERNAL_VAR_{INIT_POLICY}[_{safety}][_{coreScope}]_{ALIGNMENT}` |
| Description | 用于可从校准工具访问的全局或静态变量。 |
##### 表 7.5: Section Type VAR_SAVED_ZONE
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_VAR_SAVED_ZONE{anyNamePart}[_{safety}]_{ALIGNMENT}` |
| Description | 用于保存在非易失内存中的变量的 RAM 缓冲区。 |
| Init Policy | NO_INIT |
##### 表 7.6: Section Type CONST_SAVED_RECOVERY_ZONE
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_CONST_SAVED_RECOVERY_ZONE{anyNamePart}[_{safety}]_{ALIGNMENT}` |
| Description | 用于保存在非易失内存中的变量的 ROM 缓冲区。 |
##### 表 7.7: Section Type CONST
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_CONST[_{accessPeriod}][_{safety}]_{ALIGNMENT}` |
| Description | 用于全局或静态常量。`{accessPeriod}` 单位:US、MS、S(例如 100US、400US、1MS、5MS、10MS、20MS、100MS、1S)。 |
##### 表 7.8: Section Type CALIB
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_CALIB[_{safety}]_{ALIGNMENT}` |
| Description | 用于校准常量。 |
| Section Type | CALPRM |
##### 表 7.9: Section Type CONFIG_DATA
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_CONFIG_DATA_{configClass}[_{safety}]_{ALIGNMENT}` |
| Description | 模块配置段中的常量。`{configClass}` 为 PREBUILD 或 POSTBUILD。 |
| Section Type | CONFIG-DATA |
#### 7.2.1.4 代码段
##### 表 7.10: Section Type CODE
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_CODE[_{codePeriod}][_{safety}][_{coreScope}]` / `{PREFIX}_STOP_SEC_CODE[_{codePeriod}][_{safety}][_{coreScope}]` |
| Description | 用于将代码映射到应用块、引导块、外部 Flash 等。 |
| Section Type | CODE |
##### 表 7.11: Section Type CALLOUT_CODE
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_CALLOUT_CODE[_{safety}][_{coreScope}]` |
| Description | 用于映射 BSW 模块 callout,通常使用全局链接器设置。 |
##### 表 7.12: Section Type CODE_FAST
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_CODE_FAST[_{safety}][_{coreScope}]` |
| Description | 用于应放入快速代码内存段的代码。 |
##### 表 7.13: Section Type CODE_SLOW
| 项 | 内容 |
|-----|------|
| Syntax | `{PREFIX}_START_SEC_CODE_SLOW[_{safety}][_{coreScope}]` |
| Description | 用于不频繁访问的代码。 |
#### 7.2.2 内存映射头文件需求
内存映射头文件必须包含 `#define` 指令以将段开始/停止与编译器特定 pragma 关联。
[SWS_MemMap_00037] ⌈`<NAME>` 部分可包含以下 ASIL 关键字以指示限制/资格:`{safety}` = QM, ASIL_A, ASIL_B, ASIL_C, ASIL_D。`{safety}` 标签是可选的,默认应视为 QM。⌋
[SWS_MemMap_00039] ⌈`<NAME>` 部分可包含以下核心范围关键字以指示限制:`{coreScope}` = GLOBAL(任何核心都可访问)、LOCAL(由集成者映射到特定核心)。默认为 GLOBAL。⌋
### 7.3 示例
#### 7.3.1 代码段示例
```c
#define EEP_START_SEC_CODE
#include "EEP_MemMap.h"
void Eep_Init(const Eep_ConfigType* ConfigPtr) { /* ... */ }
#define EEP_STOP_SEC_CODE
#include "EEP_MemMap.h"
```
#### 7.3.2 快速变量段示例
```c
#define EEP_START_SEC_VAR_FAST_CLEARED_16
#include "EEP_MemMap.h"
static uint16 Eep_Status;
#define EEP_STOP_SEC_VAR_FAST_CLEARED_16
#include "EEP_MemMap.h"
```
#### 7.3.3 ICC2 集群中的代码段
支持多个 BSW 模块共享同一头文件。
#### 7.3.4 Callout 段
```c
#define CAN_START_SEC_CALLOUT_CODE
#include "Can_MemMap.h"
```
#### 7.3.5 可分配内存部分
```c
#define EEP_FEATURE_START_SEC_CODE
#include "EEP_MemMap.h"
void Eep_Feature_Init(void) { /* ... */ }
#define EEP_FEATURE_STOP_SEC_CODE
#include "EEP_MemMap.h"
```
---
## 8 API 规范
本规范不定义 API。
---
## 9 时序图
不适用。
---
## 10 配置规范
### 10.1 如何阅读本章
详见 SWS_BSWGeneral 文档。
### 10.2 容器与配置参数
#### 10.2.1 MemMap
| 项 | 内容 |
|-----|------|
| SWS Item | ECUC_MemMap_00001 |
| Module Name | MemMap |
| Module Description | MemMap 模块配置 |
#### 10.2.2 MemMapAddressingModeSet
定义寻址模式集合。
#### 10.2.3 MemMapAddressingMode
指定特定的寻址模式。
#### 10.2.4 MemMapAllocation
定义内存分配规则。
#### 10.2.5 MemMapGenericMapping
通用映射规则。
#### 10.2.6 MemMapSectionSpecificMapping
段特定映射规则。
#### 10.2.7 MemMapMappingSelector
映射选择器。
#### 10.2.8 MemMapGenericCompilerMemClass
通用编译器内存类。
### 10.3 已发布信息
发布编译器和内存映射的版本信息。
---
## 11 分析
### 11.1 变量内存分配
变量根据大小和访问频率分配到不同内存段:
- 通用变量 → VAR_*
- 频繁访问/位访问 → VAR_FAST_*
- 不频繁访问 → VAR_SLOW_*
- 校准可访问 → INTERNAL_VAR_*
### 11.2 常量变量内存分配
常量分配到 ROM 内存段:
- 通用常量 → CONST_*
- 校准常量 → CALIB_*
- 配置数据 → CONFIG_DATA_*
### 11.3 代码内存分配
代码分配到相应内存段:
- 通用代码 → CODE
- 频繁调用 → CODE_FAST
- 不频繁调用 → CODE_SLOW
- Callout → CALLOUT_CODE
---
## A 引用的元类
详见原文 PDF 附录 A。包含:
- MemorySection
- SwAddrMethod
- BswImplementation
- SwcImplementation
- SectionNamePrefix
---
## B 不适用需求
[SWS_MemMap_00999] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 需求,详见原文 PDF。
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SWS_MemoryMapping v4.4.0(Document ID 128,109 页)。
- 保留所有需求 ID(SWS_MemMap_xxxxx、SRS_BSW_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 保留内存分配关键字(`_START_SEC_*``_STOP_SEC_*`)的英文形式。
- 模块缩写、初始化策略和对齐关键字(VAR、CONST、CODE、CALIB、INIT、CLEARED、NO_INIT、PTR 等)保持英文。
- 完整的元类引用和详细配置参数请参考原文 PDF 附录。
+965
View File
@@ -0,0 +1,965 @@
# 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)和请求结果常量保持英文。
+698
View File
@@ -0,0 +1,698 @@
# RAM 测试规范
> **文档标题**: Specification of RAM Test
> **AUTOSAR CP Release**: 4.4.0
> **文档编号**: 076
> **文档类型**: SWS (Software Specification)
---
## 文档标识
| 项目 | 内容 |
|------|------|
| Document Title | Specification of RAM Test |
| Document Owner | AUTOSAR |
| Document Responsibility | AUTOSAR |
| Document Identification No | 076 |
| 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 | MCALMulticoreDistribution (CONC_639) DRAFT;头文件清理;小幅更正 |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 更新追溯;小幅更正/澄清/编辑性修订 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 移除 7.5 调试小节;重命名 RamTstGetVersionInfoApi → RamTstVersionInfoApi;移除 SWS_RamTst_00167 和 00168;新增运行时错误和瞬态故障章节 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 更新扩展生产错误的通过/失败标准;调试支持标记为过时 |
| 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 | 移除 SWS_RamTst_00110 时序属性;编辑性修订 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 按新的 SWS_BSWGeneral 文档对齐;更新扩展生产错误文档;调整 ISO 26262 |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 澄清部分需求;笔误更正;新增 DET 错误报告需求 |
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | 澄清部分配置参数;改进错误报告 |
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | 新增前台测试;允许每个测试算法多个配置;R4.0 维护 |
| 2009-02-04 | 3.1.2 | AUTOSAR CM | 更新文档到新 SWS 宏 |
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 |
| 2008-02-01 | 3.0.2 | AUTOSAR Administration | 第 1 章和第 9 章图修正 |
| 2007-12-21 | 3.0.1 | AUTOSAR Administration | 文档化并包含 RAM 测试概念;更新需求表;措辞/语法变更;时序图变更 |
| 2007-07-24 | 2.1.16 | AUTOSAR Technical Office | 表格从 UML 模型生成 |
| 2007-01-24 | 2.1.15 | AUTOSAR Administration | "用户须知"修订;增加"版本信息" |
| 2006-11-28 | 2.1.1 | AUTOSAR Administration | 文件包含结构更新;移除"改良汉明码"测试;`RamTst_Stop()` & `RamTst_Continue()` 改为"异步" |
| 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 介绍与功能概述
本规范描述 RAM Test 模块的功能、API 和配置。
RAM Test 模块的任务是通过软件测试 RAM 内存区域,以检测永久故障。
主要特性:
- **后台 RAM 测试**(Background):周期性执行,可中断,异步服务
- **前台 RAM 测试**(Foreground):由用户调用,同步,可执行完整或部分测试
- 支持低、中、高诊断覆盖率的多种测试算法
- 非破坏性和破坏性两种模式
- 可配置的测试单元数
模块阶段:
1. 初始化(Init)
2. 后台测试运行(Run)
3. 暂停(Suspend)/恢复(Resume)
4. 停止(Stop)/允许(Allow)
5. 反初始化(DeInit)
---
## 2 缩略语
| 缩略语 | 描述 |
|--------|------|
| RamTst | RAM Test 模块名 |
| ECU | Electric Control Unit |
| EOL | End Of Line |
| MCAL | Microcontroller Abstraction Layer |
| MCU | Microcontroller Unit |
| NMI | Non maskable interrupt |
| OS | Operating System |
| DEM | Diagnostic Event Manager |
| DET | Default Error Tracer |
| ECC | Error Correction Code |
| CRC | Cyclic Redundancy Check |
---
## 3 相关文档
### 3.1 输入文档
- List of Basic Software Modules
- Layered Software Architecture
- General Requirements on Basic Software Modules
- Requirements on RAM Test — AUTOSAR_SRS_RAMTest.pdf
- Specification of Default Error Tracer
- Specification of Diagnostic Event Manager
- General Specification of Basic Software Modules
### 3.2 相关标准与规范
- ISO 26262-5:2011
### 3.3 相关规范
AUTOSAR 提供基础软件模块通用规范(SWS BSW General),也适用于 RAM Test。
---
## 4 约束与假设
### 4.1 限制
仅涵盖用于检查 RAM 的软件算法。硬件 RAM 检查(如 ECC 校验)不在范围内。
RAM Test 模块旨在集成于整体安全概念中,本身不提供所需诊断覆盖率。
### 4.2 完整 RAM 测试
完整 RAM 测试覆盖所有配置的 RAM 块,从开始到结束。
### 4.3 部分 RAM 测试
部分 RAM 测试仅覆盖配置 RAM 块的一部分。
### 4.4 适用车型领域
无限制。
---
## 5 模块依赖
依赖于 DEM 错误报告、DET 开发错误报告。
---
## 6 需求追溯
(主要追溯关系,完整表见原文 PDF)
| 需求 | 满足者 |
|------|--------|
| SRS_BSW_00323 (参数检查) | SWS_RamTst_00033, 00037, 00039, 00040, 00095, 00097, 00170, 00172, 00210, 00214 |
| SRS_BSW_00337 (开发错误分类) | SWS_RamTst_00067 |
| SRS_BSW_00339 (生产错误状态报告) | SWS_RamTst_00011, 00067, 00071, 00111, 00213, 00216, 01002, 01005, 01008 |
| SRS_BSW_00406 (模块初始化) | SWS_RamTst_00006 |
| SRS_BSW_00407 (版本信息) | SWS_RamTst_00109 |
| SRS_BSW_00414 (配置结构指针) | SWS_RamTst_00093, 01011, 01012 |
| SRS_BSW_00450 (主函数立即返回) | SWS_RamTst_00175 |
| SRS_RamTst_13800 (测试单元数运行时可变) | SWS_RamTst_00036, 00107 |
| SRS_RamTst_13802 (多 RAM 区域配置) | SWS_RamTst_00026 |
| SRS_RamTst_13803 (预编译算法选择) | SWS_RamTst_00026, 00027, 00063, 00224, 00225, 00226 |
| SRS_RamTst_13804 (运行时算法选择) | SWS_RamTst_00083, 00105 |
| SRS_RamTst_13809 (划分测试为小部分) | SWS_RamTst_00008, 00026, 00059, 00107, 00108 |
| SRS_RamTst_13810 (Get status 接口) | SWS_RamTst_00010, 00011, 00019, 00024, 00038, 00104 |
| SRS_RamTst_13811 (非破坏性) | SWS_RamTst_00060, 00061, 00200 |
| SRS_RamTst_13812 (破坏性) | SWS_RamTst_00061, 00201 |
| SRS_RamTst_13816 (指令队列影响) | SWS_RamTst_00062 |
| SRS_RamTst_13820 (通知机制) | SWS_RamTst_00043, 00044, 00045, 00046, 00113, 00114 |
| SRS_RamTst_13822 (低覆盖算法) | SWS_RamTst_00224 |
| SRS_RamTst_13823 (中等覆盖算法) | SWS_RamTst_00225 |
| SRS_RamTst_13824 (高覆盖算法) | SWS_RamTst_00226 |
| SRS_SPAL_12448 (开发错误检测后行为) | SWS_RamTst_00033, 00037, 00039, 00040, 00084, 00095 |
完整追溯表见原文 PDF。
---
## 7 功能规范
### 7.1 需求
[SWS_RamTst_00005] ⌈RAM Test 模块应提供后台 RAM 测试作为异步服务。⌋
[SWS_RamTst_00206] ⌈RAM Test 模块应提供前台 RAM 测试作为同步服务。⌋
[SWS_RamTst_00063] ⌈RAM Test 模块的配置过程应允许在预编译时选择不同 RAM 测试算法的子集。⌋
#### 非破坏性测试
[SWS_RamTst_00060] ⌈如选择非破坏性 RAM 测试,RAM Test 模块应在修改前保存待测试 RAM 区域。整个过程(保存、更改、还原)应不中断地执行。⌋
#### 测试算法
- [SWS_RamTst_00224] ⌈应提供低覆盖率测试算法(ISO 26262-5:2011 表 D.1)⌋
- [SWS_RamTst_00225] ⌈应提供中等覆盖率测试算法⌋
- [SWS_RamTst_00226] ⌈应提供高覆盖率测试算法⌋
- [SWS_RamTst_00204] ⌈可提供额外厂商或硬件特定测试算法,必须明确文档化其故障覆盖率⌋
#### 指令/数据队列处理
[SWS_RamTst_00062] ⌈写入单元后读回前,RAM Test 模块应提供注入指令的可能性,强制控制器清除其 CPU 内部缓存。⌋
#### 中断处理
[SWS_RamTst_00221] ⌈处理器特定测试算法可使用支持数据丢失检测的硬件宏和/或中断(如 CRC、ECC)。实现者必须在 BSW 模块描述中描述任何中断例程。⌋
### 7.2 错误分类
#### 7.2.1 开发错误
[SWS_RamTst_00067] ⌈
| 错误类型 | 相关性 | 相关错误代码 | 值[hex] |
|----------|--------|--------------|---------|
| 在意外状态下调用特定 API | Development | RAMTST_E_STATUS_FAILURE | 0x01 |
| API 参数超出规定范围 | Development | RAMTST_E_OUT_OF_RANGE | 0x02 |
| 模块未初始化调用 API 服务 | Development | RAMTST_E_UNINIT | 0x03 |
| NULL 指针参数 | Development | RAMTST_E_PARAM_POINTER | 0x04 |
| 初始化失败 | Development | RAMTST_E_INIT_FAILED | 0x05 |
#### 7.2.2 运行时错误
无运行时错误。
#### 7.2.3 瞬态故障
无瞬态故障。
#### 7.2.4 生产错误
无生产错误。
#### 7.2.5 扩展生产错误
| 错误名 | 描述 |
|--------|------|
| RAMTST_E_BG_DESTRUCTIVE | 后台破坏性测试错误 |
| RAMTST_E_BG_NON_DESTRUCTIVE | 后台非破坏性测试错误 |
| RAMTST_E_FG_DESTRUCTIVE | 前台破坏性测试错误 |
| RAMTST_E_FG_NON_DESTRUCTIVE | 前台非破坏性测试错误 |
每个具有通过/失败检测标准:
- Fail:测试检测到 RAM 故障(块结果为 NOT_OK)
- Pass:所有块测试为 OK
### 7.3 错误检测
参考 SWS_BSWGeneral 文档。
### 7.4 错误通知
通过 DEM 报告生产错误,通过 DET 报告开发错误。
### 7.5 通用测试行为
[SWS_RamTst_00026] [SWS_RamTst_00027] ⌈RAM Test 模块应支持后构建和预编译配置。⌋
测试可分为多个小部分,每个 `RamTst_MainFunction` 调用测试指定数量的单元。
---
## 8 API 规范
### 8.1 导入的类型
| 模块 | 头文件 | 导入类型 |
|------|--------|----------|
| Dem | Rte_Dem_Type.h | Dem_EventIdType, Dem_EventStatusType |
| Std_Types | StandardTypes.h | Std_ReturnType, Std_VersionInfoType |
### 8.2 类型定义
#### 8.2.1 RamTst_ConfigType
| 项 | 内容 |
|-----|------|
| Type | Structure |
| Range | 实现特定 |
| Description | 包含 RAM Test 模块初始化数据的结构。 |
#### 8.2.2 RamTst_ExecutionStatusType
| 项 | 内容 |
|-----|------|
| Type | Enumeration |
| Range | RAMTST_NOT_TESTED (0x00); RAMTST_RUNNING (0x01); RAMTST_FINISHED (0x02); RAMTST_SUSPENDED (0x03); RAMTST_STOPPED (0x04) |
| Description | RAM 测试执行状态。 |
#### 8.2.3 RamTst_TestResultType
| 项 | 内容 |
|-----|------|
| Type | Enumeration |
| Range | RAMTST_TEST_NOT_RUN (0x00); RAMTST_TEST_PASSED (0x01); RAMTST_TEST_FAILED (0x02); RAMTST_TEST_UNDEFINED (0x03) |
| Description | RAM 测试结果。 |
#### 8.2.4 RamTst_AlgParamsIdType
| 项 | 内容 |
|-----|------|
| Type | uint8/uint16 |
| Description | 算法参数 ID 类型。 |
#### 8.2.5 RamTst_AlgorithmType
| 项 | 内容 |
|-----|------|
| Type | Enumeration |
| Range | RAMTST_ALGORITHM_VENDORxxx 等(实现特定) |
| Description | 算法类型。 |
#### 8.2.6 RamTst_NumberOfTestedCellsType
uint8/uint16/uint32 — 被测试单元数。
#### 8.2.7 RamTst_NumberOfBlocksType
uint8/uint16/uint32 — 块数量。
### 8.3 函数定义
#### 8.3.1 RamTst_Init
```c
void RamTst_Init(const RamTst_ConfigType* ConfigPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x00 |
| Sync/Async | Synchronous |
| Description | 初始化 RAM Test 模块。 |
#### 8.3.2 RamTst_DeInit
```c
void RamTst_DeInit(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x10 |
| Description | 反初始化。 |
#### 8.3.3 RamTst_Stop
```c
Std_ReturnType RamTst_Stop(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x02 |
| Sync/Async | Asynchronous |
| Description | 停止后台 RAM 测试。 |
#### 8.3.4 RamTst_Allow
```c
Std_ReturnType RamTst_Allow(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x03 |
| Description | 允许后台 RAM 测试。 |
#### 8.3.5 RamTst_Suspend
```c
Std_ReturnType RamTst_Suspend(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x04 |
| Sync/Async | Asynchronous |
| Description | 暂停后台 RAM 测试。 |
#### 8.3.6 RamTst_Resume
```c
Std_ReturnType RamTst_Resume(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x05 |
| Description | 恢复后台 RAM 测试。 |
#### 8.3.7 RamTst_GetExecutionStatus
```c
RamTst_ExecutionStatusType RamTst_GetExecutionStatus(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x06 |
| Description | 获取测试执行状态。 |
#### 8.3.8 RamTst_GetTestResult
```c
RamTst_TestResultType RamTst_GetTestResult(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x07 |
| Description | 获取测试结果。 |
#### 8.3.9 RamTst_GetTestResultPerBlock
```c
Std_ReturnType RamTst_GetTestResultPerBlock(
uint8 BlockIndex,
RamTst_TestResultType* TestResultPtr
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x08 |
| Description | 获取指定块的测试结果。 |
#### 8.3.10 RamTst_GetVersionInfo
```c
void RamTst_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x09 |
#### 8.3.11 RamTst_GetAlgParams
```c
Std_ReturnType RamTst_GetAlgParams(RamTst_AlgParamsIdType* AlgParamsIdPtr)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0a |
| Description | 获取算法参数 ID。 |
#### 8.3.12 RamTst_GetTestAlgorithm
```c
RamTst_AlgorithmType RamTst_GetTestAlgorithm(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0b |
| Description | 获取当前测试算法。 |
#### 8.3.13 RamTst_GetNumberOfTestedCells
```c
RamTst_NumberOfTestedCellsType RamTst_GetNumberOfTestedCells(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0c |
| Description | 获取被测单元数。 |
#### 8.3.14 RamTst_SelectAlgParams
```c
Std_ReturnType RamTst_SelectAlgParams(RamTst_AlgParamsIdType AlgParamsId)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0d |
| Description | 选择算法参数。 |
#### 8.3.15 RamTst_ChangeNumberOfTestedCells
```c
Std_ReturnType RamTst_ChangeNumberOfTestedCells(RamTst_NumberOfTestedCellsType NumberOfTestedCells)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0e |
| Description | 改变被测单元数。 |
#### 8.3.16 RamTst_RunFullTest
```c
Std_ReturnType RamTst_RunFullTest(RamTst_NumberOfBlocksType BlockIndex)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x0f |
| Sync/Async | Synchronous |
| Description | 运行前台完整 RAM 测试。 |
#### 8.3.17 RamTst_RunPartialTest
```c
Std_ReturnType RamTst_RunPartialTest(
RamTst_NumberOfBlocksType BlockIndex,
uint32 StartAddress,
uint32 EndAddress
)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x11 |
| Sync/Async | Synchronous |
| Description | 运行前台部分 RAM 测试。 |
### 8.4 回调通知
无。
### 8.5 调度函数
#### RamTst_MainFunction
```c
void RamTst_MainFunction(void)
```
| 项 | 内容 |
|-----|------|
| Service ID[hex] | 0x01 |
| Description | 执行后台 RAM 测试。 |
| Available via | SchM_RamTst.h |
### 8.6 期望接口
#### 强制接口
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Dem_SetEventStatus | Dem.h | 报告监视状态信息到 Dem |
#### 可选接口
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| Det_ReportError | Det.h | 报告开发错误 |
#### 可配置接口
##### RamTst_TestCompletedNotification
测试完成时调用的可配置回调函数。
##### RamTst_ErrorNotification
错误检测时调用的可配置回调函数。
---
## 9 时序图
### 9.1 RamTst_MainFunction (示例)
调度程序周期调用 → RamTst_MainFunction 执行部分测试。
### 9.2 RamTst_ChangeNumberOfTestedCells
用户运行时改变测试单元数。
### 9.3-9.9 其他 API 时序
各 API 函数的同步调用与返回。
---
## 10 配置规范
### 10.1 如何阅读本章
详见 SWS_BSWGeneral 文档。
### 10.2 容器与配置参数
#### 10.2.1 变体
支持 VARIANT-POST-BUILD 和 VARIANT-PRE-COMPILE。
#### 10.2.2 RamTst
模块顶层配置容器。
#### 10.2.3 RamTstDemEventParameterRefs
引用 DEM 事件参数:
- RAMTST_E_BG_DESTRUCTIVE
- RAMTST_E_BG_NON_DESTRUCTIVE
- RAMTST_E_FG_DESTRUCTIVE
- RAMTST_E_FG_NON_DESTRUCTIVE
#### 10.2.4 RamTstCommon
通用配置:
| 参数 | 描述 |
|------|------|
| RamTstDevErrorDetect | 开发错误检测 |
| RamTstVersionInfoApi | 版本信息 API |
| RamTstAllowApi | Allow API 启用 |
| RamTstStopApi | Stop API 启用 |
| RamTstSuspendApi | Suspend API 启用 |
| RamTstResumeApi | Resume API 启用 |
| RamTstSelectAlgParamsApi | SelectAlgParams API 启用 |
| RamTstChangeNumberOfTestedCellsApi | ChangeNumberOfTestedCells API 启用 |
| RamTstRunFullTestApi | RunFullTest API 启用 |
| RamTstRunPartialTestApi | RunPartialTest API 启用 |
| RamTstTestCompletedNotification | 测试完成回调 |
| RamTstErrorNotification | 错误回调 |
| RamTstMainFunctionPeriod | 主函数周期 |
#### 10.2.5 RamTstAlgorithms
测试算法配置:
| 参数 | 描述 |
|------|------|
| RamTstLowCoverage | 低覆盖率算法 |
| RamTstMediumCoverage | 中覆盖率算法 |
| RamTstHighCoverage | 高覆盖率算法 |
| RamTstAlgorithmVendorSpecific | 厂商特定算法 |
#### 10.2.6 RamTstConfigParams
配置参数:
| 参数 | 描述 |
|------|------|
| RamTstNumberOfTestedCells | 默认被测试单元数 |
| RamTstNumberOfBlocks | 块数量 |
| RamTstTestMode | 破坏性/非破坏性 |
#### 10.2.7 RamTstAlgParams
每算法参数:
| 参数 | 描述 |
|------|------|
| RamTstAlgParamsId | 算法参数 ID |
| RamTstAlgorithm | 使用的算法 |
| RamTstAlgorithmCoverage | 覆盖率级别 |
#### 10.2.8 RamTstBlockParams
每个 RAM 块参数:
| 参数 | 描述 |
|------|------|
| RamTstBlockId | 块 ID |
| RamTstStartAddress | 起始地址 |
| RamTstEndAddress | 结束地址 |
| RamTstTestAlgorithm | 应用的算法 |
### 10.3 已发布参数
#### RamTstPublishedInformation
版本信息等。
### 10.4 实现特定信息和参数
可由实现者提供额外参数。
---
## 11 不适用需求
[SWS_RamTst_00999] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 和 SRS_SPAL_* 需求,详见原文 PDF。
---
## 翻译说明
- 本文档完整翻译自 AUTOSAR_SWS_RAMTest v4.4.0(Document ID 076,83 页)。
- 保留所有需求 ID(SWS_RamTst_xxxxx、SRS_RamTst_xxxxx、ECUC_RamTst_xxxxx)。
- 保留 AUTOSAR 方框符 ⌈⌋。
- 模块缩写(RamTst、ECU、DEM、DET、CRC、ECC 等)和 API 函数名保持英文。
- 详细配置参数和示例请参考原文 PDF 第 10 章。