前言
存儲(chǔ)協(xié)議棧負(fù)責(zé)ECU中非易失性數(shù)據(jù)的存儲(chǔ)管理。存儲(chǔ)協(xié)議棧的分享包括NVM、MemI、Ea、Fea、Eep、Fls模塊的詳細(xì)介紹及代碼分析,具體的項(xiàng)目實(shí)戰(zhàn)請(qǐng)關(guān)注本號(hào)的后續(xù)文章,本篇為NVRAM Manager(NVM)模塊詳細(xì)介紹篇。
?
?
?
正文
1.功能簡(jiǎn)介
NvM模塊應(yīng)根據(jù)汽車環(huán)境中NV(非易失性)數(shù)據(jù)的不同需求提供服務(wù),以確保數(shù)據(jù)的存儲(chǔ)和維護(hù)。NvM模塊應(yīng)該能夠管理EEPROM和/或FLASH EEPROM仿真設(shè)備的NV數(shù)據(jù)。
?
NvM模塊為NV數(shù)據(jù)(init/read/write/control)的管理和維護(hù)提供所需的同步/異步服務(wù)。
不同塊之間的關(guān)系可以在下圖中可視化:
?
?
?
?
2.關(guān)鍵概念
Basic Storage Object: “基本存儲(chǔ)對(duì)象”是“NVRAM塊”的最小實(shí)體。幾個(gè)“基本存儲(chǔ)對(duì)象”可以用來(lái)構(gòu)建一個(gè)NVRAM塊。一個(gè)“基本存儲(chǔ)對(duì)象”可以駐留在不同的內(nèi)存位置(RAM/ROM/NV內(nèi)存)。
?
NVRAM Block: ?NVRAM Block是管理和存儲(chǔ) NV Block所需的整個(gè)結(jié)構(gòu)。
?
NV data: 要存儲(chǔ)在Non-Volatile memory的數(shù)據(jù)。表示NV用戶數(shù)據(jù)和CRC值(可選)組成的存儲(chǔ)區(qū)。
?
Block Management Type: 這個(gè)是NVRAM Block的類型,它取決于強(qiáng)制/可選Basic Storage Object中 NVRAM Block的(可配置的)單獨(dú)組成以及該 NVRAM 塊的后續(xù)處理。
?
RAM Block: 屬于Basic Storage Object,它是NVRAM Block的一部分,常駐于RAM空間。為了應(yīng)對(duì)應(yīng)用層的快速操作,創(chuàng)建的與NV Block同樣大小的RAM空間,用于存儲(chǔ)還沒有被寫入或讀取的NV值。表示在RAM中用戶數(shù)據(jù)和CRC值(可選)組成的區(qū)域。
ROM Block: 屬于Basic Storage Object,它是NVRAM Block的一部分(可選的),常駐于ROM空間。ROM塊駐留在ROM(Data Flash)中,用于提供缺省數(shù)據(jù)以防NV塊為空或被破壞。
?
NV Block: 屬于Basic Storage Object,它是NVRAM Block的一部分(必選的),常駐于NV空間。NV Block表示NV用戶數(shù)據(jù)和CRC值(可選)組成的存儲(chǔ)區(qū)。
?
NV Block Header: 如果Static Block ID是enable的,這個(gè)作為附加信息包含在NV Block中。
?
Administrative Block: 屬于Basic Storage Object,它常駐于RAM,是NVRAM Block必選部分。Administrative Block管理塊在RAM中,包含Dataset NV塊關(guān)聯(lián)的塊索引。也包含相應(yīng)NVRAM塊的屬性、錯(cuò)誤、狀態(tài)信息。
3.功能詳解
3.1?內(nèi)存硬件抽象層Ea/Fee的尋址方案
內(nèi)存抽象接口,底層的Flash EEPROM仿真和EEPROM抽象層為NvM模塊提供了一個(gè)虛擬線性32位地址空間,該地址空間由一個(gè)16位塊號(hào)和一個(gè)16位塊地址偏移組成。
?
Note:?NvM模塊允許(理論上)最大65536個(gè)邏輯塊,每個(gè)邏輯塊(理論上)最大大小為64kbytes。
?
NvM模塊將進(jìn)一步將16bit Fee/Ea區(qū)塊號(hào)細(xì)分為以下部分:
- NV塊基數(shù)(NVM_NV_BLOCK_BASE_NUMBER),位寬為(16 -NVM_DATASET_SELECTION_BITS)
- 位寬為(NVM_DATASET_SELECTION_BITS)的數(shù)據(jù)索引
?
對(duì)冗余NVRAM塊的處理/尋址應(yīng)以與數(shù)據(jù)集NVRAM塊相同的方式對(duì)內(nèi)存硬件抽象進(jìn)行,即冗余NV塊應(yīng)通過(guò)使用配置參數(shù)NvMDatasetSelectionBits來(lái)管理。
?
FEE/EA_BLOCK_NUMBER = (NvMNvBlockBaseNumber << NvMDatasetSelectionBits)
+ DataIndex.
?
示例:
配置參數(shù)vmdatasetselectionbits配置為2。這將導(dǎo)致14位可作為配置參數(shù)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
?
有了這個(gè)配置,FEE/EA_BLOCK_NUMBER會(huì)使用前面提到的公式計(jì)算,如下面的例子所示:
?
對(duì)于NvMNvBlockBaseNumber = 2的Native NVRAM block:
-- NV block is accessed with FEE/EA_BLOCK_NUMBER = 8
8 == 2 << 2 + 0
?
對(duì)于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
?
對(duì)于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?基本存儲(chǔ)對(duì)象Basic storage objects
3.2.1?NV Block
NV塊是一個(gè)基本的存儲(chǔ)對(duì)象,表示一個(gè)由NV用戶數(shù)據(jù)、CRC值(可選)和NV塊報(bào)頭(可選)組成的內(nèi)存區(qū)域。NV Block是必須存在的模塊,數(shù)據(jù)內(nèi)容持久存在與flash中,可以在程序執(zhí)行過(guò)程中修改,它的組成:
?
?
?
3.2.2?RAM Block
RAM塊是一個(gè)基本的存儲(chǔ)對(duì)象,表示RAM中由用戶數(shù)據(jù)和(可選的)CRC值和(可選的)NV塊頭組成的區(qū)域。
?
RAM塊上CRC使用的限制。只有當(dāng)相應(yīng)的NV塊也有CRC時(shí),CRC才可用。CRC必須與相應(yīng)的NV塊的類型相同。
?
RAM塊的用戶數(shù)據(jù)區(qū)域可以駐留在與RAM塊狀態(tài)不同的RAM地址位置(全局?jǐn)?shù)據(jù)段)。
?
RAM塊的數(shù)據(jù)區(qū)域應(yīng)該可以從NVRAM管理器和應(yīng)用程序端訪問(數(shù)據(jù)從/傳遞到相應(yīng)的NV塊)。
?
RAM塊數(shù)據(jù)應(yīng)包含永久或臨時(shí)分配的用戶數(shù)據(jù)。對(duì)于永久分配的用戶數(shù)據(jù),RAM塊數(shù)據(jù)的地址在配置期間是已知的。在臨時(shí)分配用戶數(shù)據(jù)的情況下,RAM塊數(shù)據(jù)的地址在配置期間是未知的,將在運(yùn)行時(shí)傳遞給NvM模塊。
?
在沒有地址約束的情況下,可以在全局RAM區(qū)域內(nèi)分配每個(gè)RAM塊。配置的RAM塊的總數(shù)不需要位于連續(xù)的地址空間中。
?
NV數(shù)據(jù)的讀寫是相對(duì)較慢的操作,而swc task執(zhí)行時(shí)間較快,如果直接讀寫太過(guò)頻繁不可取,所以一般會(huì)使用一個(gè)同樣大小的Ram空間來(lái)操作、使用、存放這些還沒有被寫入或者讀取的NV值。
RAM Block 是NV Block在RAM中的一個(gè)映射,因?yàn)閼?yīng)用層不能直接操作NV(速度太慢),所以基本上是一個(gè)1:1的結(jié)構(gòu)。
注意:這個(gè)圖沒有顯示RAM塊的物理內(nèi)存布局。這里只顯示邏輯集群。
由于NvM模塊不支持對(duì)齊,這可以通過(guò)配置來(lái)管理,也就是說(shuō),塊的長(zhǎng)度可以通過(guò)添加填充來(lái)擴(kuò)大,以滿足對(duì)齊要求
?
3.2.3?ROM Block
ROM塊是一個(gè)基本的存儲(chǔ)對(duì)象,位于ROM (FLASH)中,用于在NV塊為空或損壞時(shí)提供默認(rèn)數(shù)據(jù)。
3.2.4?Administrative block
1)專門用于對(duì)NVRAM Block 與 RAM blcok 的數(shù)據(jù)安全性進(jìn)行管理而設(shè)計(jì)的,它對(duì)應(yīng)用層并不可見。
2)存在與RAM中,不是持久的,用于保存相應(yīng)NVRAM塊的屬性/錯(cuò)誤/狀態(tài)信息,以及‘Dataset’類型的NVRAM塊的塊索引
2)結(jié)構(gòu)組成
nv block,RAM block 和 Administrative Block必須存在,ROM block為可選項(xiàng)。包含哪些block是在配置階段完成,相應(yīng)的NVRAM block descriptor配置完成后,包含block也隨之固定。
?
3.2.5 NV Block Header
如果啟用了機(jī)制靜態(tài)塊ID,則NV塊標(biāo)頭應(yīng)首先包含在NV塊中。
?
3.3塊管理類型 Block management types
NvM數(shù)據(jù)的管理主要包括三種管理類型,分別是Native NVRAM block、redundant NVRAM block、Dataset NVRAM block。具體對(duì)各個(gè)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塊由強(qiáng)制性的基本存儲(chǔ)對(duì)象NV塊、RAM塊和管理塊組成。基本的存儲(chǔ)對(duì)象ROM Block是可選的。任何NVRAM塊的組成在配置期間由相應(yīng)的NVRAM塊描述符固定。所有的地址偏移量都相對(duì)于NVRAM塊描述符中的RAM或ROM的起始地址給出。假設(shè)起始地址為零。
?
Note:如果需要,相應(yīng)的設(shè)備驅(qū)動(dòng)程序?qū)⑻砑右粋€(gè)設(shè)備特定的基本地址或偏移量。
3.3.2 NVRAM block descriptor table
要處理的單個(gè)NVRAM塊將通過(guò)NvM模塊API通過(guò)提供隨后分配的塊ID來(lái)選擇。所有與NVRAM塊描述符表及其在ROM (FLASH)中的地址相關(guān)的結(jié)構(gòu)都必須在NvM模塊配置期間生成。
?
3.3.3Native NVRAM block
Native NVRAM block是最簡(jiǎn)單的Block形式,該類型包括1個(gè)NV Block,1個(gè)RAM Block,1個(gè)Administrative Blocks。
?
3.3.4 Redundant NVRAM block
Redundant NVRAM block該類型包括2個(gè)NV Block,1個(gè)RAM Block,1個(gè)Administrative Blocks,通過(guò)該類型可以實(shí)現(xiàn)數(shù)據(jù)的冗余備份存儲(chǔ)。
?
3.3.5 Dataset NVRAM block
Dataset NVRAM是由多個(gè)大小相等的數(shù)據(jù)組成,APP在一次操作中獲得其中的一個(gè)元素,每一個(gè)DataSet的位置可以通過(guò)Administrative Blocks獲得,NvM可以讀取選擇的ROM Block。Dataset NVRAM類型的設(shè)計(jì)可以根據(jù)需要對(duì)一個(gè)數(shù)據(jù)在NvRAM中以一定的循環(huán)偏移進(jìn)行存儲(chǔ),每一次存儲(chǔ)位置可以不同,實(shí)現(xiàn)對(duì)NvRAM的壽命延長(zhǎng)。
?
3.3.6NVRAM Manager API configuration classes
為了使NvM模塊適應(yīng)有限的硬件資源,需要定義三個(gè)不同的API配置類:
- API配置類3:所有指定的API調(diào)用都可用。支持最大限度的功能。
- API配置類2:一個(gè)中間的API調(diào)用集是可用的。
- API配置類1:特別是對(duì)于匹配具有非常有限的硬件資源的系統(tǒng),這個(gè)API配置類只提供了在任何情況下都需要的最小的API調(diào)用集。
?
在API配置類1中,不支持塊管理類型NVM_BLOCK_DATASET。NvM模塊應(yīng)該只包含處理配置的塊類型所需的代碼。
?
3.4掃描順序/優(yōu)先級(jí)方案?Scan order / priority scheme
NvM模塊應(yīng)支持基于優(yōu)先級(jí)的作業(yè)處理。
?
通過(guò)配置參數(shù)nvmjobpriority,基于優(yōu)先級(jí)的作業(yè)處理將被啟用/禁用。
?
在基于優(yōu)先級(jí)的作業(yè)處理順序的情況下,NvM模塊應(yīng)該使用兩個(gè)隊(duì)列,一個(gè)用于立即寫作業(yè)(崩潰數(shù)據(jù)),另一個(gè)用于所有其他作業(yè)(包括立即讀/擦除作業(yè))。
?
如果通過(guò)配置禁用了基于優(yōu)先級(jí)的作業(yè)處理,NvM模塊將不支持立即寫作業(yè)。在本例中,NvM模塊按FCFS(First Come, First Service)順序處理所有作業(yè)。
?
對(duì)于來(lái)自NvM_ReadAll和NvM_WriteAll的多個(gè)塊請(qǐng)求,作業(yè)隊(duì)列長(zhǎng)度應(yīng)該是一個(gè)(只有一個(gè)作業(yè)在排隊(duì))。
?
NvM模塊不能中斷由NvM_ReadAll請(qǐng)求引起的其他請(qǐng)求的任務(wù)。
?
注意:唯一的例外是具有直接優(yōu)先級(jí)的寫作業(yè),它將搶占正在運(yùn)行的讀/寫作業(yè)。被搶占的任務(wù)隨后將由NvM模塊恢復(fù)/重啟。
?
NvM模塊不能中斷來(lái)自其他請(qǐng)求的NvM_WriteAll請(qǐng)求。
?
NvM模塊應(yīng)該對(duì)正在進(jìn)行的NvM_ReadAll請(qǐng)求中請(qǐng)求的讀任務(wù)進(jìn)行排隊(duì),然后執(zhí)行它們。
?
NvM模塊應(yīng)該對(duì)正在進(jìn)行的NvM_WriteAll請(qǐng)求中請(qǐng)求的寫作業(yè)進(jìn)行排隊(duì),然后執(zhí)行它們。
?
NvM模塊應(yīng)該對(duì)正在進(jìn)行的NvM_ReadAll請(qǐng)求中請(qǐng)求的寫作業(yè)進(jìn)行排隊(duì),然后執(zhí)行它們。
?
NvM模塊應(yīng)該對(duì)正在進(jìn)行的NvM_WriteAll請(qǐng)求中請(qǐng)求的讀作業(yè)進(jìn)行排隊(duì),然后執(zhí)行它們。
?
注意:NvM_WriteAll請(qǐng)求可以通過(guò)調(diào)用NvM_CancelWriteAll來(lái)終止。在這種情況下,當(dāng)前塊被完全處理,但不再寫入其他塊
提示:它將被允許退出隊(duì)列的請(qǐng)求,如果他們成為過(guò)時(shí)的完成有關(guān)NVRAM塊。
?
被搶占的任務(wù)隨后將由NvM模塊恢復(fù)/重啟。這種行為既適用于單塊請(qǐng)求,也適用于多塊請(qǐng)求。
審核編輯:湯梓紅
評(píng)論
查看更多