AUTOSAR架构下多核Shutdown

admin 2024年2月15日19:04:55评论5 views字数 4375阅读14分35秒阅读模式

前言

随着汽车ECU迅速的往域控制器方向发展,ECU要处理的任务越来越多,单核CPU的负载越来越大,多核ECU势在必行。AUTOSAR架构下OS支持多核处理,本系列文章将详细介绍AUTOSAR架构下的多核机制。本文介绍基于Tricore芯片的AUTOSAR架构下的多核Shutdown

问题 1 ECUSleep过程休眠过程如何实现多核同步?

问题 2ECUShutdown Off过程下电如何实现多核同步?

AUTOSAR架构下多核Shutdown

缩略词

简写

全称

EcuM

ECU Manager

SBC

System Basic Chip

BswM

Basic Software Manager

OS

Operation System

注:本文中引用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

1. EcuM模块中关于Multicore下电的流程概述

ECU满足休眠条件时,根据ECU的硬件设计会走Sleep或者Shutdown的过程。一般情况下,有SBCECU满足休眠条件后走Shutdown流程下电;无SBCECU满足休眠条件后走Sleep系统休眠的流程。

1.1 多核ECUSleep过程休眠

一般配置使用Flexible EcuM的项目在BswM模块会自定义一个描述ECU状态的状态机,在ECU系统满足休眠条件后会触发Action调用EcuM_SelectShutdownTarget(ECUM_SHUTDOWN_TARGET_SLEEP),之后根据需求调用EcuM_GoHalt(深度休眠系统一般调用GoHalt)或者EcuM_GoPoll().

AUTOSAR架构下多核Shutdown

Figure 1: SLEEP Phase

AUTOSAR架构下多核Shutdown

AUTOSAR架构下多核Shutdown

Figure 2: Master Core GoSleep Sequence

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

AUTOSAR架构下多核Shutdown

Figure 3: Slave Core GoSleep Sequence.

Slave CoreGoSleep Sequence同样需要调用EcuM_EnableWakeupSource()这个Callout函数。

Note: 个人理解Slave CoreGoSleep Sequence中调用EcuM_EnableWakeupSource()不需要做啥,因为唤醒的时候Master Core会调用StartCore唤醒Slave Core

AUTOSAR架构下多核Shutdown

Figure 4: Master Core Halt Sequence

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

AUTOSAR架构下多核Shutdown

Figure 5: Slave Core Halt Sequence.

Slave CoreHalt Sequence过程基本和Master Core的过程一样。

Note:多核ECUSleep休眠过程没有OS的参与。

单核ECUSleep过程请参考:AUTOSAR架构下RH850芯片深度休眠配置实践-Conifig EcuM and BswM

1.2 多核ECUShutdown下电

ECU系统满足休眠条件后触发Action调用EcuM_SelectShutdownTarget(ECUM_SHUTDOWN_TARGET_OFF),之后根据需求调用EcuM_GoDown().

AUTOSAR架构下多核Shutdown

Figure 6: Shutdown Phase.

AUTOSAR架构下多核Shutdown

AUTOSAR架构下多核Shutdown

Figure 7: Master Core OffPreOS Sequence

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

AUTOSAR架构下多核Shutdown

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

AUTOSAR架构下多核Shutdown

Figure 9: Slave Core OffPreOS Sequence.

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

AUTOSAR架构下多核Shutdown

Figure 10: Slave Core OffPostOS Sequence.

单核ECUShutdown过程请参考:AUTOSAR架构下RH850芯片断电系统配置实践

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

AUTOSAR架构下多核Shutdown

Figure 11: Example of a shutdown procedure.

AUTOSAR架构下多核Shutdown

3. 多核下电的具体实现

3.1 MICROSAR OSX-Signal

AUTOSAR架构下多核Shutdown

AUTOSAR架构下多核Shutdown

X-Signal用于MICROSAROS中跨核通信,具体通过MCU中未被使用的ISR中断资源实现。

3.2 MICROSARMulticore Sleep

MICROSARMulticore上走SleepSequence时可以配置只有Master CoreSleep,也可以选择多Master and Slave Core都走Sleep Sequence。如果走多核Sleep, 则在BswM模块中需要需要为每个Core配置ECU状态机,满足ECU Sleep条件后调用EcuM_GoHalt()/EcuM_GoPoll().

AUTOSAR架构下多核Shutdown

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

3.3 MICROSARMulticore Shutdown

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

AUTOSAR架构下多核Shutdown

EcuM_ShutdownOS这个Callout函数中调用OS API ShutdowAllCores()完成多核同步。

3.4 ShutdownAllCores中的核同步

Action 1:Master CoreOs_ShutdownAllCores()调用Os_TrapCallShutdownAllCores().

Action 2:Master CoreOs_TrapCallShutdownAllCores()调用Os_Api_ShutdownAllCores().

Action 3:Master CoreOs_Api_ShutdownAllCores()调用Os_SystemShutdown().

Action 4:Master CoreOs_SystemShutdown()调用Os_XSigSend_ShutdownAllCores()Slave Cores发送Shutdown信号。

AUTOSAR架构下多核Shutdown

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

AUTOSAR架构下多核Shutdown

Action 6: Slave CoreOs_CoreShutdowAllLocal()调用Os_CoreShutdown().

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

AUTOSAR架构下多核Shutdown

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

3.5 EcuM_GoHalt中的核同步

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

Master CoreEcuM_GoHalt()调用EcuM_EnterSleep().

Slave CoreEcuM_GoHalt()调用EcuM_EnterSleepOnSlave().

AUTOSAR架构下多核Shutdown

Master CoreEcuM_EnterSleep()调用EcuM_ShutdownSynchronization().

Master CoreEcuM_ShutdownSynchronization()通过一个do while()循环等待所有Slave Core是否到达Sleep状态,EcuM_GetCoreStatusValue()就是获取Slave Core状态。

Master Core在调用EcuM_ShutdownSynchronization() 之前会调用EcuM_SetCoreStatusValue()设置Master Core进入到Sleep状态。

AUTOSAR架构下多核Shutdown

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

AUTOSAR架构下多核Shutdown

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

AUTOSAR架构下多核Shutdown

Note: 标识三个核状态的全局变量应该链接在三个核都能访问的共享RAM里面,保证三个核都能访问的到。

4. 总结

问题 1 ECUSleep过程休眠过程如何实现多核同步?

Multicore ECUSleep过程通过EcuM_GoHalt()/EcuM_GoPoll()实现核同步,具体参考3.5章节。

问题 2ECUShutdown Off过程下电如何实现多核同步?

Multicore ECUShutdown过程下电通过ShutdownAllCores()实现核同步,具体参考3.4章节。

参考文档:

1. MICROSAR Classic EcuM Flex Technical Reference

2. Specification of ECU State Manager AUTOSAR CP Release 4.3.1

End

原文始发于微信公众号(汽车电子嵌入式):AUTOSAR架构下多核Shutdown

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月15日19:04:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   AUTOSAR架构下多核Shutdownhttp://cn-sec.com/archives/2185212.html

发表评论

匿名网友 填写信息