电子说
正文
1. EcuM模块中关于Multicore下电的流程概述
当ECU满足休眠条件时,根据ECU的硬件设计会走Sleep或者Shutdown的过程。一般情况下,有SBC的ECU满足休眠条件后走Shutdown流程下电;无SBC的ECU满足休眠条件后走Sleep系统休眠的流程。
1.1 多核ECU走Sleep过程休眠
一般配置使用Flexible EcuM的项目在BswM模块会自定义一个描述ECU状态的状态机,在ECU系统满足休眠条件后会触发Action调用EcuM_SelectShutdownTarget(ECUM_SHUTDOWN_TARGET_SLEEP),之后根据需求调用EcuM_GoHalt(深度休眠系统一般调用GoHalt)或者EcuM_GoPoll().
Figure 1: SLEEP Phase
Figure 2: Master Core GoSleep Sequence
Master Core的GoSleep Sequence中需要调用EcuM_EnableWakeupSource()这个Callout函数(需要用户自定义)配置ECU休眠后的唤醒源。
Figure 3: Slave Core GoSleep Sequence.
Slave Core的GoSleep Sequence同样需要调用EcuM_EnableWakeupSource()这个Callout函数。
Note: 个人理解Slave Core的GoSleep Sequence中调用EcuM_EnableWakeupSource()不需要做啥,因为唤醒的时候Master Core会调用StartCore唤醒Slave Core。
Figure 4: Master Core Halt Sequence
Master Core进入到Halt Sequence后会先等待Slave Core,多核完成同步后调用MCAL_MCU模块提供的Mcu_SetMode()接口设置Master Core进入HALT深度休眠状态。休眠后唤醒过程,本文暂不深入论述。
Figure 5: Slave Core Halt Sequence.
Slave Core的Halt Sequence过程基本和Master Core的过程一样。
Note:多核ECU走Sleep休眠过程没有OS的参与。
单核ECU走Sleep过程请参考:AUTOSAR架构下RH850芯片深度休眠配置实践-Conifig EcuM and BswM
1.2 多核ECU走Shutdown下电
在ECU系统满足休眠条件后触发Action调用EcuM_SelectShutdownTarget(ECUM_SHUTDOWN_TARGET_OFF),之后根据需求调用EcuM_GoDown().
Figure 6: Shutdown Phase.
Figure 7: Master Core OffPreOS Sequence
Master Core进入OffPreOS Sequence后最关键的就是调用ShutdownAllCores完成多核同步。
Figure 8: Master Core OffPostOS Sequence
Master Core完成多核同步后进入OffPostOS Sequence,调用EcuM_AL_SwitchOff()这个Callout函数完成ECU Shutdown Off。
Example:
Void EcuM_AL_SwitchOff(void) { Cdd_SBC_GotoSleep(); //给MCU下电 };
Figure 9: Slave Core OffPreOS Sequence.
因为Master Core调用EcuM_AL_SwitchOff ()后MCU已经下电了,Slave Core不用也来不及做啥操作了。
Figure 10: Slave Core OffPostOS Sequence.
2. OS模块中关于多核Shutdown的描述
Master Core满足Shutdown Off条件后调用ShutdownAllCores(), 在ShutdownAllCores()中发送Signal给到Slave Core触发Shutdown, 同时在ShutdownAllCores()中实现多核同步(Note: 后文实例代码讲解)。然后,所有的核都会à ShutdowHook() à EcuM_Shutdown() à EcuM_AL_SwitchOff (Callout函数,中间调用用户自定义的真正的Shutdown函数) à Cdd_SBC_GotoSleep().
Figure 11: Example of a shutdown procedure.
3. 多核下电的具体实现
3.1 MICROSAR OS中X-Signal
X-Signal用于MICROSAR OS中跨核通信,具体通过MCU中未被使用的ISR中断资源实现。
3.2 MICROSAR中Multicore Sleep
MICROSAR在Multicore上走Sleep Sequence时可以配置只有Master Core走Sleep,也可以选择多Master and Slave Core都走Sleep Sequence。如果走多核Sleep, 则在BswM模块中需要需要为每个Core配置ECU状态机,满足ECU Sleep条件后调用EcuM_GoHalt()/EcuM_GoPoll().
多核同步在EcuM_GoHalt()或EcuM_GoPoll()中完成。
3.3 MICROSAR中Multicore Shutdown
MICROSAR在Multicore上走Shutdown Sequence时所有的核都得走Shutdown Sequence, 那么在BswM模块需要为每个Core配置ECU状态机,满足Shutdown Off条件后调用EcuM_GoDown().
EcuM_ShutdownOS这个Callout函数中调用OS API ShutdowAllCores()完成多核同步。
3.4 ShutdownAllCores中的核同步
Action 1:Master Core中Os_ShutdownAllCores()调用Os_TrapCallShutdownAllCores().
Action 2:Master Core中Os_TrapCallShutdownAllCores()调用Os_Api_ShutdownAllCores().
Action 3:Master Core中Os_Api_ShutdownAllCores()调用Os_SystemShutdown().
Action 4:Master Core中Os_SystemShutdown()调用Os_XSigSend_ShutdownAllCores()给Slave Cores发送Shutdown信号。
Action 5: Slave Core接收到Signal后调用Os_CoreShutdowAllLocal().
Action 6: Slave Core中Os_CoreShutdowAllLocal()调用Os_CoreShutdown().
Action 7: Master Core和Slave Cores都调用Os_CoreShutdown(), 通过OsBarriers机制完成多核同步,最后都调用ShutdownHook().
OsBarriers机制参考:AUTOSAR架构下多核启动
3.5 EcuM_GoHalt中的核同步
Master Core和Slave Core都调用EcuM_GoHalt(), 然后:
Master Core在EcuM_GoHalt()调用EcuM_EnterSleep().
Slave Core在EcuM_GoHalt()调用EcuM_EnterSleepOnSlave().
Master Core中EcuM_EnterSleep()调用EcuM_ShutdownSynchronization().
Master Core中EcuM_ShutdownSynchronization()通过一个do while()循环等待所有Slave Core是否到达Sleep状态,EcuM_GetCoreStatusValue()就是获取Slave Core状态。
Master Core在调用EcuM_ShutdownSynchronization() 之前会调用EcuM_SetCoreStatusValue()设置Master Core进入到Sleep状态。
Slave Core中EcuM_EnterSleepOnSlave()调用EcuM_SetCoreStatusValue()设置Slave Cores进入到Sleep状态,最后调用EcuM_McuSetMode()进入深度休眠Halt.
EcuM_SetCoreStatusValue(CoreID)和EcuM_GetCoreStatusValue(CoreID, CORE_STATE)其实就是在设置和访问三个标识核状态的全局变量。
Note: 标识三个核状态的全局变量应该链接在三个核都能访问的共享RAM里面,保证三个核都能访问的到。
4. 总结
问题 1: ECU走Sleep过程休眠过程如何实现多核同步?
答:Multicore ECU走Sleep过程通过EcuM_GoHalt()/EcuM_GoPoll()实现核同步,具体参考3.5章节。
问题 2: ECU走Shutdown Off过程下电如何实现多核同步?
答:Multicore ECU走Shutdown过程下电通过ShutdownAllCores()实现核同步,具体参考3.4章节。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !