前言
存储协议栈负责ECU中非易失性数据的存储管理。存储协议栈的分享包括NVM、MemI、Ea、Fea、Eep、Fls模块的详细介绍及代码分析,具体的项目实战请关注本号的后续文章,本篇为NVRAM Manager(NVM)模块详细介绍篇。
正文
1.功能简介NvM模块应根据汽车环境中NV(非易失性)数据的不同需求提供服务,以确保数据的存储和维护。NvM模块应该能够管理EEPROM和/或FLASH EEPROM仿真设备的NV数据。
NvM模块为NV数据(init/read/write/control)的管理和维护提供所需的同步/异步服务。
不同块之间的关系可以在下图中可视化:
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值(可选)组成的区域。
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块的属性、错误、状态信息。
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中,可以在程序执行过程中修改,它的组成:
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的结构。
注意:这个图没有显示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块中。
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,通过该类型可以实现数据的冗余备份存储。
3.3.5 Dataset NVRAM block
Dataset NVRAM是由多个大小相等的数据组成,APP在一次 *** 作中获得其中的一个元素,每一个DataSet的位置可以通过Administrative Blocks获得,NvM可以读取选择的ROM Block。Dataset 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_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模块恢复/重启。这种行为既适用于单块请求,也适用于多块请求。
审核编辑:汤梓红
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)