與DEM的初次見面
先來一份縮略詞的全稱解釋
Abbreviation |
Description: |
BSW |
Basic software |
ECUM |
ECU state manager |
DCM |
Diagnostic communication manager |
DEM |
Dianostic event manager |
FIM |
Function inhibition manager |
NVM |
NVRAM manager |
SWC |
Software componen |
兩份DEM相關文檔連接:
AUTOSAR_EXP_LayeredSoftwareArchitecture:
https://download.csdn.net/download/Sure_gengjia/12363653
AUTOSAR_SWS_DiagnosticEventManager.pdf:
https://download.csdn.net/download/Sure_gengjia/12363541
DEM全稱diagnostic event manager,主要是用於處理診斷事件(如檢測12伏電壓是否異常)和存儲相關數據(如擴展數據、凍結幀等)。同時也給其他模塊通過標準接口提供信息,如DCM可以通過
Dem_ReturnGetStatusOfDTCType Dem_DcmGetStatusOfDTC(
uint32 DTC,
Dem_DTCOriginType DTCOrigin,
uint8* DTCStatus)
這個標準接口同步或異步的讀取到指定的DTC的故障狀態。
下面將從以下幾個方面,感性地分享一下DEM在AUTOSAR中的規定:
- DEM與不同模塊之間的聯繫;
- DEM包括哪些子功能,這些功能又是怎麼實現的呢?
首先從架構的角度看DEM,DEM處於BSW的服務層,見圖一,與之交互的模塊有SWC、BSW、ECUM、FIM、DCM、NVM,見圖二。
圖一:mapping of basic software modules to AUTOSAR layers
圖二:dependencies of the Diagnostic Event Manager to other software modules
DEM與其他模塊間的關係:
SWC:
其中應用層SWC會週期調用故障監控函數,並週期調用標準接口Std_ReturnType Dem_SetEventStatus(
Dem_EventIdType EventId,
Dem_EventStatusType EventStatus)
把故障及狀態報給DEM,DEM會根據預先配置的debounce方式調用相對應的函數。然後根據debounce的結果決定是否把當前故障加入到fault memory中和觸發FIM。該內容的詳細介紹在DEM與其他模塊的聯繫章節的SWC部分和DEM內部模塊的debounce部分會涉及到。
BSW:
BSW也會給DEM報故障,根據AUTOSAR規定,BSW通過調用
void Dem_ReportErrorStatus(
Dem_EventIdType EventId,
Dem_EventStatusType EventStatus)
標準接口給DEM報故障,故障內容如NVM寫入失敗或者排隊任務數溢出或者校驗錯誤。該類故障在DEM中的debounce方式是no debounce,不需要debounce,所以故障狀態只有DEM_EVENT_STATUS_FAILED或者DEM_EVENT_STATUS_PASSED。
ECUM:
ECUM主要負責在不同時序調用DEM的初始化工作,
DEM初始化應包括
- 對每個故障的debounce status做處理;
- 初始化fault memory相關數據;
- 初始化DEM中存儲的BSW的故障數據。
FIM:
FIM全稱function inhibition manager,主要負責給SWC提供一個控制機制,可以使能或者失能SWC的功能,如SWC中電壓檢測功能,此時由於其該功能被抑制,SWC此時使用Dem_SetEventStatus報給DEM的故障狀態是no condition。
另外在SWC調用Dem_SetEventStatus時,如果故障狀態發生變化,DEM會通過調用
void FiM_DemTriggerOnEventStatus(
Dem_EventIdType EventId,
Dem_UdsStatusByteType EventStatusByteOld,
Dem_UdsStatusByteType EventStatusByteNew )
來抑制SWC本身的功能和與之相關的事件的功能。詳細內容請期待FIM模塊的分享。
DCM:
DCM和DEM之前有着密切關係,因爲DCM中有ReadDTCInformation和ClearDiagnosticInformation這兩個服務都是都是要從DEM中讀取信息或者傳遞命令,還有PID01請求當前動力診斷數據等服務。比如根據DTC讀凍結幀(也叫快照)(19 04 xx xx xx yy),在19服務的自服務的處理函數裏面,首先就要調用
Dem_ReturnGetStatusOfDTCType Dem_DcmGetStatusOfDTC(
uint32 DTC,
Dem_DTCOriginType DTCOrigin,
uint8* DTCStatus)
給DEM傳遞DTC和該DTC所屬的memory類型,來獲得DTCStatus;然後調用
Dem_ReturnGetSizeOfDataByDTCType Dem_DcmGetSizeOfFreezeFrameByDTC(
uint32 DTC,
Dem_DTCOriginType DTCOrigin,
uint8 RecordNumber,
uint16* SizeOfFreezeFrame)
獲得凍結幀(快照)的數據大小,因爲數據大小和數據內容是提前配置好的,也可標定。最後調用
Dem_ReturnGetFreezeFrameDataByDTCType Dem_DcmGetFreezeFrameDataByDTC(
uint32 DTC,
Dem_DTCOriginType DTCOrigin,
uint8 RecordNumber,
uint8* DestBuffer,
uint16* BufSize)
獲取凍結幀。但是DCM和DEM是兩個不同的任務,所以以上幾個函數一般是異步執行,DCM只負責把請求命令和寫入目標給到DEM,在DEM任務中輪詢DCM的任務請求,並實現數據的填充,後通知DCM任務完成。DCM再通過肯定相應回覆數據。
NVM
NVM之於DEM主要在於存儲啦,NVM也就是NVRAM manager,司職於非易失性數據的存儲和維護。而DEM中又有大量數據需要存儲在非易失性存儲模塊(如Dflash、EEPROM)中,但兩者的交互關係都發生在上電初始化(startup)和下電(shutdown)過程中,當然,如果沒有NvM_WriteAll的過程,也可以在運行過程中寫入。
DEM需要存儲在非易失性存儲模塊的數據包括19服務中會用的相關數據(如第一次出現的故障,第一個confirm的故障、最新的故障等等)、primary fault memory中的數據、mirror memory中的故障、OBD相關的數據、凍結幀、預存的數據、Debounce的狀態(甚至是debounce counter)等,這些數據會在NVM_Readall的時候讀取到DEM的RAM中,下電的時候會在NVM的writeall時從DEM的target RAM寫入非易失性存儲區(non-volatile memory)。
DEM內部分很多子模塊,每個子模塊分工不同,任務明確。INIT負責對DEM內部變量根據配置內容進行初始化。debounce負責對事件發生故障的有效性和事件表現正常的有效性的做濾波判斷,如KL30電電壓超過16伏100ms,該事件纔會報KL30過壓故障;primary fault memory負責存儲當前發生的故障的DTC及相關數據,如凍結幀、擴展數據等。operational cycle management負責管理各種操作循環的判斷,如對於OBD-related ECU中OBD drving cycle開啓時才能故障狀態才能進入confirm的狀態,這也和項目配置有關;其它子模塊及以上模塊詳細內容,敬請期待下一次的分享——DEM子模塊詳細分析。
更多內容,可關注公衆號“激活未來”。