AUTOSAR中的NvM看起來挺難的,特別是在配置的時候,一堆參數(shù),都不知道是干什么用的。想去研究它,卻不知如何下手。
其實吧,AUTOSAR的官方文檔講的挺詳細的,但是內容很多,網上有很多文章對其進行解讀,很多人沒時間也不想細讀它。
本文打算換個討論,不再累述其內容細節(jié)了,而通過圖解的方式,將NvM重要特點提取出來講解,方便理解,也方便記憶。
1.NvM在AUTOSAR中的層次結構
AUTOSAR中有個Memory的處理,在架構中是這樣的分類三層,分別是Memory Service(NvM)、Memory Hardware Abstraction(Memory If和Fee/Ea)和Memory Driver(Fls/Eep驅動),單獨拎出來就是這樣的 這部分在架構中有這樣的接口關系回到Nvm,這個NVM即Non-VolatileRAM Manager (NVRAM Manager),用于管理存儲于各類non-volatile memory(如EEPROM/Flash等)的數(shù)據。
NVM在AUTOSAR中是獨立于硬件的,通過底層接口訪問外部EEPROM或模擬成EEPROM的DataFlash。為了適用于所有的車載系統(tǒng),其具有高度可擴展性和可靠性。
2.Memory抽象層空間尋址策略
AUTOSAR中的Memory是怎么尋址的呢?
其實,MemoryAbstraction Interface為底層EEPROM/FEE提供32位地址空間,像這樣
這個虛擬的邏輯地址是包含著一些信息的,如NV Block number和Dataset index,還有Block address offset等,他們的關系可以通過以下公式來理解
FEE/EA_BLOCK_NUMBER=(NvMNvBlockBaseNumber << NvMDatasetSelectionBits) + DataIndex
舉個例子,假如NVM_DATASET_SELECTION_BITS配置為4bits,那么就有14bits留給blocknumber,因此可以分最大有16個dataset。
3.NvM Basic Storage Object
以上提到的Dataset、NV Block等概念,是不是容易混淆,也不清楚是干什么用的?好了,下面做個匯總和介紹。
名稱 |
描述 |
Basic Storage Object |
Basic Storage Object是一個最小的NVRAM block,多個Basic Storage Objects可以組成一個NVRAM Block。 |
NVRAM Block |
NVRAM Block是管理和存儲 NV Block所需的整個結構 |
NV data |
要存儲在Non-Volatile memory的數(shù)據 |
Block Management Type |
這個是NVRAM Block的類型,它取決于強制/可選Basic Storage Object中 NVRAM Block的(可配置的)單獨組成以及該 NVRAM 塊的后續(xù)處理。 |
RAM Block |
屬于Basic Storage Object,它是NVRAM Block的一部分,常駐于RAM空間。 |
ROM Block |
屬于Basic Storage Object,它是NVRAM Block的一部分(可選的),常駐于ROM空間。 |
NV Block |
屬于Basic Storage Object,它是NVRAM Block的一部分(必選的),常駐于NV空間。 |
NV Block Header |
如果Static Block ID是enable的,這個作為附加信息包含在NV Block中。 |
Administrative Block |
屬于Basic Storage Object,它常駐于RAM,是NVRAM Block必選部分。 |
用一個圖來表達就是這樣的
圖上得這幾個block,用圖示來看可能會更容易理解
4.NvM Block Management Type
NVM在AUTOSAR中的功能是挺完善的,要滿足車載系統(tǒng)的各種需求,例如數(shù)據塊錯了怎么辦等等,都考慮周全。
NvM支持三種類型實現(xiàn):Native、Redundant和Dataset。那么這三種類型是怎樣的呢?
我做了個表,他們包含了哪幾種block
NV Block |
RAM Block |
ROM Block |
Administrator Block |
|
Native |
1 |
1 |
0..1 |
1 |
Redundant |
2 |
1 |
0..1 |
1 |
Dataset |
1..255 |
1 |
0..n |
1 |
-
Native
這種最簡單,平時大多情況下,我們用的就是這種它包含就簡單的NV Block,其他如Header和CRC都是隨意可選配置。
-
Redundant
這種就復雜一點點,可以簡單理解為雙備份,意思是,如有一份數(shù)據錯了,可以用備份的那塊。
-
Dataset
Dataset呢,這個不是多備份哈,而是針對不同配置做了對應。例如一個車系統(tǒng)平臺有很多種配置,但有想集成在同一個軟件種,那么就有很多個對應的配置數(shù)據,在運行的時候根據配置參數(shù)選擇哪份數(shù)據使用。
5.NVRAM Manager API 配置類
講到NvM的API,其實NvM API分三類:
Class3:所有指定的API調用都可用,最多支持功能。
Class2:有一組中間API調用可用。
Class1:特別是對于硬件資源非常有限的匹配系統(tǒng),此API配置類僅提供最少的一組
Class 3 包含下面這些API:
Type 1:
- NvM_SetDataIndex(...)
- NvM_GetDataIndex(...)
- NvM_SetBlockProtection(...)
- NvM_GetErrorStatus(...)
- NvM_SetRamBlockStatus(...)
- NvM_SetBlockLockStatus
Type 2:
- NvM_ReadBlock(...)
- NvM_WriteBlock(...)
- NvM_RestoreBlockDefaults(...)
- NvM_EraseNvBlock(...)
- NvM_InvalidateNvBlock(...)
- NvM_CancelJobs(…)
- NvM_ReadPRAMBlock(...)
- NvM_WritePRAMBlock(...)
- NvM_RestorePRAMBlockDefaults(...)
Type 3:
- NvM_ReadAll(...)
- NvM_WriteAll(...)
- NvM_CancelWriteAll(...)
- NvM_ValidateAll(...)
Type 4:
- NvM_Init(...)
Class 2 包含下面這些API:
Type 1:
- NvM_SetDataIndex(...)
- NvM_GetDataIndex(...)
- NvM_GetErrorStatus(...)
- NvM_SetRamBlockStatus(...)
- NvM_SetBlockLockStatus
Type 2:
- NvM_ReadBlock(...)
- NvM_WriteBlock(...)
- NvM_RestoreBlockDefaults(...)
- NvM_CancelJobs(…)
- NvM_ReadPRAMBlock(...)
- NvM_WritePRAMBlock(...)
- NvM_RestorePRAMBlockDefaults(...)
Type 3:
- NvM_ReadAll(...)
- NvM_WriteAll(...)
- NvM_CancelWriteAll(...)
- NvM_ValidatedAll(...)
Type 4:
- NvM_Init(...)
Class 1 包含下面這些API:
Type 1:
- NvM_GetErrorStatus(...)
- NvM_SetRamBlockStatus(...)
- NvM_SetBlockLockStatus
Type 2:
- --
Type 3:
- NvM_ReadAll(...)
- NvM_WriteAll(...)
- NvM_CancelWriteAll(...)
Type 4:
- NvM_Init(...)
也許你會好奇,上面提到的Type是啥?
其實是根據功能分類而已,可以參考下表內容
Request Types |
Characteristics of Request Types |
Type 1: - NvM_SetDataIndex (...) - NvM_GetDataIndex (...) - NvM_SetBlockProtection (...) - NvM_GetErrorStatus(...) - NvM_SetRamBlockStatus(...) |
n同步請求 n作用于一個RAM Block n適用于所有SWC |
Type 2: - NvM_ReadBlock(...) - NvM_WriteBlock(...) - NvM_RestoreBlockDefaults(...) - NvM_EraseNvBlock(...) - NvM_InvalidateNvBlock(...) - NvM_CancelJobs(…) - NvM_ReadPRAMBlock(...) - NvM_WritePRAMBlock(...) - NvM_RestorePRAMBlockDefaults(...) |
n異步請求(通過callback或polling返回結果) n作用于一個NVRAM Block n通過NVRAM manager task處理 n適用于所有SWC
|
Type 3: - NvM_ReadAll(...) - NvM_WriteAll(...) - NvM_CancelWriteAll(...) - NvM_ValidateAll(...) |
n異步請求(通過callback或polling返回結果 n作用于具有常駐RAM data的NVRAM Block
|
Type 4: - NvM_Init(...) |
n同步請求 n基本初始化 n通過函數(shù)本身內部的命令接口向任務發(fā)出成功信號 |
6. NvM Descriptor Table
以上講的都是一些原理或者配置上的東西,那么在軟件代碼上是怎么用的呢,其實用到了一個描述符表(Descriptor Table),即將所有的配置信息映射或囊括到這里面來,那么這個表是怎樣的?
AUTOSAR的配置策略,要將所有和NVRAM 描述符相關的內容在配置期間生成,生成的內容包含以下信息。
SWS Item |
Items |
Type |
ECUC_NvM_00476 |
NvMBlockCrcType |
EcucEnumerationParamDef |
ECUC_NvM_00554 |
NvMBlockHeaderInclude |
EcucStringParamDef |
ECUC_NvM_00477 |
NvMBlockJobPriority |
EcucIntegerParamDef |
ECUC_NvM_00062 |
NvMBlockManagementType |
EcucEnumerationParamDef |
ECUC_NvM_00557 |
NvMBlockUseAutoValidation |
EcucBooleanParamDef |
ECUC_NvM_00556 |
NvMBlockUseCRCCompMechanism |
EcucBooleanParamDef |
ECUC_NvM_00036 |
NvMBlockUseCrc |
EcucBooleanParamDef |
ECUC_NvM_00552 |
NvMBlockUseSetRamBlockStatus |
EcucBooleanParamDef |
ECUC_NvM_00519 |
NvMBlockUseSyncMechanism |
EcucBooleanParamDef |
ECUC_NvM_00033 |
NvMBlockWriteProt |
EcucBooleanParamDef |
ECUC_NvM_00551 |
NvMBswMBlockStatusInformation |
EcucBooleanParamDef |
ECUC_NvM_00119 |
NvMCalcRamBlockCrc |
EcucBooleanParamDef |
ECUC_NvM_00116 |
NvMInitBlockCallback |
EcucFunctionNameDef |
ECUC_NvM_00533 |
NvMMaxNumOfReadRetries |
EcucIntegerParamDef |
ECUC_NvM_00499 |
NvMMaxNumOfWriteRetries |
EcucIntegerParamDef |
ECUC_NvM_00478 |
NvMNvBlockBaseNumber |
EcucIntegerParamDef |
ECUC_NvM_00479 |
NvMNvBlockLength |
EcucIntegerParamDef |
ECUC_NvM_00480 |
NvMNvBlockNum |
EcucIntegerParamDef |
ECUC_NvM_00481 |
NvMNvramBlockIdentifier |
EcucIntegerParamDef |
ECUC_NvM_00035 |
NvMNvramDeviceId |
EcucIntegerParamDef |
ECUC_NvM_00482 |
NvMRamBlockDataAddress |
EcucStringParamDef |
ECUC_NvM_00521 |
NvMReadRamBlockFromNvCallback |
EcucFunctionNameDef |
ECUC_NvM_00483 |
NvMResistantToChangedSw |
EcucBooleanParamDef |
ECUC_NvM_00484 |
NvMRomBlockDataAddress |
EcucStringParamDef |
ECUC_NvM_00485 |
NvMRomBlockNum |
EcucIntegerParamDef |
ECUC_NvM_00117 |
NvMSelectBlockForReadAll |
EcucBooleanParamDef |
ECUC_NvM_00549 |
NvMSelectBlockForWriteAll |
EcucBooleanParamDef |
ECUC_NvM_00506 |
NvMSingleBlockCallback |
EcucFunctionNameDef |
ECUC_NvM_00532 |
NvMStaticBlockIDCheck |
EcucBooleanParamDef |
ECUC_NvM_00072 |
NvMWriteBlockOnce |
EcucBooleanParamDef |
ECUC_NvM_00520 |
NvMWriteRamBlockToNvCallback |
EcucFunctionNameDef |
ECUC_NvM_00534 |
NvMWriteVerification |
EcucBooleanParamDef |
ECUC_NvM_00538 |
NvMWriteVerificationDataSize |
EcucIntegerParamDef |
這個最好對著代碼去看更好理解。
7. 總結
以上講得內容都不是很深入,適合剛入手的小伙伴學習,我將以上內容做成了一份備查手冊,方便以后看代碼或者閱讀文檔的時候,可以直接查看,不用費神看那么多雞腸文英語。
審核編輯 :李倩
-
AUTOSAR
+關注
關注
10文章
339瀏覽量
21360 -
車載系統(tǒng)
+關注
關注
1文章
131瀏覽量
27079
原文標題:一圖讀懂AUTOSAR NvM(附pdf版文檔資源)
文章出處:【微信號:embedded_sw,微信公眾號:嵌入式軟件實戰(zhàn)派】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論