正文
1. EcuM模塊中關(guān)于Multicore下電的流程概述
當ECU滿足休眠條件時,根據(jù)ECU的硬件設(shè)計會走Sleep或者Shutdown的過程。一般情況下,有SBC的ECU滿足休眠條件后走Shutdown流程下電;無SBC的ECU滿足休眠條件后走Sleep系統(tǒng)休眠的流程。
1.1 多核ECU走Sleep過程休眠
一般配置使用Flexible EcuM的項目在BswM模塊會自定義一個描述ECU狀態(tài)的狀態(tài)機,在ECU系統(tǒng)滿足休眠條件后會觸發(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()這個Callout函數(shù)(需要用戶自定義)配置ECU休眠后的喚醒源。

Figure 3: Slave Core GoSleep Sequence.
Slave Core的GoSleep Sequence同樣需要調(diào)用EcuM_EnableWakeupSource()這個Callout函數(shù)。
Note: 個人理解Slave Core的GoSleep Sequence中調(diào)用EcuM_EnableWakeupSource()不需要做啥,因為喚醒的時候Master Core會調(diào)用StartCore喚醒Slave Core。

Figure 4: Master Core Halt Sequence
Master Core進入到Halt Sequence后會先等待Slave Core,多核完成同步后調(diào)用MCAL_MCU模塊提供的Mcu_SetMode()接口設(shè)置Master Core進入HALT深度休眠狀態(tài)。休眠后喚醒過程,本文暫不深入論述。

Figure 5: Slave Core Halt Sequence.
Slave Core的Halt Sequence過程基本和Master Core的過程一樣。
Note:多核ECU走Sleep休眠過程沒有OS的參與。
單核ECU走Sleep過程請參考:AUTOSAR架構(gòu)下RH850芯片深度休眠配置實踐-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進入OffPreOS Sequence后最關(guān)鍵的就是調(diào)用ShutdownAllCores完成多核同步。

Figure 8: Master Core OffPostOS Sequence
Master Core完成多核同步后進入OffPostOS Sequence,調(diào)用EcuM_AL_SwitchOff()這個Callout函數(shù)完成ECU Shutdown Off。
Example:
VoidEcuM_AL_SwitchOff(void)
{
Cdd_SBC_GotoSleep();//給MCU下電
};

Figure 9: Slave Core OffPreOS Sequence.
因為Master 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, 同時在ShutdownAllCores()中實現(xiàn)多核同步(Note: 后文實例代碼講解)。然后,所有的核都會àShutdowHook() àEcuM_Shutdown() àEcuM_AL_SwitchOff (Callout函數(shù),中間調(diào)用用戶自定義的真正的Shutdown函數(shù)) àCdd_SBC_GotoSleep().

Figure 11: Example of a shutdown procedure.

3. 多核下電的具體實現(xiàn)
3.1 MICROSAROS中X-Signal


X-Signal用于MICROSAROS中跨核通信,具體通過MCU中未被使用的ISR中斷資源實現(xiàn)。
3.2 MICROSAR中Multicore Sleep
MICROSAR在Multicore上走SleepSequence時可以配置只有Master Core走Sleep,也可以選擇多Master andSlaveCore都走Sleep Sequence。如果走多核Sleep,則在BswM模塊中需要需要為每個Core配置ECU狀態(tài)機,滿足ECU Sleep條件后調(diào)用EcuM_GoHalt()/EcuM_GoPoll().

多核同步在EcuM_GoHalt()或EcuM_GoPoll()中完成。
3.3 MICROSAR中Multicore Shutdown
MICROSAR在Multicore上走Shutdown Sequence時所有的核都得走Shutdown Sequence,那么在BswM模塊需要為每個Core配置ECU狀態(tài)機,滿足Shutdown Off條件后調(diào)用EcuM_GoDown().

EcuM_ShutdownOS這個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信號。

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機制完成多核同步,最后都調(diào)用ShutdownHook().

OsBarriers機制參考:AUTOSAR架構(gòu)下多核啟動
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()通過一個do while()循環(huán)等待所有Slave Core是否到達Sleep狀態(tài),EcuM_GetCoreStatusValue()就是獲取Slave Core狀態(tài)。
Master Core在調(diào)用EcuM_ShutdownSynchronization()之前會調(diào)用EcuM_SetCoreStatusValue()設(shè)置MasterCore進入到Sleep狀態(tài)。

Slave Core中EcuM_EnterSleepOnSlave()調(diào)用EcuM_SetCoreStatusValue()設(shè)置Slave Cores進入到Sleep狀態(tài),最后調(diào)用EcuM_McuSetMode()進入深度休眠Halt.

EcuM_SetCoreStatusValue(CoreID)和EcuM_GetCoreStatusValue(CoreID, CORE_STATE)其實就是在設(shè)置和訪問三個標識核狀態(tài)的全局變量。

Note: 標識三個核狀態(tài)的全局變量應該鏈接在三個核都能訪問的共享RAM里面,保證三個核都能訪問的到。
4. 總結(jié)
問題 1: ECU走Sleep過程休眠過程如何實現(xiàn)多核同步?
答:Multicore ECU走Sleep過程通過EcuM_GoHalt()/EcuM_GoPoll()實現(xiàn)核同步,具體參考3.5章節(jié)。
問題 2:ECU走Shutdown Off過程下電如何實現(xiàn)多核同步?
答:Multicore ECU走Shutdown過程下電通過ShutdownAllCores()實現(xiàn)核同步,具體參考3.4章節(jié)。
審核編輯:劉清
-
AUTOSAR
+關(guān)注
關(guān)注
10文章
398瀏覽量
23647 -
SBC
+關(guān)注
關(guān)注
0文章
91瀏覽量
20226 -
ecu
+關(guān)注
關(guān)注
14文章
982瀏覽量
57266 -
狀態(tài)機
+關(guān)注
關(guān)注
2文章
499瀏覽量
29141 -
MCU芯片
+關(guān)注
關(guān)注
3文章
260瀏覽量
12886
原文標題:AUTOSAR架構(gòu)下多核Shutdown
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
AUTOSAR架構(gòu)下的多核通信介紹
介紹芯片命名系統(tǒng)資源最小系統(tǒng)的搭建原理圖
功能安全---AUTOSAR架構(gòu)深度解析 精選資料分享
AUTOSAR架構(gòu)深度解析 精選資料推薦
AUTOSAR架構(gòu)深度解析 精選資料分享
如何在Tricore上移植μC/OS-III
AUTOSAR架構(gòu)下的WdgDriver WdgIf WdgM模塊
AutoSAR構(gòu)架以及在多核汽車MCU的運行
基于Tricore架構(gòu)的RTThread多核實現(xiàn)
基于Tricore芯片的AUTOSAR架構(gòu)下的多核啟動
AUTOSAR架構(gòu)下,持續(xù)集成CI的最佳實踐
基于Tricore芯片的AUTOSAR架構(gòu)下的多核Shutdown介紹
評論