基于Tricore芯片的AUTOSAR架构下的多核Shutdown介绍

电子说

1.3w人已加入

描述

正文

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().

MCU芯片

Figure 1: SLEEP Phase

MCU芯片

MCU芯片

Figure 2: Master Core GoSleep Sequence

Master Core的GoSleep Sequence中需要调用EcuM_EnableWakeupSource()这个Callout函数(需要用户自定义)配置ECU休眠后的唤醒源。

MCU芯片

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。

MCU芯片

Figure 4: Master Core Halt Sequence

Master Core进入到Halt Sequence后会先等待Slave Core,多核完成同步后调用MCAL_MCU模块提供的Mcu_SetMode()接口设置Master Core进入HALT深度休眠状态。休眠后唤醒过程,本文暂不深入论述。

MCU芯片

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().

MCU芯片

Figure 6: Shutdown Phase.

MCU芯片

MCU芯片

Figure 7: Master Core OffPreOS Sequence

Master Core进入OffPreOS Sequence后最关键的就是调用ShutdownAllCores完成多核同步。

MCU芯片

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下电
};

 

MCU芯片

Figure 9: Slave Core OffPreOS Sequence.

因为Master Core调用EcuM_AL_SwitchOff ()后MCU已经下电了,Slave Core不用也来不及做啥操作了。

MCU芯片

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().

MCU芯片

Figure 11: Example of a shutdown procedure.

MCU芯片

3. 多核下电的具体实现

3.1 MICROSAR OS中X-Signal

MCU芯片

MCU芯片

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().

MCU芯片

多核同步在EcuM_GoHalt()或EcuM_GoPoll()中完成。

3.3 MICROSAR中Multicore Shutdown

MICROSAR在Multicore上走Shutdown Sequence时所有的核都得走Shutdown Sequence, 那么在BswM模块需要为每个Core配置ECU状态机,满足Shutdown Off条件后调用EcuM_GoDown().

MCU芯片

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信号。

MCU芯片

Action 5: Slave Core接收到Signal后调用Os_CoreShutdowAllLocal().

MCU芯片

Action 6: Slave Core中Os_CoreShutdowAllLocal()调用Os_CoreShutdown().

Action 7: Master Core和Slave Cores都调用Os_CoreShutdown(), 通过OsBarriers机制完成多核同步,最后都调用ShutdownHook().

MCU芯片

OsBarriers机制参考:AUTOSAR架构下多核启动

3.5 EcuM_GoHalt中的核同步

Master Core和Slave Core都调用EcuM_GoHalt(), 然后:

Master Core在EcuM_GoHalt()调用EcuM_EnterSleep().

Slave Core在EcuM_GoHalt()调用EcuM_EnterSleepOnSlave().

MCU芯片

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状态。

MCU芯片

Slave Core中EcuM_EnterSleepOnSlave()调用EcuM_SetCoreStatusValue()设置Slave Cores进入到Sleep状态,最后调用EcuM_McuSetMode()进入深度休眠Halt.

MCU芯片

EcuM_SetCoreStatusValue(CoreID)和EcuM_GetCoreStatusValue(CoreID, CORE_STATE)其实就是在设置和访问三个标识核状态的全局变量。

MCU芯片

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章节。







审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分