1. 简介及功能概述
本文介绍了基础Autosar概念中的非易失性存储及应用软件可用的各种访问机制。
本文第四章对非易失性存储机制作了介绍,第五章介绍了应用软件组件访问非易失性存储的各种用例。
2. 首字母及缩写
3. 关联文档
AUTOSAR_SWS_RTE.pdf
AUTOSAR_TPS_SoftwareComponentTemplate.pdf
AUTOSAR_SWS_NVRAMManager.pdf
AUTOSAR_EXP_ModeManagementGuide.pdf
4. 总体机制及概念
4.1 NvM及其特点
ECU内部数据具有可变性及持久性要求。在ECU工作中数据可变同时要求存在在非易失性存储器中。在Autosar中
应用仅能通过NvM模块访问非易失性存储器,NvM模块提供同步及异步访问请求服务用于管理及维护数据。
图 1 显示了应用程序和内存堆栈之间的交互以及 涉及的模块。
图1 Autosar 内存栈概述
4.1.1 基本存储对象(Basic storage objects)
基本存储对象是NVRAM 块的最小实体。一些基本存储对象可以构成NVRAM块。基本存储对象可以存在于不同的存储位置(RAM、ROM、NV memory)。基本存储对象包含如下三种类型:RAM Block、ROM Block、NV Block。
4.1.1.1 RAM Block
RAM Block是基本存储对象,它代表NVRAM block驻留在RAM中。
RAM Block 由“user data”、“CRC”(可选)、“NV header”(可选)、“Administrative Block
”四部分组成。它主要用于存储实时数据。它是NVRAM Block可选部分。
4.1.1.2 ROM Block
ROM Block是基本存储对象,它代表NVRAM block驻留在ROM中。
ROM Block中的内容具有可持续性,在程序执行过程中不可修改。它的数据驻留在ROM/Flash中,主要是为初始化的VN Block或VN损坏时提供默认数据。它是NVRAM Block可选部分。
4.1.1.3 NV Block
“NV Block”是基本存储对象。 它代表驻留在 NV 内存中的“NVRAM Block”的一部分。 “NV Block”是“NVRAM Block”的必需部分。
NV Block 的内容具有持久性,可以在程序执行期间修改并驻留在 Flash 中。 它由 NV 用户数据和(可选)一个 CRC 值和(可选)一个 NV 块头组成。 它用于保存定期/按需存储的实时数据。
4.1.1.4 Administrator Block
“Administrator Block”是基本存储对象,它驻留在 RAM 中。 “Administrator Block”是“NVRAM Block”的必需部分。
“Administrator Block”的内容具有非持久性,驻留在 RAM 中。 它用于保存相应 NVRAM 的属性/错误/状态信息以及专门用于“数据集”类型的 NVRAM Block的块索引。 这是 NVRAM 块的强制部分。
4.1.2 块访问类型(Block Management types)
NVM模块支持如下块管理类型:“Native NVRAM block”、“Redundant NVRAM block”、“Dataset NVRAM block”。
4.1.2.1 本地NVRAM块(Native NVRAM block)
本地 NVRAM 块是最简单的块管理类型。 它允许以最小的开销存储到/从 NV 内存中检索。
NVM_BLOCK_NATIVE 类型的 NVRAM 存储由以下基本组成 存储对象:
- NV Blocks: 1
- RAM Blocks: 1
- ROM Blocks: 0..1
- Administrative Blocks:1
4.1.2.2 冗余NVRAM块(Redundant NVRAM block)
除了本地 NVRAM 块之外,冗余 NVRAM 块还提供增强的容错性、可靠性和可用性。 它增加了对数据损坏的抵抗力。 冗余 NVRAM 块由两个 NV 块、一个 RAM 块和一个管理块组成。
NVM_BLOCK_REDUNDANT 类型的 NVRAM 存储由以下基本存储对象组成:
- NV Blocks: 2
- RAM Blocks: 1
- ROM Blocks: 0..1
- Administrative Blocks:1
4.1.2.3 数据集NVRAM块(Dataset NVRAM block)
数据集 NVRAM 块是一组大小相同的数据块。 应用程序可以一次访问这个数据块中的一个。
NVM_BLOCK_DATASET 类型的 NVRAM 存储由以下基本组成
存储对象:
- NV Blocks: 1..NvMNvBlockNum
- RAM Blocks: 1
- ROM Blocks: 0..NvMRomBlockNum
- Administrative Blocks: 1
配置的数据集(NV+ROM块)的总数必须在1 . . 255
通过使用 API NvM_SetDataIndex 设置相应的索引来访问特定的数据集元素。 索引从 0 到 NvMNvBlockNum - 1 的元素 代表 NV Blocks,而索引从 NvMNvBlockNum 到 NvMNvBlockNum + NvMRomBlockNum - 1 的那些代表 ROM 块。 NVRAM 块用户必须确保在访问数据元素之前选择了有效的数据集索引。
4.1.3 同步机制(Synchronization Mechanism supported)
从 NvM 模块的 RAM 镜像访问数据时,支持隐式(Implicit synchronization)及显式(Explicit synchronization)两种类型的同步机制。
4.1.3.1 隐式同步
在隐式同步中,应用程序和 NvM 可以同时访问一个公共 RAM 块。 应用程序通过调用 NvM API 向 RAM 写入/读取数据。
在这种情况下,RAM 块被映射到一个 SW-C 并且不推荐共享 RAM 块。 每当 SW-C 使用 RAM 块(临时/永久)访问 NVRAM 时,需要等到NvM 完成正在进行的操作以确保 RAM 块的数据一致性 .
使用隐式同步时需要考虑以下步骤:
- 写请求:
1. 应用程序将由NvM 模块写入的数据填充 RAM 块 。
2. 应用程序发出 NvM_WriteBlock 或 NvM_WritePRAMBlock 请求,然后将控制转移到 NvM 模块。
3. 从现在开始,应用程序不得修改 RAM 块,直到通过轮询发出请求的成功或失败信号或得出该请求。 这个过程中 可以读取 RAM 块的内容。
4. 应用程序可以使用轮询来获取请求的状态,也可以通过回调函数异步通知。
5. NvM 模块操作完成后,RAM 块可重复使用以进行修改。
- 多块写请求(NvM_WriteAll):
1. ECU 状态管理器发出 NvM_WriteAll 请求,将控制转移到 NvM 模块。
2. ECU 状态管理器可以使用轮询来获取请求的状态或可以通过回调函数获得通知。
4.1.3.2 显式同步
在显式同步中,NvM 定义了一个RAM 镜像,用于与Application 的RAM 块交换数据。Application 将数据写入RAM 块并调用NvM 写API。 NvM 调用 API 来读取 RAM 镜像,并将数据从 RAM 镜像复制到 RAM 块,最后复制到 NV 块。 数据由应用程序通过回调例程双向传输,由 NvM 模块调用
优点:应用程序可以有效地控制它们的 RAM 块。它们负责使用 ReadRamBlockFromNvM / WriteRamBlockToNvM 将一致的数据复制到 NvM 模块的 RAM 镜像和从 NvM 模块的 RAM 镜像复制。应用程序在向/从 RAM 镜像复制数据时必须确保 RAM 块的数据完整性。
缺点:额外的 RAM 需要与使用此机制的最大 NVRAM 块具有相同的大小,并且每个操作都需要在两个 RAM 位置之间进行额外的复制。 如果存在同步这些应用程序的模块(例如NvBlockSwComponentType)并且从 NvM 模块的角度来看是 NVRAM 块的所有者,则此机制尤其允许不同应用程序共享 NVRAM 块。
使用显式同步时需要考虑以下步骤 :
- 写请求:
- 应用程序用必须写入的数据填充 RAM 块 NVM 模块。
- 应用程序发出 NvM_WriteBlock 或 NvM_WritePRAMBlock 要求。
- 应用程序可能会修改 RAM 块,直到例程 NvMWriteRamBlockToNvM 由 NvM 模块调用。
- 如果 NvMWriteRamBlockToNvM 例程被 NvM 模块调用,则应用程序必须将 RAM 块的一致副本提供给 NvM 模块请求的目的地。应用程序可以使用返回值 E_NOT_OK 以表示数据不一致。虚拟机模块将接受此 NvMRepeatMirrorOperations 次,然后 推迟请求并继续下一个求。
- 仅当数据被复制到 NvM 模块时才继续:
- 从现在开始,应用程序可以再次读写 RAM 块。
- 应用程序可以使用轮询来获取请求的状态或可以 通过回调例程异步通知。
- 多块写入请求 (NvM_WriteAll):
- ECU 状态管理器发出 NvM_WriteAll 请求,该请求传输控制到 NvM 模块。
- 在 NvM_WriteAll 作业期间,如果同步回调 (NvM_WriteRamBlockToNvM) 被配置为一个块,它将被调用 NVM 模块。在此回调中,应用程序必须提供一致的副本到 NvM 模块请求的目的地的 RAM 块。这应用程序可以使用返回值 E_NOT_OK 来表示该数据 不一致。NvM 模块会接受这个 NvMRepeatMirrorOperations 次,然后将写操作报告为失败的。
- 现在应用程序可以再次读取和写入 RAM 块。
- ECU状态管理器可以使用轮询来获取请求的状态或者可以 通过回调函数通知。
4.1.4 其他特性(other feature)
4.1.4.1 基于CRC的比对(CRC based comparation)
NvM 模块在内部使用 CRC 生成例程(8/16/32 位)来检查和生成 NVRAM 块的 CRC ,作为可配置选项。
NvM 模块通过实现基于 CRC 的比较机制提供了跳过未更改数据写入的选项。 可以通过设置配置参数 NvMBlockUseCRCCompMechanism 来启用基于 CRC 的比较机制。
注 - 通常,RAM 块的某些更改内容可能会导致与初始内容相同的 CRC,因此如果使用此选项,更新可能会丢失。 因此,这个选项应该只用于可以容忍这种风险的区块。
4.1.4.2 错误恢复(error recovery)
NvM 模块通过加载默认值(如果通过参数 NvMRomBlockDataAddress 或参NvMInitBlockCallback 配置)为 NVRAM 块管理类型 NATIVE 和 REDUNDANT 提供读取时的隐式错误恢复。
通过调用 API NvM_RestoreBlockDefaults,所有块管理类型都可以显式检索 ROM 数据。 对于 DATASET,在调用此 API 之前必须设置相关索引(指向 ROM 块)。
NvM 模块通过加载具有默认值的 RAM 块来为块管理类型为 NVM_BLOCK_REDUNDANT 的 NVRAM 块提供读取错误恢复。
NvM 模块通过执行写入重试来提供写入错误恢复,而不管 NVRAM 块管理类型如何。
4.1.4.3 写校验(write verification)
在写验证的情况下,当一个 RAM Block 被写入 NV 存储器时,NV 块会立即被读回并与 RAM Block 中的原始内容进行比较。 如果 RAM Block 中的原始内容与回读不同,则执行写入重试。 如果允许,产生的错误码NVM_E_VERIFY_FAILED 将报告给 DEM。如果回读操作失败,则不执行读重试。
4.1.4.4 RAM block 控制(RAM Block handling using the NvM_SetRamBlockStatus API)
4.1.4.4.1 启动阶段(During startup phase (NvM_ReadAll))
4.1.4.4.1 关闭阶段(During shutdown phase (NvM_WriteAll))
4.1.4.5 抵制软件变更(Resistant to changed software)
4.2 通过RTE访问NvM
4.3 通过NvMRAM初始化RAM块
5. 用例概述
6. 附录
目录
4.1.1 基本存储对象(Basic storage objects)
4.1.2 块访问类型(Block Management types)
4.1.2.1 本地NVRAM块(Native NVRAM block)
4.1.2.2 冗余NVRAM块(Redundant NVRAM block)
4.1.2.3 数据集NVRAM块(Dataset NVRAM block)
4.1.3 同步机制(Synchronization Mechanism supported)
4.1.4.1 基于CRC的比对(CRC based comparation)
4.1.4.3 写校验(write verification)
4.1.4.4 RAM block 控制(RAM Block handling using the NvM_SetRamBlockStatus API)
4.1.4.4.1 启动阶段(During startup phase (NvM_ReadAll))
4.1.4.4.1 关闭阶段(During shutdown phase (NvM_WriteAll))