AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一)

发布于 2023-6-1 11:27
浏览
0收藏

前言

存储协议栈负责ECU中非易失性数据的存储管理。存储协议栈的分享包括NVM、MemI、Ea、Fea、Eep、Fls模块的详细介绍及代码分析,具体的项目实战请关注本号的后续文章,本篇为NVRAM Manager(NVM)模块详细介绍篇。

​AUTOSAR存储协议栈-- EEPROM Driver模块介绍​

​AUTOSAR存储协议栈-- EEPROM Abstraction模块介绍​

​AUTOSAR存储协议栈-- Memory Abstraction Interface模块介绍​

AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一) -汽车开发者社区

正文

1.功能简介

NvM模块应根据汽车环境中NV(非易失性)数据的不同需求提供服务,以确保数据的存储和维护。NvM模块应该能够管理EEPROM和/或FLASH EEPROM仿真设备的NV数据。


NvM模块为NV数据(init/read/write/control)的管理和维护提供所需的同步/异步服务。

不同块之间的关系可以在下图中可视化:

AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一) -汽车开发者社区

2.关键概念

Basic Storage Object: “基本存储对象”是“NVRAM块”的最小实体。几个“基本存储对象”可以用来构建一个NVRAM块。一个“基本存储对象”可以驻留在不同的内存位置(RAM/ROM/NV内存)。


NVRAM Block:  NVRAM Block是管理和存储 NV Block所需的整个结构。


NV data: 要存储在Non-Volatile memory的数据。表示NV用户数据和CRC值(可选)组成的存储区。


Block Management Type: 这个是NVRAM Block的类型,它取决于强制/可选Basic Storage Object中 NVRAM Block的(可配置的)单独组成以及该 NVRAM 块的后续处理。


RAM Block: 属于Basic Storage Object,它是NVRAM Block的一部分,常驻于RAM空间。为了应对应用层的快速操作,创建的与NV Block同样大小的RAM空间,用于存储还没有被写入或读取的NV值。表示在RAM中用户数据和CRC值(可选)组成的区域。

AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一) -汽车开发者社区

ROM Block: 属于Basic Storage Object,它是NVRAM Block的一部分(可选的),常驻于ROM空间。ROM块驻留在ROM(Data Flash)中,用于提供缺省数据以防NV块为空或被破坏。


NV Block: 属于Basic Storage Object,它是NVRAM Block的一部分(必选的),常驻于NV空间。NV Block表示NV用户数据和CRC值(可选)组成的存储区。


NV Block Header: 如果Static Block ID是enable的,这个作为附加信息包含在NV Block中。


Administrative Block: 属于Basic Storage Object,它常驻于RAM,是NVRAM Block必选部分。Administrative Block管理块在RAM中,包含Dataset NV块关联的块索引。也包含相应NVRAM块的属性、错误、状态信息。

AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一) -汽车开发者社区

3.功能详解

3.1 内存硬件抽象层Ea/Fee的寻址方案

内存抽象接口,底层的Flash EEPROM仿真和EEPROM抽象层为NvM模块提供了一个虚拟线性32位地址空间,该地址空间由一个16位块号和一个16位块地址偏移组成。


Note: NvM模块允许(理论上)最大65536个逻辑块,每个逻辑块(理论上)最大大小为64kbytes。


NvM模块将进一步将16bit Fee/Ea区块号细分为以下部分:

- NV块基数(NVM_NV_BLOCK_BASE_NUMBER),位宽为(16 -NVM_DATASET_SELECTION_BITS)

- 位宽为(NVM_DATASET_SELECTION_BITS)的数据索引


对冗余NVRAM块的处理/寻址应以与数据集NVRAM块相同的方式对内存硬件抽象进行,即冗余NV块应通过使用配置参数NvMDatasetSelectionBits来管理。


FEE/EA_BLOCK_NUMBER = (NvMNvBlockBaseNumber << NvMDatasetSelectionBits)

+ DataIndex.


示例:

配置参数vmdatasetselectionbits配置为2。这将导致14位可作为配置参数nvnvblockbasenumber的范围:

-- Range of NvMNvBlockBaseNumber: 0x1..0x3FFE

-- Range of data index: 0x0..0x3(=2^NvMDatasetSelectionBits-1)

-- Range of FEE_BLOCK_NUMBER/EA_BLOCK_NUMBER: 0x4..0xFFFB


有了这个配置,FEE/EA_BLOCK_NUMBER会使用前面提到的公式计算,如下面的例子所示:


对于NvMNvBlockBaseNumber = 2的Native NVRAM block:

-- NV block is accessed with FEE/EA_BLOCK_NUMBER = 8

8 == 2 << 2 + 0


对于NvMNvBlockBaseNumber = 3的redundant NVRAM block:

-- 1st NV block with data index 0 is accessed with FEE/EA_BLOCK_NUMBER = 12.

12 == 3 << 2 +0


-- 2nd NV block with data index 1 is accessed with FEE/EA_BLOCK_NUMBER = 13.

13 == 3 << 2 + 1


对于NvMNvBlockBaseNumber = 4, NvMNvBlockNum = 3的 dataset NVRAM block:

-- NV block #0 with data index 0 is accessed with FEE/EA_BLOCK_NUMBER = 16

16 == 4 << 2 + 0


-- NV block #1 with data index 1 is accessed with FEE/EA_BLOCK_NUMBER = 17

16 == 4 << 2 + 1


-- NV block #2 with data index 2 is accessed with FEE/EA_BLOCK_NUMBER = 18

16 == 4 << 2 + 2

3.2 基本存储对象Basic storage objects

3.2.1 NV Block

NV块是一个基本的存储对象,表示一个由NV用户数据、CRC值(可选)和NV块报头(可选)组成的内存区域。NV Block是必须存在的模块,数据内容持久存在与flash中,可以在程序执行过程中修改,它的组成:

AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一) -汽车开发者社区

3.2.2 RAM Block

RAM块是一个基本的存储对象,表示RAM中由用户数据和(可选的)CRC值和(可选的)NV块头组成的区域。


RAM块上CRC使用的限制。只有当相应的NV块也有CRC时,CRC才可用。CRC必须与相应的NV块的类型相同。


RAM块的用户数据区域可以驻留在与RAM块状态不同的RAM地址位置(全局数据段)。


RAM块的数据区域应该可以从NVRAM管理器和应用程序端访问(数据从/传递到相应的NV块)。


RAM块数据应包含永久或临时分配的用户数据。对于永久分配的用户数据,RAM块数据的地址在配置期间是已知的。在临时分配用户数据的情况下,RAM块数据的地址在配置期间是未知的,将在运行时传递给NvM模块。


在没有地址约束的情况下,可以在全局RAM区域内分配每个RAM块。配置的RAM块的总数不需要位于连续的地址空间中。


NV数据的读写是相对较慢的操作,而swc task执行时间较快,如果直接读写太过频繁不可取,所以一般会使用一个同样大小的Ram空间来操作、使用、存放这些还没有被写入或者读取的NV值。


RAM Block 是NV Block在RAM中的一个映射,因为应用层不能直接操作NV(速度太慢),所以基本上是一个1:1的结构

AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一) -汽车开发者社区


注意:这个图没有显示RAM块的物理内存布局。这里只显示逻辑集群。

由于NvM模块不支持对齐,这可以通过配置来管理,也就是说,块的长度可以通过添加填充来扩大,以满足对齐要求

3.2.3 ROM Block

ROM块是一个基本的存储对象,位于ROM (FLASH)中,用于在NV块为空或损坏时提供默认数据。

3.2.4 Administrative block

1)专门用于对NVRAM Block 与 RAM blcok 的数据安全性进行管理而设计的,它对应用层并不可见。

2)存在与RAM中,不是持久的,用于保存相应NVRAM块的属性/错误/状态信息,以及‘Dataset’类型的NVRAM块的块索引

2)结构组成

nv block,RAM block 和 Administrative Block必须存在,ROM block为可选项。包含哪些block是在配置阶段完成,相应的NVRAM block descriptor配置完成后,包含block也随之固定。

3.2.5 NV Block Header

如果启用了机制静态块ID,则NV块标头应首先包含在NV块中。

AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一) -汽车开发者社区

3.3块管理类型 Block management types

NvM数据的管理主要包括三种管理类型,分别是Native NVRAM block、redundant NVRAM block、Dataset NVRAM block。具体对各个Block的使用情况如下图所示。

Block management types

NV block

RAM block

ROM block

Administrative block

NVM_BLOCK_NATIVE

1

1

0/1

1

NVM_BLOCK_REDUNDANT

2

1

0/1

1

NVM_BLOCK_DATASET

<256

1

0...n

1

3.3.1NVRAM block structure

NVRAM块由强制性的基本存储对象NV块、RAM块和管理块组成。基本的存储对象ROM Block是可选的。任何NVRAM块的组成在配置期间由相应的NVRAM块描述符固定。所有的地址偏移量都相对于NVRAM块描述符中的RAM或ROM的起始地址给出。假设起始地址为零。


Note:如果需要,相应的设备驱动程序将添加一个设备特定的基本地址或偏移量。

3.3.2 NVRAM block descriptor table

要处理的单个NVRAM块将通过NvM模块API通过提供随后分配的块ID来选择。所有与NVRAM块描述符表及其在ROM (FLASH)中的地址相关的结构都必须在NvM模块配置期间生成。

3.3.3Native NVRAM block

Native NVRAM block是最简单的Block形式,该类型包括1个NV Block,1个RAM Block,1个Administrative Blocks。

3.3.4 Redundant NVRAM block

Redundant NVRAM block该类型包括2个NV Block,1个RAM Block,1个Administrative Blocks,通过该类型可以实现数据的冗余备份存储。

AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一) -汽车开发者社区

3.3.5 Dataset NVRAM block

Dataset NVRAM是由多个大小相等的数据组成,APP在一次操作中获得其中的一个元素,每一个DataSet的位置可以通过Administrative Blocks获得,NvM可以读取选择的ROM Block。Dataset NVRAM类型的设计可以根据需要对一个数据在NvRAM中以一定的循环偏移进行存储,每一次存储位置可以不同,实现对NvRAM的寿命延长。

AUTOSAR存储协议栈-- NVRAM Manager 模块介绍(一) -汽车开发者社区

3.3.6NVRAM Manager API configuration classes

为了使NvM模块适应有限的硬件资源,需要定义三个不同的API配置类:

- API配置类3:所有指定的API调用都可用。支持最大限度的功能。

- API配置类2:一个中间的API调用集是可用的。

- API配置类1:特别是对于匹配具有非常有限的硬件资源的系统,这个API配置类只提供了在任何情况下都需要的最小的API调用集。


在API配置类1中,不支持块管理类型NVM_BLOCK_DATASET。NvM模块应该只包含处理配置的块类型所需的代码。

3.4扫描顺序/优先级方案 Scan order / priority scheme

NvM模块应支持基于优先级的作业处理。


通过配置参数nvmjobpriority,基于优先级的作业处理将被启用/禁用。


在基于优先级的作业处理顺序的情况下,NvM模块应该使用两个队列,一个用于立即写作业(崩溃数据),另一个用于所有其他作业(包括立即读/擦除作业)。


如果通过配置禁用了基于优先级的作业处理,NvM模块将不支持立即写作业。在本例中,NvM模块按FCFS(First Come, First Service)顺序处理所有作业。


对于来自NvM_ReadAll和NvM_WriteAll的多个块请求,作业队列长度应该是一个(只有一个作业在排队)。


NvM模块不能中断由NvM_ReadAll请求引起的其他请求的任务。


注意:唯一的例外是具有直接优先级的写作业,它将抢占正在运行的读/写作业。被抢占的任务随后将由NvM模块恢复/重启。


NvM模块不能中断来自其他请求的NvM_WriteAll请求。


NvM模块应该对正在进行的NvM_ReadAll请求中请求的读任务进行排队,然后执行它们。


NvM模块应该对正在进行的NvM_WriteAll请求中请求的写作业进行排队,然后执行它们。


NvM模块应该对正在进行的NvM_ReadAll请求中请求的写作业进行排队,然后执行它们。


NvM模块应该对正在进行的NvM_WriteAll请求中请求的读作业进行排队,然后执行它们。


注意:NvM_WriteAll请求可以通过调用NvM_CancelWriteAll来终止。在这种情况下,当前块被完全处理,但不再写入其他块

提示:它将被允许退出队列的请求,如果他们成为过时的完成有关NVRAM块。


被抢占的任务随后将由NvM模块恢复/重启。这种行为既适用于单块请求,也适用于多块请求。


参考文献:

1. Specification of NVRAM Manager


文章转载自公众号:汽车电子嵌入式

分类
收藏
回复
举报
回复
相关推荐