前言
前面的文章我們詳細分析了NvM,Fee,Fls模塊以及NvM User和NvM的交互,對AUTOSAR架構下的存儲協議棧應該有了一個比較深入的了解了。回頭來看,站在NvM使用者的角度來看最關心的是如何使用NvM存儲服務,以及使用過程中出現Error后如何快速定位和分析問題。NvM服務的使用可以參考<
縮略詞:
簡寫 | 全稱 |
DMU | Data Memory Unit |
Fls | Flash |
OPER | Flash Operation Error |
SQER | Command Sequence Error |
EVER | Erase Verify Error |
注:本公眾號文章中使用了一些第三方工具和文檔,若有侵權,請聯系作者刪除!
參考文檔:
1.AURIXTC3XX_um_part1_v2.0.pdf
2. Specification of Flash EEPROM Emulation
3. Specification of Flash Driver
4.Specification of NVRAM Manager AUTOSAR CP Release 4.3.1
5.AUTOSAR架構下NVM Block連續寫及Default Value問題分析
6.AUTOSAR架構下NvM模塊詳細分析
7.AUTOSAR架構下Fee詳細分析
8.TC37x芯片FLASH基本概念介紹
9.AUTOSAR架構下Fls詳細分析
10.TC3xx芯片DMU介紹
正文
1.Error自定向上分析
由于從NvM User的存儲服務請求正向自定向下分析Error發生的條件和流轉十分困難,我們采用自底向上的方法從底層已知Error出發向上分析Error的流轉,也就是:Fls已知Error àFeeàNvMàNvM User
如下表所示,我們把自底向上分析的結果以表格的形式統計出來,通過這種方式,NvM User就能從JobResult結果查找NvM,Fee,Fls報了什么錯誤,也就能采用對應的應對措施。
Note:
1.該表格僅把NvM最常用的服務(讀,寫,擦除)可能產生的Error統計進去,像NvMCancell這類的不常用服務沒有統計進去。
2.NvM除了底層上報的錯誤外,本身還有很多Error處理機制,比如,調用底層接口的返回值判斷等,這里錯誤也沒有統計進去,也就是我們僅僅把NvM DMU上報的錯誤統計出來
3.DMU上報的Error的原因,以及對應軟件的處理辦法可以查看數據手冊獲得。具體請參考: <<TC3xx芯片DMU介紹>>
NvM User | NvM | Fee | Fls |
NvM User可以通過Block Callback獲取NvM Job請求的結果, 然后根據結果執行對應的策略 |
NvM調用NvM Block配置的Callback函數JobEndCbkExtFunc_pt,傳入的JobResult為NVM_REQ_NOT_OK NvM_CurrentBlockInfo_t.LastResult_t = NVM_REQ_NOT_OK |
Fee在處理Write任務時會調用Fls的Compare接口對比寫入DFlash的數據和RAM緩存的數據,如果出現錯誤,Fee會調用NvM_JobErrorNotification Fls調用Fee_JobErrorNotification, Fee_JobErrorNotication調用FeeNvmIllegalStateNotification FeeJobResult == MEMIF_BLOCK_FAILED Note: FeeNvmIllegalStateNotification是一個Callout函數,由User實現 |
Fls執行Compare任務時發生錯誤,調用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_INCONSISTENT Note: 寫入Flash的數據和RAM緩存的數據不一致 |
Fls調用Fee_JobErrorNotification, Fee_JobErrorNotification調用NvM_JobErrorNotification FeeJobResult == MEMIF_BLOCK_FAILED |
Fls擦寫過程中發生了超時,調用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_FAILED Note: 監控擦寫任務執行的時間,超時就會報錯 |
||
Fls擦除過程中發生錯誤,調用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_FAILED Note: 發生OPER, EVER, SQER |
|||
Fls寫數據過程發生錯誤,調用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_FAILED Note: 發生OPER, PVER, SQER錯誤 |
|||
Fls讀數據過程發生錯誤,調用Fee_JobErrorNotification FlsJobResult == MEMIF_BLOCK_FAILED Note: 開啟了ECC_ERROR檢查,如果發生了ECC錯誤就會報錯 |
|||
NvM調用NvM Block配置的Callback函數JobEndCbkExtFunc_pt,傳入的JobResult為NVM_REQ_INTEGRITY_FAILED NvM_CurrentBlockInfo_t.LastResult_t = NVM_REQ_INTEGRITY_FAILED |
Fee在處理Read任務時發現數據不一致(比如,Block重來沒有被寫過)就會調用NvM_JobErrorNotification FeeJobResult == MEMIF_BLOCK_INCONSISTENT |
||
NvM調用NvM Block配置的Callback函數JobEndCbkExtFunc_pt,傳入的JobResult為NVM_REQ_NV_INVALIDATED NvM_CurrentBlockInfo_t.LastResult_t = NVM_REQ_NV_INVALIDATED |
Fee在處理Read任務時發現數據是無效的就會調用NvM_JobErrorNotification FeeJobResult == MEMIF_BLOCK_INVALID |
||
NvM調用NvM Block配置的Callback函數JobEndCbkExtFunc_pt,傳入的JobResult為NVM_REQ_NOT_OK NvM_CurrentBlockInfo_t.LastResult_t = NVM_REQ_NOT_OK |
Fee在處理寫任務時發現寫的次數已經超過該Block配置的最大寫次數了就會調用NvM_JobErrorNotification FeeJobResult == MEMIF_BLOCK_FAILED |
2.數據INTEGRITY_FAILED錯誤示例
我們把TC3xx芯片的DFlash都擦除掉,然后通過仿真器執行重啟。
Fee在處理Read任務時發現數據不一致(Block沒有被寫過),Fee_MainFunction會調用
NvM_JobErrorNotification通知到上層的NvM模塊。
如果對應的NvM Block配置了Callback函數,NvM模塊就會調用該Block的Callback函數通知到NvM_User,這樣NvM User就能知道當前NvM Block的狀態。
3. 總結
本文自底向上分析了存儲協議棧的Error流轉過程,通過本文總結的Error流轉表格,我們可以方便的查找DMU操作出問題的可能原因。但是,對于NvM模塊本身的一些邏輯狀態上報的Error,這個表格沒有統計,感興趣的朋友可以自己再去研究。
審核編輯:彭菁
-
存儲
+關注
關注
13文章
4338瀏覽量
86003 -
軟件
+關注
關注
69文章
4987瀏覽量
87822 -
NVM
+關注
關注
1文章
41瀏覽量
19141 -
協議棧
+關注
關注
2文章
144瀏覽量
33669
原文標題:AUTOSAR架構下存儲協議棧Error問題自底向上分析
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論