当你看到ECU从启动状态至正常运行状态,再从正常运行状态至休眠或关闭的过程时,你是否曾想过以下一些问题呢?
EcuM模块作为AUTOSAR中的标准模块,全称为(ECU State Management)。故名思义,指的就是ECU 的状态管理,不过需特别强调的是ECU上下电流程的状态管理,具体可以简单概括为以下五个方面的内容:
在具体介绍上述5个状态管理过程之前,我们有必要对ECU启动过程有个总体的感性认识,以便于对后续各个阶段的之间的关系有个较为清晰的了解。
在上述的ECU启动过程中,可以看出ECU的一般启动过程涉及到Boot,C_Init, EcuM,OS等模块,在这些模块的共同接力下保证BSW及RTE成功初始化,进而使得整个SW-C处于正常running的过程。
ECU启动时,首先通过中断向量表运行引导程序(俗称BootLoader),Bootloader在满足一定条件下跳转至APP程序中的C_Init处并指向Main函数。
在Main函数中首先完成堆栈空间的初始化,然后调用EcuM_Init函数进入到后续的StartPreOS,StartOS阶段。
在开启OS的初始化函数中调用EcuM_StartupTwo进行第二启动阶段的初始化,最后就是进入StartPostOS阶段,如完成BswM模块的初始化,进而将控制权转交给BswM模块。
由于接力赛中首棒很关键,因此本文将重点关注EcuM模块的启动与关闭过程,按照AUTOSAR定义,EcuM可分为两种模式:Flexible与Fixed模式。
清晰的描述了EcuM Fixed模式下五种状态Startup,Shutdown,RUN,Sleep,Wakeup的状态组成以及状态切换的过程,其中OFF,Sleep,RUN是稳态,而Startup跟Wakeup则是暂态。
在Startup阶段,同样按照Flexible 模式中开启OS为界限,分为Startup I与Startup II两个阶段;
其中Sleep II阶段则为Polling阶段,这个阶段则会低功耗运行代码,并且等待唤醒事件,如果存在,则进入到Wakeup阶段。
Fixed与Flexible模式区别与联系,从上述EcuM Fixed Mode与Flexible Mode的描述,便可知两者存在着很多的相似点,同时也存在着彼此之间的差异,因此小T我将两者的区别与联系展现如下表1所示:
表1 EcuM Fixed与Flexible模式区别与联系
由上分析可知,EcuM Flexible可以兼容Fixed模式,是传统ECU的启动过程的扩展,也可理解Flexible是Fixed模式的更高一层抽象,Fixed则可以称作Flexible模式的一种表现形式。
同时Fixed模式明确了各个阶段的状态及状态切换过程,而Flexible则更为灵活,可以实现多核启动,局部快速启动等特性,为了更好的了解Flexible模式的启动思想,本文将以重点介绍Fixed模式下各状态机的状态机及切换过程,举一反三。
按照EcuM的主体功能,对应的将从以下五个过程来展开讲解EcuM Fixed Mode下的各状态机状态及状态切换过程。
Startup Sequence : 完成启动过程的初始化;
Run Sequence :正常运行及退出运行状态阶段
ShutDown Sequence:shutdown 或Reset ECU的阶段;
Sleep Sequence:ECU休眠阶段;
Wakeup Sequence: ECU 验证唤醒源阶段;
STARTUP阶段的目的就是初始化基础软件模块,主要可分为两个阶段:启动OS之前的初始化以及启动OS之后的初始化
通过调用EcuM_Init函数则进入到STARTUP I阶段,在该阶段主要会调用下列两个Callout函数完成OS启动前的初始化工作;
在STARTUP II阶段则是在start os函数中调用EcuM_AL_DriverInitTwo ,随后开启RTE,最后调用函数EcuM_AL_DriverInitThree最后初始化那些需要NVM数据的BSW模块。
表2 StartUp阶段驱动初始化列表
RUN阶段可以划分为以下两个阶段,一个是RUN II,表示正常工作状态,另一个是RUN III,表示为进入到ShutDown所作的前提准备
在RUN I阶段则表明已完成了所有BSW模块(包括OS及RTE)的初始化,开始运行SW-C程序。在该阶段,将主要完成以下几种操作:
当最后一个Run Request被释放之后,EcuM就会进入到RUN III阶段(即Post RUN 阶段)。在PostRUN主要完成以下几种操作:
在ShutDown阶段,主要根据ShutDown Target不同而进入不同的状态机处理流程。如下图5所示,总体上体现了根据Target不同而做出的不同状态机处理。
不管ShutDown Target是什么,都会经历PreShutdown阶段,进入到该阶段,主要完成以下操作:
在ShutDown阶段,ShutDown Target非常重要,因为其决定了ShutDown阶段应当走何种路线。ShutDown Target可分为以下三种:
当ShutDown Target为Sleep时,那么就会进入到Go Sleep阶段,在该阶段主要完成以下操作:
当ShutDown目标为OFF或者RESET时,则首先进入到该状态。在该阶段,主要完成以下几种操作:
当ShutDown Target为OFF或者RESET时,经过OFF I阶段就会最终调用EcuM_ShutDown进入到该阶段,在该阶段,主要完成以下几种操作:
当ShutDownTarget为Sleep,经历了Go Sleep阶段后,便会直接进入到Sleep阶段,Sleep阶段的总体流程
如果所有的RUN Request没有被释放,则不会进入到Sleep阶段,也就意味着进入到Sleep阶段了,表示当前已没有RUN Request。
在进入Sleep状态之前,EcuM模块应当将所有的通信接口处在Standby状态,且需要使能必要的Wakeup Source。
进入到Sleep模式后,可以选择MCU Halt模式,等待Wakeup Event触发,也可以选择Polling模式,主动查找当前有无唤醒事件,两者根据系统设计选择其中一种即可。
在Sleep I阶段,即Halt模式,在该低功耗模式下,无需运行代码,但需要存在某种CheckSum算法来保证唤醒前后RAM空间的数值不会遭到破坏。
即通过调用EcuM_GenerateRamHash生成对应的Hash值,接收到唤醒事件后,则调用EcuM_CheckRamHash来完成前后RAM一致性检查。
若一致,则进入到Wakeup阶段,若不一致,则调用Dem模块的Event ID来上报故障并触发重启来保证安全。
在Sleep II阶段,即Polling模式,在该低功耗模式下,会降低系统时钟频率来运行代码,并实时检查有没有相应的唤醒源。
通过调用Callout函数EcuM_SleepActivity以及EcuM_CheckWakeup来检查是否存在唤醒源。
无论是在Go Sleep阶段还是Sleep阶段或者是带有电源控制的唤醒阶段,如果监测到Wakeup Event就会进入到该阶段,目前Wakeup Sequence可以分为以下四个基本阶段:
当从Sleep状态进入到Wakeup阶段时,首先进入到Wakeup I阶段,在Wakeup I阶段主要完成以下几种操作:
当从Go Sleep或者通过待电源控制的唤醒条件下启动时,则会进入到该阶段,在该阶段主要会进行以下操作:
经过Wakeup Validation阶段后,肯定会进入到该阶段,在该阶段主要会进行以下几个操作:
当经过Wakeup Reaction之后,如果验证成功就会进入到该阶段,在该阶段主要完成以下几类操作:
为了更好的使用该模块函数以及遇到问题时方便调试该模块,特将BswM模块中较为重要的常用函数列举如下表3所示。
表3 EcuM模块常用函数列
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks ,Hyperworks, Protel,CAXA,OpenWorks LandMark,MATLAB,Enovia,Winchill,TeamCenter,MathCAD,Ansys, Abaqus,ls-dyna, Fluent, MSC,Bentley,License,UG,ug,catia,Dassault Systèmes,AutoDesk,Altair,autocad,PTC,SolidWorks,Ansys,Siemens PLM Software,Paradigm,Mathworks,Borland,AVEVA,ESRI,hP,Solibri,Progman,Leica,Cadence,IBM,SIMULIA,Citrix,Sybase,Schlumberger,MSC Products...