先前在開始介紹Dem的時候就指出了Dem的主要任務是處理和儲存錯誤,所以我們要看一下錯誤儲存這個話題。理解錯誤儲存只需要從兩個方面著手就行,一是存哪裡,二是存什麼,三是怎麼存。

Event儲存(1)

上圖是event儲存的示例,一個儲存空間中有若干記錄條目memory entry,每個條目由若干資料組成。Dem支援多個儲存空間,他們分別是primary, user defined, mirror, permanent event memory,其中primary event memory是必須要支援的,存在不同的儲存空間中對應了UDS的DTC origin,所以要讀取某一錯誤儲存空間就需要指定真確的DTC origin,由於儲存空間是獨立的可能同一條DTC在不同的空間中的狀態不一樣。

Event儲存(1)

怎麼存我們稍後再說,現在我們看看要怎麼清除錯誤儲存,和其中一些重要配置。

如果要清除primary或者user defined的儲存中的所有DTC,所有DTC和event的UDS標誌位要重置並且要清除所有在該儲存空間中儲存的條目;但是要是在清除mirror空間中儲存的所有DTC則僅需要移除所有儲存條目。

柳夢璃:Diagnostic Event 錯誤

柳夢璃:DTC 診斷故障碼

透過上面的兩個連線,讀者可能發現一個問題,Dem並沒有要求event一定要有DTC,但是確定儲存在那個位置的引數DemMemoryDestinationRef卻屬於DTC。這就是說一個event沒有配置DTC那麼它就沒有對應的錯誤儲存空間,任何清除錯誤的操作都不能清除它。不要怕,Dem為我們貼心提供了一個引數DemClearEventsWithoutDTCEventMemoryRef,它可以關聯一個錯誤儲存空間,如果清除該錯誤儲存空間的錯誤,所有的event都會被清除。

上圖中大多數引數比較好理解,我介紹一下不太常見的引數DemClearDtcNotificationTime,該引數控制Dem在什麼時候通知應用清除DTC,配置為START在開始清除的時候通知,FINISH則在結束時通知,如果DemClearDtcNotificationFnc配置了就會呼叫該函式通知,否則就會就會呼叫Autosar提供好的介面。

DemClearDTCLimitation該引數不屬於上圖,而是屬於DemGeneral,該引數一旦配置為DEM_ONLY_CLEAR_ALL_DTCS,則僅支援清除所有DTC,這真是一個神奇的設定。

清除DTC之後所有的監控需要重新初始化,DemTriggerMonitorInitBeforeClearOk就是控制初始化的引數,該引數如果為真,Dem_ClearDTC會在監控初始化被觸發後再回復E_OK,否則回覆不受影響。

最後介紹一下DemClearEventAllowed這個回撥函式,在清除DTC之前Dem會呼叫該函式以判斷是否允許清除錯誤資訊,跟這個回撥有個DemClearEventAllowedBehavior比較有趣的引數,該引數有兩個取值DEM_ONLY_THIS_CYCLE_AND_READINESS,和DEM_NO_STATUS_BYTE_CHANGE。如果配置為前者,即使該回調不允許清除DTC,該DTC相關的UDS狀態位1 (TestFailedThisOperationCycle), 4 (TestNotCompletedSinceLastClear), 5 (TestFailedSinceLastClear), and 6 (TestNotCompletedThisOperationCycle)還是會重置,如果配置為後者UDS狀態位則維持不變。