MemIf
和所有的抽象層作用差不多,MemIf把Driver層的模塊抽象出來提供給上層使用,具體層級結構如下:
NvM調用MemIf提供的標準接口,例如MemIf_ReadWrite等;在MemIf根據已配置的抽象驅動模塊(FeeEA)分別調用不同的API,實際舉例如下:
根據標準,Fee或者Ea又會調用MeeAcc提供的接口去訪問不同的Flash驅動。
我們以Vector的實際代碼為例,在MemIf層配置提供的接口如下:
/**-- MemHwA Function Pointers --**/ CONST(MemIf_MemHwAApi_Type, MEMIF_CONST) MemIf_MemHwaApis[MEMIF_NUMBER_OF_DEVICES] = { /* Fee_30_SmallSector */ { Fee_30_SmallSector_Read, MemIf_Fee_30_SmallSector_WriteWrapper, Fee_30_SmallSector_EraseImmediateBlock, Fee_30_SmallSector_InvalidateBlock, Fee_30_SmallSector_Cancel, Fee_30_SmallSector_GetStatus, Fee_30_SmallSector_GetJobResult, Fee_30_SmallSector_SetMode } };
在Fee層級配置的Flash驅動接口如下:
/* FLS API pointer table */ CONST(Fee_30_SmallSector_FlsApiType, FEE_30_SMALLSECTOR_PRIVATE_CONST) Fee_30_SmallSector_FlsApi0 = { /* Read Service */ Fls_Read, /* Write Service */ Fls_Write, /* Compare Service */ Fls_Compare, /* Erase Service */ Fls_Erase, /* Blank Check Service */ Fls_BlankCheck, /* Get Status Service */ Fls_GetStatus, /* Get Job Result Service */ Fls_GetJobResult };
發現沒有,這一層的API并沒有MemAccM相關的接口,所以雖然規范定義了這樣的層級結構,但是在實現上有多種可能,簡單有效才是硬道理。
Fee
之所以在車規MCU里需要提供這樣的機制,主要還是為了節約成本,提供數據的高效、實時存儲,滿足車規對于Data Flash百萬次刷寫的要求。
在AUTOSAR的規范里,也提供了這樣類似的示例機制來提高DFlash的使用壽命:
在該示例中,共計有1500Bytes數據需要管理,這些數據被均勻分成10個Block;當Fee發現某個Block數據更改并且需要重新編程的時候,他會找到目前空閑的Flash空間把數據寫進Flash并設置有效。需要注意的是,在設計Fee驅動時,需要考慮到Flash IP支持的最小可擦除單位和最小可編程單位,只要熟悉IP特性,才能做好Flash磨損均衡算法。
小結
NvM的狀態機每家供應商的代碼區別還是挺大的,不過我們在看代碼的時候首先需要了解這些API的調用時序,如下圖為用戶調用NvM_Write服務的時序圖:
熟讀AUTOSAR NV Data Handling Guideline,才能更好理解代碼,必要時自己畫一個狀態遷移圖。
來源:汽車MCU軟件設計
審核編輯:湯梓紅
-
接口
+關注
關注
33文章
8943瀏覽量
153202 -
存儲
+關注
關注
13文章
4504瀏覽量
87068 -
AUTOSAR
+關注
關注
10文章
371瀏覽量
22400 -
代碼
+關注
關注
30文章
4886瀏覽量
70257
原文標題:AUTOSAR 存儲棧分析--MemIfFee
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
存儲協議棧的Error流轉過程分析

AUTOSAR是什么
AUTOSAR的相關資料推薦
如何用eBPF優化內存存儲功能
AUTOSAR中通信協議棧配置詳解

AUTOSAR經典平臺介紹

AUTOSAR平臺研究報告:國產基礎軟件+芯片全棧方案加快量產

評論