前言
存儲協議棧負責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塊和管理塊組成?;镜拇鎯ο?/span>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模塊恢復/重啟。這種行為既適用于單塊請求,也適用于多塊請求。
審核編輯:湯梓紅
評論
查看更多