存储技术
前言
存储协议栈负责ECU中非易失性数据的存储管理。存储协议栈的分享包括NVM、MemI、Ea、Fea、Eep、Fls模块的详细介绍及代码分析,具体的项目实战请关注本号的后续文章,本篇为NVRAM Manager(NVM)模块详细介绍篇。
正文
NvM模块应根据汽车环境中NV(非易失性)数据的不同需求提供服务,以确保数据的存储和维护。NvM模块应该能够管理EEPROM和/或FLASH EEPROM仿真设备的NV数据。
NvM模块为NV数据(init/read/write/control)的管理和维护提供所需的同步/异步服务。
不同块之间的关系可以在下图中可视化:
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值(可选)组成的区域。
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块的属性、错误、状态信息。
内存抽象接口,底层的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
NV块是一个基本的存储对象,表示一个由NV用户数据、CRC值(可选)和NV块报头(可选)组成的内存区域。NV Block是必须存在的模块,数据内容持久存在与flash中,可以在程序执行过程中修改,它的组成:
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的结构。
注意:这个图没有显示RAM块的物理内存布局。这里只显示逻辑集群。
由于NvM模块不支持对齐,这可以通过配置来管理,也就是说,块的长度可以通过添加填充来扩大,以满足对齐要求
ROM块是一个基本的存储对象,位于ROM (FLASH)中,用于在NV块为空或损坏时提供默认数据。
1)专门用于对NVRAM Block 与 RAM blcok 的数据安全性进行管理而设计的,它对应用层并不可见。
2)存在与RAM中,不是持久的,用于保存相应NVRAM块的属性/错误/状态信息,以及‘Dataset’类型的NVRAM块的块索引
2)结构组成
nv block,RAM block 和 Administrative Block必须存在,ROM block为可选项。包含哪些block是在配置阶段完成,相应的NVRAM block descriptor配置完成后,包含block也随之固定。
如果启用了机制静态块ID,则NV块标头应首先包含在NV块中。
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 |
NVRAM块由强制性的基本存储对象NV块、RAM块和管理块组成。基本的存储对象ROM Block是可选的。任何NVRAM块的组成在配置期间由相应的NVRAM块描述符固定。所有的地址偏移量都相对于NVRAM块描述符中的RAM或ROM的起始地址给出。假设起始地址为零。
Note:如果需要,相应的设备驱动程序将添加一个设备特定的基本地址或偏移量。
要处理的单个NVRAM块将通过NvM模块API通过提供随后分配的块ID来选择。所有与NVRAM块描述符表及其在ROM (FLASH)中的地址相关的结构都必须在NvM模块配置期间生成。
Native NVRAM block是最简单的Block形式,该类型包括1个NV Block,1个RAM Block,1个Administrative Blocks。
Redundant NVRAM block该类型包括2个NV Block,1个RAM Block,1个Administrative Blocks,通过该类型可以实现数据的冗余备份存储。
Dataset NVRAM是由多个大小相等的数据组成,APP在一次操作中获得其中的一个元素,每一个DataSet的位置可以通过Administrative Blocks获得,NvM可以读取选择的ROM Block。Dataset NVRAM类型的设计可以根据需要对一个数据在NvRAM中以一定的循环偏移进行存储,每一次存储位置可以不同,实现对NvRAM的寿命延长。
为了使NvM模块适应有限的硬件资源,需要定义三个不同的API配置类:
- API配置类3:所有指定的API调用都可用。支持最大限度的功能。
- API配置类2:一个中间的API调用集是可用的。
- API配置类1:特别是对于匹配具有非常有限的硬件资源的系统,这个API配置类只提供了在任何情况下都需要的最小的API调用集。
在API配置类1中,不支持块管理类型NVM_BLOCK_DATASET。NvM模块应该只包含处理配置的块类型所需的代码。
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模块恢复/重启。这种行为既适用于单块请求,也适用于多块请求。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !