1. 简介和功能概述
本文档本规范描述了AUTOSAR基础软件模块 NVRAM Manager (NvM) 的功能、API 和配置。,以及应用软件组件(application software components)可用的各种访问机制。
本文在第4章节中先简要介绍了非易失性内存概念,接着在第5章节中介绍了从应用程序(即:最终用户)访问非易失性内存的各种用例。
2. 缩略语
NvM
NVRAM管理器(NVRAM Manager)
NV
非易失性(Non-volatile)
NVRAM
非易失性随机存取存储器(Non-volatile Random Access Memory)
NVRAM Block
NVRAM块(NVRAM Block)是管理和存储NV数据块所需的整个结构。
NV Block
NV块(NV Block)是一个基本存储对象。用来表示驻留在NV内存中的那部分NVRAM块。
RAM Block
RAM Block是一个基本存储对象。用来表示驻留在RAM中的那部分NVRAM块。
RAM Mirror
RAM镜像是NvM内部缓冲区。当NvMBlockUseSyncMechanism设置为TRUE时,用于操作读取和写入的NVRAM Block数据的RAM Block。
ROM Block
ROM Block是一个基本存储对象。用来表示驻留在ROM中的那部分NVRAM块。
ROM
只读存储器(Read-Only Memory)
RTE
运行环境(Runtime Environment)
SW-C
软件组件(Software Component)
3. 相关文档
[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
4. 总体机制和概念
4.1. NVM及其特点
易变性(Changeability)和持久性(durability)是ECU内部数据所具有的相关属性。为了在不同的上电周期里数据都是可用的,变化的数据需要保存在非易失性存储器(Non-volatile memory)中。保存在非易失性存储器(Non-volatile memory)中的数据被称为NV数据。在AUTOSAR中,应用程序只能通过NVRAM管理器 (NvM) 访问非易失性存储器。NvM模块为数据的管理和维护提供所需的同步及异步服务。
下图1显示了应用程序(Application)和内存堆栈(Memory Stack)之间的交互以及所涉及的模块。
接着的章节将概述NvM模块提供的不同概念和功能。有关更详细信息请参阅文档[3]。
4.2. 基本存储对象
基本存储对象(Basic Storage Object)是NVRAM块的最小实体。若干个基本存储对象的组合可以用来构建NVRAM块。
基本存储对象可以驻留在不同的内存位置:
- RAM
- ROM
- NV内存
4.2.1. RAM块
RAM块(RAM Block)是一种基本存储对象,它用来表示驻留在RAM中的那部分NVRAM块。
RAM块由用户数据(user data)和可选的CRC值和可选NV Block header组成,用来保存实时数据(live data),是NVRAM块的可选部分(optional part)。
4.2.1.1. ROM块
ROM块(ROM Block)也是一种基本存储对象,它用来表示驻留在ROM中那部分NVRAM块。ROM Block也是NVRAM块的可选部分(optional part)。
ROM块的内容具有持久性(persistent nature)的特性。同时在程序执行期间,其内容是无法被修改的。它驻留在ROM/Flash中。当NV Block为空或者损坏的情况下,ROM Block提供默认数据(default data)。
4.2.2. NV块
NV块(NV Block)也是一种基本存储对象。它用来表示驻留在NV内存中那部分NVRAM块。NV块是NVRAM块的必不可少的部分。
NV块的内容也具有持久性的特性,但在程序执行期间,其内容是可以被修改。它驻留在Flash中。
NV块由用户数据(user data)和可选的CRC值和可选NV Block header组成。它用于保存定期的或者根据请求需要存储的实时数据。
4.2.3. 管理块
管理块(Administrative Block)也是一种基本存储对象。它驻留在RAM中。管理块也是NVRAM块中必不可少的部分。
管理块的内容也具有非持久性的特性,驻留在RAM中。
管理块主要用于保存相应NVRAM块的属性/错误/状态信息,以及专用于数据集(Dataset)类型的NVRAM Block的块索引。
4.3. 块管理类型
NvM模块支持以下NVRAM块管理类型:
4.3.1. 原生NVRAM块
原生NVRAM块(Native NVRAM Block)是最简单的块管理类型。它允许以最小的开销存储数据到NV内存中,同时从NV内存中取回数据。
NVM_BLOCK_NATIVE类型的NVRAM存储由以下基本存储对象组成:
- NV块:1个
- RAM块:1个
- ROM块:0..1个
- 管理块:1个
4.3.2. 冗余NVRAM块
除了原生NVRAM块外,冗余NVRAM块(Redundant NVRAM block)提供了增强的容错性(fault tolerance)、可靠性(reliability)和可用性(availability)。它增加了对数据损坏的抵抗力。冗余NVRAM块由两个NV块、一个RAM块和一个管理块组成。
例如在读取期间,如果与冗余NVRAM块关联的NV块被视为无效,NvM模块会尝试使用来自未损坏NV块的数据来恢复NV块。
NVM_BLOCK_REDUNDANT类型的NVRAM存储由以下基本存储对象组成:
- NV块:2个
- RAM块:1个
- ROM块:0..1个
- 管理块:1个
4.3.3. 数据集NVRAM块
数据集NVRAM块(Dataset NVRAM block)是大小相等的数据块阵列。应用程序可以一次性访问该数据块中的某一个数据。
NVM_BLOCK_DATASET类型的NVRAM存储由以下基本存储对象组成:
- NV块:1..NvMNvBlockNum个
- RAM块:1个
- ROM块:0..NvMRomBlockNum个
- 管理块:1个
被配置数据集(NV+ROM 块)的总数必须在1..255的范围内。
通过使用NvM_SetDataIndex的API函数可以设置相应的索引来访问特定的数据集元素。索引从0到NvMNvBlockNum - 1的元素表示NV块,而索引从 NvMNvBlockNum到NvMNvBlockNum + NvMRomBlockNum - 1的元素表示ROM块。NVRAM块用户必须确保在访问数据元素之前选择了有效的数据集索引。
4.4. 支持同步机制
在对NvM模块的RAM镜像(RAM mirror)数据进行访问时,NvM模块支持两种类型的同步机制。
4.4.1. 隐式同步
在隐式同步(Implicit synchronization)中,应用程序和NvM可以同时访问一个公共RAM块。应用程序通过调用NvM API将数据写入RAM,或者从RAM读取数据。
在这种情况下,RAM块映射到一个SW-C,不建议共享RAM块。 每当SW-C通过RAM块(临时/永久)访问NVRAM时,SW-C必须确保RAM块数据的一致性,直到NvM完成正在进行的操作。
使用隐式同步时,以下步骤需要被考虑到:
单块写入请求(NvM_WriteBlock 和 NvM_WritePRAMBlock):
- 应用程序需提供了一个RAM块包含了将要写入的数据。
- 应用程序调用NvM_WriteBlock或者NvM_WritePRAMBlock发出写入请求,并将控制权移交给NvM模块。
- 应用程序在发出写入请求后,在请求结束之前不得修改RAM块的内容,但可以读取RAM块。
- 应用程序可以使用轮询来获取写入请求的处理状态,也可以通过设置回调函数让NvM模块异步通知应用程序。
- NvM模块操作完成后,RAM块可重用于修改。
单块读取请求(NvM_ReadBlock, NvM_ReadPRAMBlock, NvM_RestoreBlockDefaults, NvM_RestorePRAMBlockDefaults):
- 应用程序需提供了一个RAM块,用于保存将被填充的NVRAM数据。
- 应用程序调用NvM模块接口向NvM模块发出读取/恢复请求。
- 应用程序在发出读取/恢复请求后,在请求结束前不得修改RAM块的内容。
多块写入请求(NvM_WriteAll):
- 应用程序需提供了一个RAM块包含了将要写入的数据。
- NvM_WriteAll由EcuM在关机期间发出。
- 启动关机程序后,应用程序不得再修改RAM块的内容。
多块读取请求(NvM_ReadAll):
- 应用程序需提供了一个RAM块,用于保存将被填充的NVRAM数据。
- NvM_ReadAll由EcuM在启动期间发出。
- 启动程序启动后,应用程序不得修改RAM块的内容,直到NvM_ReadAll处理完成。
4.4.2. 显式同步
在显式同步(Explicit synchronization)中,NvM定义了一个RAM镜像(RAM Mirror),用于与应用程序的RAM块交换数据。应用程序将数据写入RAM块并调用NvM写入API。NvM调用API读取RAM镜像,把数据从RAM镜像复制到RAM块中,最后写入到NV块中。应用程序通过NvM模块调用的回调例程双向传输数据。
优点是应用程序可以有效地控制他们的RAM块。他们负责使用ReadRamBlockFromNvM / WriteRamBlockToNvM从NvM模块的RAM镜像中复制一致性的数据。 应用程序需确保向/从RAM镜像复制数据时,RAM块的数据的完整性。
缺点是需要额外的与使用这种机制的最大NVRAM块具有相同的大小的RAM,以及每次操作都需要在两个RAM位置之间进行额外的数据复制。
如果有一个模块(例如:NvBlockSwComponentType)可以同步这些应用程序,并且此模块从NvM模块的角度来看是NVRAM块的所有者,那么这种机制可以支持不同应用程序共享NVRAM块。
使用显式同步时,以下步骤需要被考虑到:
单块写入请求(NvM_WriteBlock 和 NvM_WritePRAMBlock):
- 应用程序需提供了一个RAM块包含了将要写入的数据。
- 应用程序调用NvM_WriteBlock或者NvM_WritePRAMBlock发出写入请求。
- 发出写入请求后一直到回调例程被调用期间,RAM块允许被修改。
- NvM模块会调用通过NvMWriteRamBlockToNvCallback配置的例程,以便将应用程序数据与NvM的内部缓冲区进行同步。
- 应用程序可以通过回调函数的返回值向NvM模块发送数据是否复制成功的信号。如果用户自定义回调函数的返回值为E_NOT_OK,NvM模块会重新尝试配置参数NvMRepeatMirrorOperations次的操作。
- 直到数据被同步到NvM模块后,应用程序才可以再次读取和写入RAM块。
- 应用程序可以使用轮询来获取写入请求的处理状态,也可以通过设置回调函数让NvM模块异步通知应用程序。
单块读取请求(NvM_ReadBlock, NvM_ReadPRAMBlock, NvM_RestoreBlockDefaults, NvM_RestorePRAMBlockDefaults):
- 应用程序需提供了一个RAM块,用于保存将被填充的NVRAM数据。
- 应用程序调用NvM模块接口向NvM模块发出读取/恢复请求。
- 发出读取/恢复请求一直到回调例程被调用期间,RAM块允许被修改。
- NvM模块调用通过NvMReadRamBlockFromNvCallback配置的例程,以便将应用程序数据与NvM的内部缓冲区进行同步。
- 应用程序可以通过回调函数的返回值向NvM模块发送数据是否复制成功的信号。如果用户自定义回调函数的返回值为E_NOT_OK,NvM模块会重新尝试配置参数NvMRepeatMirrorOperations次的操作。
多块写入请求(NvM_WriteAll):
- 应用程序需提供了一个RAM块包含了将要写入的数据。
- NvM_WriteAll由EEcuM在关机期间发出。
- 在关机序列一直到回调例程被调用期间,应用程序可以修改RAM块。
- 当回调例程被调用时,NvM_WriteAll开始处理数据块。
- NvM模块调用通过NvMReadRamBlockFromNvCallback配置的例程,以便将应用程序数据与NvM的内部缓冲区进行同步。
- 应用程序可以通过回调函数的返回值向NvM模块发送数据是否复制成功的信号。如果用户自定义回调函数的返回值为E_NOT_OK,NvM模块会重新尝试配置参数NvMRepeatMirrorOperations次的操作。
多块读取请求(NvM_ReadAll):
- 应用程序需提供了一个RAM块,用于保存将被填充的NVRAM数据。
- NvM_ReadAll由EcuM在启动期间发出。
- 启动程序启动一直到回调例程被调用期间,应用程序可以修改RAM块。
- 当回调例程被调用时,NvM_ReadAll开始处理数据块。
- NvM模块调用通过NvMReadRamBlockFromNvCallback配置的例程,以便将应用程序数据与NvM的内部缓冲区进行同步。
- 应用程序可以通过回调函数的返回值向NvM模块发送数据是否复制成功的信号。如果用户自定义回调函数的返回值为E_NOT_OK,NvM模块会重新尝试配置参数NvMRepeatMirrorOperations次的操作。