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塊。