NVRAM Manager(NVM)模块详细介绍

存储技术

609人已加入

描述

 

前言

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

 

NVRAM

 

 

正文

1.功能简介

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

 

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

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

NVRAM

 

 

 

 

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 ObjectNVRAM Block的(可配置的)单独组成以及该 NVRAM 块的后续处理。

 

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

NVRAM

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

 

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

 

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

 

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

NVRAM

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 = 2Native NVRAM block:

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

8 == 2 << 2 + 0

 

对于NvMNvBlockBaseNumber = 3redundant 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 = 3dataset 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中,可以在程序执行过程中修改,它的组成:

 

 

 

NVRAM

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 BlockRAM中的一个映射,因为应用层不能直接操作NV(速度太慢),所以基本上是一个1:1的结构

NVRAM

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

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

 

3.2.3 ROM Block

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

NVRAM

3.2.4 Administrative block

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

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

2)结构组成

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

 

3.2.5 NV Block Header

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

NVRAM

 

3.3块管理类型 Block management types

NvM数据的管理主要包括三种管理类型,分别是Native NVRAM blockredundant NVRAM blockDataset 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块描述符中的RAMROM的起始地址给出。假设起始地址为零。

 

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形式,该类型包括1NV Block1RAM Block1Administrative Blocks

 

3.3.4 Redundant NVRAM block

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

NVRAM

 

3.3.5 Dataset NVRAM block

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

NVRAM

 

3.3.6NVRAM Manager API configuration classes

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

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

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

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

 

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

 

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

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

 

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

 

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

 

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

 

对于来自NvM_ReadAllNvM_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模块恢复/重启。这种行为既适用于单块请求,也适用于多块请求。

  审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分