1、EcuM简介
EcuM(ECU State Management)ECU状态管理模块属于AUTOSAR系统服务中模式管理部分,主要功能是管理ECU的上下电,初始化和反初始化OS,SchM,BswM以及其他一些驱动模块。
AUTOSAR 4.4版本前EcuM有两种模式:Flexible模式和Fiexd模式。在Fiexd模式下ECU的状态管理都由EcuM模块内部实现。在Flexible模式下,除了Startup的前期阶段、Shutdown的后期阶段以及Sleep阶段外,其它时候的状态管理都由BswM实现。AUTOSAR 4.4版本后移除了Fixed模式,本文只针对Flexible模式进行介绍。
EcuM分成5个阶段:Startup,Up,Shutdown,Sleep,Off。
下图是EcuM的总体流程框图
Startup阶段:主要负责BSW模块的初始化,该阶段以OS开启界细分为StartPreOS和StartPostOS。
Up阶段:任务调度开启,此阶段的状态管理、动作执行主要靠BswM模块实现。
Shutdown阶段:主要负责下电流程处理,下电完成后根据设置可以选择进入OFF还是RESET重启,该阶段以OS关闭为界细分为两部分OffPreOs和OffPostOs。
Sleep阶段:ECU处于低功耗模式,通常情况下,不执行任何代码,但仍有电源供应,如果进行相应配置,ECU在此状态下是可唤醒的。ECU管理器模块提供了一组可配置的(硬件)睡眠模式,这些模式通常是在功耗和重启ECU的时间之间进行权衡的。
Off阶段:下电时,ECU进入OFF状态。在这种状态下,ECU可能是可唤醒的,但仅限于具有集成电源控制的唤醒源。在任何情况下,ECU必须是可启动的(例如复位事件)。
2、启动Startup
启动流程如下图所示,在调用EcuM_Init()函数之前,系统上电后,MCU进入复位状态,这时主要是进行芯片供电选择、时钟开启等操作。硬件完成这些工作后,将PC指针指向Boot Menu(AURIX 2G系列芯片是Firmware)中代码首地址,此时开始软件参数配置,包括用户配置参数的判断和加载、特定寄存器状态判断、复位源设置、启动模式评估等等。C Init Code主要对芯片的寄存器,上下文,栈等进行配置,以及启动主核(从核在这里被主核激活是个可选项,因为后续EcuM会再次激活从核)。
可以调用EcuM_SelectBootTarget和EcuM_GetBootTarget 选择从Bootloader还是app启动跑后续程序。
在EcuM_Init()函数里,首先进行开启OS前的准备工作,主要是调用EcuM_AL_DriverInitZero(初始化不带post-build配置参数的Bsw模块)和EcuM_AL_DriverInitOne函数,分别初始化Block 0和Block 1:
如果是多核系统,那么在初始化Block1后,StartOS前要激活所有的从核。
进入StartOS,会调用StartupHook函数,用户定义此函数内容,然后会激活首个Task(一般为Init Task),在首个Task里会调用EcuM_StartupTwo()。(正常来讲EcuM_StartupTwo()会被配置为OS默认应用模式自启动的任务里)。
最后在StartPostOs阶段,调用SchM_Start,SchM_Init,SchM_StartTiming以及BswM_Init。
2.1 StartPreOs
-
EcuM_AL_SetProgrammableInterrupts【可选】:可编程中断,如一些异常Trap;
-
EcuM_AL_DriverInitZero【可选】:初始化不带post-build配置参数的BSW模块;
-
EcuM_DeterminePbConfiguration:返回所有BSW模块post-build配置参数的一个引用,通过此引用能获取各个模块的参数信息;
-
Check consistency of configuration data:对上一步结果的一致性检查;
-
EcuM_AL_DriverInitOne【可选】:初始化BSW模块,包括MCU及基本所有的外设模块,如Adc,Pwm,Fee,Can等;
-
Get reset reason:获取MCU复位源,并根据映射关系设置唤醒源。唤醒源通常是从功能角度定义的,比如CAN唤醒,KL15唤醒等,而复位源则和MCU相关,比如所有MCU都支持的Power on reset,这两者之间通过EcuM可以配置映射关系;
-
Select default shutdown target:设置Shutdown目标,可以是Sleep、Off或Reset;
-
EcuM_LoopDetection【可选】:如果使能,该接口每次Startup时都会被调用,例如可以用来记录启动次数;
-
Start OS:开启AUTOSAR OS
2.2 StartOs
- EcuM_Prv_StartSlaveCores(多核):通过主核启动从核;
- EcuM_SwitchOsAppMode:以默认应用模式启动OS;
- EcuM_Prv_StartOS:开启OS,包括用户自定义的StartupHook函数,OS核同步,ActivateTask,ActivateTask是OS启动后自动调用,一般为Init Task和Idle Task。
2.3 StartPostOs
-
Init BSW Scheduler:初始化SchM;
-
Init BSW Mode Manager:初始化BswM;
-
Init NvM,NvM_ReadAll,Initialize other modules:BswM初始化后,接手后续操作,包括初始化NvM,NvM_ReadAll读取NvM数据,初始化其它的BSW模块等。NvM_ReadAll完成后将触发Com,DEM,FIM的初始化,并且通知BswM读取数据完成。
-
Start Scheduler Timing:启动BSW/SWCs事件调度。
实际上,当SchM_Init及BswM_Init调用后,已经进入Up阶段了,此时内存,通讯还没初始化,SWC(RTE)还不支持。一般来说,需要在开启任务调度前做完NvM的数据读取及所有模块的初始化工作,以及需要手动调用BswM_Mainfunction。如果有其它方式可以保证在任务运行时模块及数据均已就绪的话,第三步也可以放在Up阶段进行。
3、运行Up
在Up阶段,EcuM_MainFunction函数会被周期性的调用,此函数有以下三个作用:
- 检查唤醒源是否已经唤醒,并在必要时启动唤醒验证
- 更新Alarm时钟计数
- 仲裁RUN和POST_RUN请求和释放。
EcuM通过闹钟来触发唤醒。闹钟唤醒机制仅和Sleep阶段相关,SWC和BSW模块在Up阶段设置和检索闹钟设定值,在Sleep阶段被使用。EcuM里闹钟功能实现很少,不过多阐述。
运行阶段主要是主要有两个功能需要关注:将处理权交给BswM,让其处理模式请求,控制状态切换;处理唤醒源的验证。
3.1 唤醒源验证
唤醒源有以下4种状态:
-
NONE :无唤醒事件或唤醒事件被清除;
-
PENDING :检测到唤醒事件但尚未验证;
-
VALIDATED :检测到唤醒事件并验证通过;
-
EXPIRED :检测到唤醒事件但验证失败。
唤醒源状态图如下所示:
如果唤醒源不需要验证,通过EcuM_SetWakeupEvent可以直接设置为已验证状态,而对于需要验证的唤醒源,则要经过PENDING阶段确认是否有效,确认超时也会导致验证失败。
EcuM模块可以管理多达32个唤醒源,除了标准的五个唤醒源(POWER、RESET、INTERNAL RESET、INTERNAL WDG和EXTERNAL WDG)不会触发验证过程,其它用户配置的唤醒源均可以开启验证功能。
4、关闭Shutdown
在Up阶段,通过使用关闭目标RESET/OFF调用EcuM_GoDownHaltPoll来启动Shutdown阶段。如果在关闭阶段发生唤醒事件时,EcuM应立即完成关机并在此后立即重新启动。
4.1 OffPreOS
在OffPreOS期间,如果配置参数EcuMlgnoreWakeupEvValOffPreos设置为true,只需考虑那些不需要验证的唤醒事件,所有其他的唤醒事件可以忽略。如果配置参数EcuMignoreWakeupEvValoffPreos设置为false时,不需要验证的唤醒事件和需要验证的待定唤醒事件都需被考虑到。
作为OffPreos期间的最后一项活动, EcuM需调用Shutdownos函数。操作系统会在关机结束时,调用关闭钩子(hook)函数。关闭钩子函数会调用EcuM_Shutdown来结束关机过程。
4.2 OffPostOS
当关关闭目标为RESET时, EcuM需调用EcuM_AL_Reset的Callout函数。当关机目标为OFF时, EcuM需调用EcuM AL Switchoff的Callout函数。
5、睡眠Sleep
与Shutdown阶段相比,Sleep阶段不应关闭操作系统。
5.1 GoSleep
当在多核的ECU上运行时, EcuM需要为每个内核保留一个专用资源(RES_AUTOSAR_ECUM) 。该资源会在进入休眠(Go Sleep)期间分配。在睡眠模式下,EcuM不执行任何代码。
5.2 Halt或者Polling
Sleep的实现机制有两种方式:Halt(停止)和Polling(轮询)。
如果当ECU处于停止(Halt)或轮询(Poll)状态时,发生唤醒了事件唤醒硬线发生翻转变化,(toggling a wakeup line)CAN总线上有通讯信号(communication on a CAN bus)等则ECU管理器模块需重新获得控制权,并通过执行唤醒重启序列(WakeupRestart sequence)退出睡眠阶段。可以调用ISR来处理唤醒事件,但这取决于硬件和驱动程序的实现。
6、多核
如上图展示了BSW模块在不同分区上(partition)的分布。分区(partition)可以被看作是映射在一个内核(core)上的独立部分。每个核(无论是单核架构还是多核架构)都包含一个或多个分区。分区不能跨核。BSW模块可以分布在不同的分区上,所以可以分布在不同的内核上。如BswM这类的一些BSW模块需包含在每个分区中。如OS或EcuM这类的一些其他模块需包含在每个内核的一个分区中。