前言
最近的項目負責網(wǎng)絡(luò)管理部分,網(wǎng)路喚醒和ECU系統(tǒng)的休眠關(guān)系緊密,對系統(tǒng)的喚醒源事件感覺理解的不是很透徹,今天就來理一理AUTOSAR架構(gòu)下的喚醒源事件。本文就先介紹AUTOSAR架構(gòu)下EcuM模塊管理的喚醒源事件,然后介紹每一個和喚醒源相關(guān)的接口函數(shù)及其適用場景,然后回答以下幾個問題:
1.喚醒源有哪幾種狀態(tài),每個狀態(tài)之間是怎么切換的?
2.喚醒源會影響系統(tǒng)的下電/休眠流程嗎?
3.斷電系統(tǒng),喚醒后沒有Wakeup Sequences, 有 Wakeup validation sequence么?
正文
1.喚醒源狀態(tài)
EcuM模塊管理所有的喚醒源,每個喚醒源有四個狀態(tài):ECUM_WKSTATUS_NONE,ECUM_WKSTATUS_PENDING,ECUM_WKSTATUS_VALIDATED, ECUM_WKSTATUS_EXPIRED。ECU上電后(復位后)每個喚醒源處于ECUM_WKSTATUS_NONE狀態(tài)。
從上圖可以看出,喚醒源的每次狀態(tài)切換都需要通過BswM_EcuM_CurrentWakeup接口通知到BswM模塊。
ECUM_WKSTATUS_NONE切換到ECUM_WKSTATUS_PENDING或ECUM_WKSTATUS_VALIDATED狀態(tài):
喚醒源事件可以通過底層的AUTOSAR標準模塊(如:Can Transceiver等)主動上報(需要配置Transceiver的喚醒源檢測功能),也可以通過手寫模塊來輪詢檢測上報(不配置AUTOSAR標準模塊的喚醒檢測功能,全部統(tǒng)一由手寫模塊來管理)。無論是配置還是手寫模塊,統(tǒng)一使用EcuM_SetWakeupEvent接口上報喚醒源事件,EcuM模塊根據(jù)該喚醒源是否配置了校驗切換喚醒狀態(tài)從ECUM_WKSTATUS_NONE切換到ECUM_WKSTATUS_PENDING或ECUM_WKSTATUS_VALIDATED狀態(tài)。
ECUM_WKSTATUS_PENDING狀態(tài)切換到ECUM_WKSTATUS_VALIDATED狀態(tài):
背景知識1:本地(如IGN硬線)喚醒源喚醒一般不配置(在EcuM模塊中配置)喚醒源的校驗(Validation),遠程網(wǎng)絡(luò)(如Can喚醒)喚醒源一般配置喚醒源檢驗。CAN網(wǎng)絡(luò)喚醒需要配置CanTrcv和CanIf模塊,且一般配置只有收到NM網(wǎng)絡(luò)管理報文喚醒,也就是說,只有收到NM網(wǎng)絡(luò)管理報文后CanIf才會設(shè)置一個有效喚醒源的標志Flag,EcuM的輪詢檢測可以通過CanIf_CheckValidation讀取喚醒標致。
背景知識2:想分析喚醒事件是不是有效的總線喚醒源(網(wǎng)絡(luò)管理報文),需要Ecu有正常的收發(fā)報文能力,想要收發(fā)報文,Transceiver和Controller兩個模塊均需要啟動。一般來講,Transceiver會在程序初始化時進入正常的工作模式,而Controller進入正常的工作模式是EcuM調(diào)用EcuM_StartWakeupSources的結(jié)果,而該接口為Callout函數(shù),內(nèi)部功能自定義實現(xiàn),一般在EcuM_StartWakeupSources中調(diào)用CanSM_StartWakeupSource,CanSM模塊會開啟Can Controller。也就是說,在EcuM模塊調(diào)用CanIf_CheckValidation校驗喚醒源事件前,需要先調(diào)用EcuM_StartWakeupSources。
EcuM的Mainfunction中會輪詢喚醒源狀態(tài),在檢測到喚醒源狀態(tài)切換為ECUM_WKSTATUS_PENDING后就會開啟喚醒源狀態(tài)校驗: EcuM_MainFunction --> EcuM_CheckValidation --> CanIf_CheckValidation -->讀取網(wǎng)路喚醒源標志 --> 如果喚醒源標志置位則調(diào)用EcuM_ValidateWakeupEvent,喚醒源頭從ECUM_WKSTATUS_PENDING狀態(tài)切換到ECUM_WKSTATUS_VALIDATED狀態(tài)。
ECUM_WKSTATUS_PENDING狀態(tài)切換到ECUM_WKSTATUS_EXPIRED:
EcuM的Mainfunction在輪詢喚醒源狀態(tài)時并沒有檢測到有效的喚醒源(通過CanIf_CheckValidation并沒有讀取到有效的喚醒標志,比如通過應(yīng)用報文喚醒ECU后設(shè)置了WakeupEvent),在ValidateWakeup timer超時(Expired)后就會切換喚醒轉(zhuǎn)到到ECUM_WKSTATUS_EXPIRED。
從其他狀態(tài)切換到ECUM_WKSTATUS_NONE:
系統(tǒng)中調(diào)用調(diào)用了EcuM_ClearWakeupEvent接口后,喚醒源狀態(tài)切換回ECUM_WKSTATUS_NONE。喚醒源的清除需要User去調(diào)用,如果是手寫模塊監(jiān)控喚醒源的話,可以實時Set/Clear喚醒源,如果通過AUTOSAR標準模塊管理喚醒源的話,在系統(tǒng)滿足休眠條件前清除掉所有喚醒源,在進入Shutdown的判斷條件中加上喚醒源都不為Pending/Valid的條件。
2.喚醒源相關(guān)的接口函數(shù)
EcuM提供以下接口來獲取喚醒源專題:
· EcuM_GetPendingWakeupEvents
· EcuM_GetValidatedWakeupEvents
· EcuM_GetExpiredWakeupEvents
通過以下接口操作喚醒源的狀態(tài):
· EcuM_ClearWakeupEvent
· EcuM_SetWakeupEvent
· EcuM_ValidateWakeupEvent
· EcuM_CheckWakeup
· EcuM_DisableWakeupSources
· EcuM_EnableWakeupSources
· EcuM_StartWakeupSources
· EcuM_StopWakeupSources
EcuM_GetPendingWakeupEvents
EcuM_GetValidatedWakeupEvents
EcuM_GetExpiredWakeupEvents
這三個接口用來獲取喚醒源的狀態(tài),一般在BswM管理ECU狀態(tài)中會使用,也就是上文所說的在ECU進入Shutdown/Sleep狀態(tài)前會通過這幾個接口來判斷喚醒狀態(tài)是不是都已經(jīng)為NONE狀態(tài)了。
EcuM_ClearWakeupEvent
EcuM_SetWakeupEvent
EcuM_ValidateWakeupEvent
這3個接口的分析見第2章節(jié)的分析
EcuM_CheckWakeup
這個接口為Callout函數(shù),也就是內(nèi)容由User自定義實現(xiàn)。這個函數(shù)只有深度休眠系統(tǒng)/EcuM走GoSleep Sequence才會用到,一般EcuM_CheckWakeup -> CanIf_CheckWakeup -> CanTrcv_CheckWakeup,CanTrcv_CheckWakeup函數(shù)中會檢測收發(fā)器(TJA1043)的STB和ERR引腳來判斷是否有總線喚醒事件,如果有的話嗎,CanTrcv_CheckWakeup調(diào)用EcuM_SetWakeupEvent上報喚醒事件。如果配置了Check Wakeup Timeout的話,在EcuM_CheckWakeup函數(shù)中調(diào)用EcuM_StartCheckWakeup,啟動相應(yīng)WakeupSource的CheckWakeupTimer,如果喚醒源的檢查是異步完成的(CheckWakeupTimer),CheckWakeupTimer參數(shù)是EcuM延遲ECU關(guān)閉的時間的初始值,一般不配置CheckWakeupTimer。
EcuM_DisableWakeupSources
EcuM_EnableWakeupSources
這兩個接口為Callout函數(shù),也就是內(nèi)容由User自定義實現(xiàn)。這兩個函數(shù)只有深度休眠系統(tǒng)/EcuM走GoSleep Sequence才會調(diào)用到。深度休眠系統(tǒng)需要在下電前把喚醒引腳配置為中斷口,在休眠起來后把喚醒引腳的中斷屬性Disable,可以通過這兩個Callout函數(shù)實現(xiàn)。也就是在EcuM_EnableWakeupSources函數(shù)Enbale喚醒引腳的INT功能,在EcuM_DisableWakeupSources函數(shù)中Disable喚醒引腳的INT功能。
EcuM_StartWakeupSources
EcuM_StopWakeupSources
這兩個接口為Callout函數(shù),也就是內(nèi)容由User自定義實現(xiàn)。EcuM_Mainfunction在檢測到喚醒源事件由ECUM_WKSTATUS_NONE切換到ECUM_WKSTATUS_PENDING狀態(tài)時調(diào)用EcuM_StartWakeupSources。在EcuM_StartWakeupSources中一般判斷喚醒源是網(wǎng)絡(luò)喚醒源后調(diào)用CanSM_StartWakeupSource,CanSM最終會開啟Can Controller,這樣Can模塊就能正常接收報文,為后面的EcuM_CheckValidation校驗做好準備。EcuM_StartWakeupSources需要在EcuM_CheckValidation前調(diào)用,因為喚醒源校驗需要Can Controller能接收報文
EcuM_Mainfunction在檢測到喚醒源事件由ECUM_WKSTATUS_PENDING切換到ECUM_WKSTATUS_EXPIED狀態(tài)時調(diào)用EcuM_StopWakeupSources。在EcuM_StopWakeupSources中一般判斷喚醒源是網(wǎng)絡(luò)喚醒源后調(diào)用CanSM_StopWakeupSource,CanSM最終會關(guān)閉Can Controller,這樣Can模塊就不能接收報文,為系統(tǒng)休眠做好準備。
3.問題回答
問題1:喚醒源有哪幾種狀態(tài),每個狀態(tài)之間是怎么切換的?
答:喚醒源有ECUM_WKSTATUS_NONE, ECUM_WKSTATUS_PENDING, ECUM_WKSTATUS_VALIDATED, ECUM_WKSTATUS_EXPIRED四種狀態(tài),具體切換參考第2節(jié)。
問題2:喚醒源會影響系統(tǒng)的下電/休眠流程嗎?
答:會。但是EcuM_Flex不會去check喚醒源的狀態(tài),需要我們自己把喚醒狀態(tài)的條件加到ECU系統(tǒng)狀態(tài)切換條件中去。根具體的說,在調(diào)用EcuM_GoDown/EcuM_GoHal前需要判斷說有喚醒源是不是都已經(jīng)NONE狀態(tài)了。
問題3:斷電系統(tǒng),喚醒后沒有Wakeup Sequences, 有 Wakeup validation sequence么?
答:有。EcuM的Wakeup validation sequence和斷電系統(tǒng)或者深度休眠系統(tǒng)無關(guān)。
審核編輯:劉清
-
收發(fā)器
+關(guān)注
關(guān)注
10文章
3431瀏覽量
106045 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
362瀏覽量
21617 -
狀態(tài)機
+關(guān)注
關(guān)注
2文章
492瀏覽量
27552 -
CAN模塊
+關(guān)注
關(guān)注
0文章
24瀏覽量
8749 -
ECU設(shè)計
+關(guān)注
關(guān)注
0文章
7瀏覽量
3294
原文標題:AUTOSAR 架構(gòu)下EcuM喚醒源事件詳解
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論