AUTOSAR之ECUM

 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这类的一些其他模块需包含在每个内核的一个分区中。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值