Native NVRAM block
Native block是最基础的NvM Block,可以用来存储一个数据,可以配置长度、CRC等。
Redundant NVRAM block
Redundant block就是在Native block的基础上再加一个冗余块,当Native block失效(读取失败或CRC校验失败等)时,可以从Redundant block中恢复数据。
Redundant block中的NvMNvBlockNum要配置为2.
Dataset NVRAM block
顾名思义,Dataset是一个数据组,可以针对一个数据存储多个不同的值,同时还支持部分数据存放在NvM中,部分数据固化在ROM中。举个例子:座椅位置是RAM中的一个数据,车上的座椅位置记忆功能支持记忆四个位置的数据,这四个位置数据存放在NvM中,可以由用户修改,还有座椅最前和最后两个位置的数据是固定的,存放于ROM中,不支持修改。这种场景下就可以用Dataset这种存储方式。
Dataset类型的数据在配置的时候类型要选择NVM_BLOCK_DATASET,如下图所示,可以配置一个RAMBlock和ROMBlock,ROMBlock可以是一个数组。
注意下NvMNvBlockNum和NvMRomBlockNum这两个配置参数,NvMNvBlockNum代表NvM中存储的数据个数,可读可写,NvMRomBlockNum代表ROM中存储的数据个数,只可读,不可写,同时NvMRomBlockDataAddress 配置项中配置的ROMBlock数组的大小也要等于NvMRomBlockNum。例如:
uint32 RAMBlock_DatasetTest;
const uint32 ROMBlock_DatasetTest[2] =
{
0x11223344,
0x55667788
};
在读写数据的时候,要先调用 Std_ReturnType NvM_SetDataIndex(NvM_BlockIdType BlockId, uint8 DataIndex) 接口设置要读写的Block索引,索引是NvBlock的块在前,RomBlock的块在后。比如上图中NvMNvBlockNum配置为4,NvMRomBlockNum配置为2,那么NvBlock各个块的索引就是0-3,RomBlock两个块的索引就是4-5.
可参考下面标准中的图:
读写数据的代码举例如下:
//读
NvM_SetDataIndex(NvMConf_NvMBlockDescriptor_NvMBlock_DatasetTest, DatasetTestIndex);
NvM_ReadPRAMBlock(NvMConf_NvMBlockDescriptor_NvMBlock_DatasetTest);
//写
NvM_SetDataIndex(NvMConf_NvMBlockDescriptor_NvMBlock_DatasetTest, DatasetTestIndex);
NvM_WritePRAMBlock(NvMConf_NvMBlockDescriptor_NvMBlock_DatasetTest);
还要注意一点,Dataset类型的Block不支持NvM_ReadAll,ETAS会报错,但我在标准中好像没找到相关的描述,存疑。NvM_WriteAll是支持的。下面是ETAS生成时候的报错。
当未调用NvM_SetDataIndex API设置索引时,默认使用的是第0块。