正文
1. EcuM模塊中關(guān)于Multicore下電的流程概述
當(dāng)ECU滿足休眠條件時(shí),根據(jù)ECU的硬件設(shè)計(jì)會(huì)走Sleep或者Shutdown的過程。一般情況下,有SBC的ECU滿足休眠條件后走Shutdown流程下電;無SBC的ECU滿足休眠條件后走Sleep系統(tǒng)休眠的流程。
1.1 多核ECU走Sleep過程休眠
一般配置使用Flexible EcuM的項(xiàng)目在BswM模塊會(huì)自定義一個(gè)描述ECU狀態(tài)的狀態(tài)機(jī),在ECU系統(tǒng)滿足休眠條件后會(huì)觸發(fā)Action調(diào)用EcuM_SelectShutdownTarget(ECUM_SHUTDOWN_TARGET_SLEEP),之后根據(jù)需求調(diào)用EcuM_GoHalt(深度休眠系統(tǒng)一般調(diào)用GoHalt)或者EcuM_GoPoll().
Figure 1: SLEEP Phase
Figure 2: Master Core GoSleep Sequence
Master Core的GoSleep Sequence中需要調(diào)用EcuM_EnableWakeupSource()這個(gè)Callout函數(shù)(需要用戶自定義)配置ECU休眠后的喚醒源。
Figure 3: Slave Core GoSleep Sequence.
Slave Core的GoSleep Sequence同樣需要調(diào)用EcuM_EnableWakeupSource()這個(gè)Callout函數(shù)。
Note: 個(gè)人理解Slave Core的GoSleep Sequence中調(diào)用EcuM_EnableWakeupSource()不需要做啥,因?yàn)閱拘训臅r(shí)候Master Core會(huì)調(diào)用StartCore喚醒Slave Core。
Figure 4: Master Core Halt Sequence
Master Core進(jìn)入到Halt Sequence后會(huì)先等待Slave Core,多核完成同步后調(diào)用MCAL_MCU模塊提供的Mcu_SetMode()接口設(shè)置Master Core進(jìn)入HALT深度休眠狀態(tài)。休眠后喚醒過程,本文暫不深入論述。
Figure 5: Slave Core Halt Sequence.
Slave Core的Halt Sequence過程基本和Master Core的過程一樣。
Note:多核ECU走Sleep休眠過程沒有OS的參與。
單核ECU走Sleep過程請(qǐng)參考:AUTOSAR架構(gòu)下RH850芯片深度休眠配置實(shí)踐-Conifig EcuM and BswM
1.2 多核ECU走Shutdown下電
在ECU系統(tǒng)滿足休眠條件后觸發(fā)Action調(diào)用EcuM_SelectShutdownTarget(ECUM_SHUTDOWN_TARGET_OFF),之后根據(jù)需求調(diào)用EcuM_GoDown().
Figure 6: Shutdown Phase.
Figure 7: Master Core OffPreOS Sequence
Master Core進(jìn)入OffPreOS Sequence后最關(guān)鍵的就是調(diào)用ShutdownAllCores完成多核同步。
Figure 8: Master Core OffPostOS Sequence
Master Core完成多核同步后進(jìn)入OffPostOS Sequence,調(diào)用EcuM_AL_SwitchOff()這個(gè)Callout函數(shù)完成ECU Shutdown Off。
Example:
VoidEcuM_AL_SwitchOff(void) { Cdd_SBC_GotoSleep();//給MCU下電 };
Figure 9: Slave Core OffPreOS Sequence.
因?yàn)镸aster Core調(diào)用EcuM_AL_SwitchOff ()后MCU已經(jīng)下電了,Slave Core不用也來不及做啥操作了。
Figure 10: Slave Core OffPostOS Sequence.
2. OS模塊中關(guān)于多核Shutdown的描述
MasterCore滿足Shutdown Off條件后調(diào)用ShutdownAllCores(), 在ShutdownAllCores()中發(fā)送Signal給到Slave Core觸發(fā)Shutdown, 同時(shí)在ShutdownAllCores()中實(shí)現(xiàn)多核同步(Note: 后文實(shí)例代碼講解)。然后,所有的核都會(huì)àShutdowHook() àEcuM_Shutdown() àEcuM_AL_SwitchOff (Callout函數(shù),中間調(diào)用用戶自定義的真正的Shutdown函數(shù)) àCdd_SBC_GotoSleep().
Figure 11: Example of a shutdown procedure.
3. 多核下電的具體實(shí)現(xiàn)
3.1 MICROSAROS中X-Signal
X-Signal用于MICROSAROS中跨核通信,具體通過MCU中未被使用的ISR中斷資源實(shí)現(xiàn)。
3.2 MICROSAR中Multicore Sleep
MICROSAR在Multicore上走SleepSequence時(shí)可以配置只有Master Core走Sleep,也可以選擇多Master andSlaveCore都走Sleep Sequence。如果走多核Sleep,則在BswM模塊中需要需要為每個(gè)Core配置ECU狀態(tài)機(jī),滿足ECU Sleep條件后調(diào)用EcuM_GoHalt()/EcuM_GoPoll().
多核同步在EcuM_GoHalt()或EcuM_GoPoll()中完成。
3.3 MICROSAR中Multicore Shutdown
MICROSAR在Multicore上走Shutdown Sequence時(shí)所有的核都得走Shutdown Sequence,那么在BswM模塊需要為每個(gè)Core配置ECU狀態(tài)機(jī),滿足Shutdown Off條件后調(diào)用EcuM_GoDown().
EcuM_ShutdownOS這個(gè)Callout函數(shù)中調(diào)用OSAPIShutdowAllCores()完成多核同步。
3.4 ShutdownAllCores中的核同步
Action 1:Master Core中Os_ShutdownAllCores()調(diào)用Os_TrapCallShutdownAllCores().
Action 2:Master Core中Os_TrapCallShutdownAllCores()調(diào)用Os_Api_ShutdownAllCores().
Action 3:Master Core中Os_Api_ShutdownAllCores()調(diào)用Os_SystemShutdown().
Action 4:Master Core中Os_SystemShutdown()調(diào)用Os_XSigSend_ShutdownAllCores()給Slave Cores發(fā)送Shutdown信號(hào)。
Action 5:Slave Core接收到Signal后調(diào)用Os_CoreShutdowAllLocal().
Action 6:Slave Core中Os_CoreShutdowAllLocal()調(diào)用Os_CoreShutdown().
Action 7:Master Core和Slave Cores都調(diào)用Os_CoreShutdown(),通過OsBarriers機(jī)制完成多核同步,最后都調(diào)用ShutdownHook().
OsBarriers機(jī)制參考:AUTOSAR架構(gòu)下多核啟動(dòng)
3.5 EcuM_GoHalt中的核同步
Master Core和Slave Core都調(diào)用EcuM_GoHalt(),然后:
MasterCore在EcuM_GoHalt()調(diào)用EcuM_EnterSleep().
SlaveCore在EcuM_GoHalt()調(diào)用EcuM_EnterSleepOnSlave().
MasterCore中EcuM_EnterSleep()調(diào)用EcuM_ShutdownSynchronization().
MasterCore中EcuM_ShutdownSynchronization()通過一個(gè)do while()循環(huán)等待所有Slave Core是否到達(dá)Sleep狀態(tài),EcuM_GetCoreStatusValue()就是獲取Slave Core狀態(tài)。
Master Core在調(diào)用EcuM_ShutdownSynchronization()之前會(huì)調(diào)用EcuM_SetCoreStatusValue()設(shè)置MasterCore進(jìn)入到Sleep狀態(tài)。
Slave Core中EcuM_EnterSleepOnSlave()調(diào)用EcuM_SetCoreStatusValue()設(shè)置Slave Cores進(jìn)入到Sleep狀態(tài),最后調(diào)用EcuM_McuSetMode()進(jìn)入深度休眠Halt.
EcuM_SetCoreStatusValue(CoreID)和EcuM_GetCoreStatusValue(CoreID, CORE_STATE)其實(shí)就是在設(shè)置和訪問三個(gè)標(biāo)識(shí)核狀態(tài)的全局變量。
Note: 標(biāo)識(shí)三個(gè)核狀態(tài)的全局變量應(yīng)該鏈接在三個(gè)核都能訪問的共享RAM里面,保證三個(gè)核都能訪問的到。
4. 總結(jié)
問題 1: ECU走Sleep過程休眠過程如何實(shí)現(xiàn)多核同步?
答:Multicore ECU走Sleep過程通過EcuM_GoHalt()/EcuM_GoPoll()實(shí)現(xiàn)核同步,具體參考3.5章節(jié)。
問題 2:ECU走Shutdown Off過程下電如何實(shí)現(xiàn)多核同步?
答:Multicore ECU走Shutdown過程下電通過ShutdownAllCores()實(shí)現(xiàn)核同步,具體參考3.4章節(jié)。
審核編輯:劉清
-
AUTOSAR
+關(guān)注
關(guān)注
10文章
350瀏覽量
21478 -
SBC
+關(guān)注
關(guān)注
0文章
76瀏覽量
19162 -
ecu
+關(guān)注
關(guān)注
14文章
881瀏覽量
54405 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
492瀏覽量
27478 -
MCU芯片
+關(guān)注
關(guān)注
3文章
248瀏覽量
11388
原文標(biāo)題:AUTOSAR架構(gòu)下多核Shutdown
文章出處:【微信號(hào):汽車電子嵌入式,微信公眾號(hào):汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論