知荐 | AUTOSAR基础篇之EcuM
前言
ECU是怎么启动或关闭的呢?
ECU启动方式有没有一般规律呢?
按照AUTOSAR标准,ECU启动过程又可分为哪几个阶段呢?
。。。。。。
正文
EcuM模块总体介绍
主要功能
Startup 初始化流程状态管理;
ECU运行状态管理;
ShutDown流程状态管理;
Sleep流程状态管理
Wakeup Source管理;
总状态机(Flexible 与 Fixed)
Flexible 总状态机,如下图2-1所示:
Fixed 总状态机,如下图2-2所示:
Startup Sequence : 完成启动过程的初始化;
Run Sequence :正常运行及退出运行状态阶段
ShutDown Sequence:shutdown 或Reset ECU的阶段;
Sleep Sequence:ECU休眠阶段;
Wakeup Sequence: ECU 验证唤醒源阶段;
Startup Sequence
STARTUP I
EcuM_AL_DriverInitZero:完成无需OS支持的底层硬件驱动的初始化或者其他低水平的初始化(无需postconfig),将这部分驱动的初始化称为Init Block 0;
EcuM_AL_DriverInitOne:完成无需OS支持的底层硬件驱动的初始化或者其他低水平的初始化,将这部分驱动的初始化称为Init Block 1;
STARTUP II
EcuM_AL_DriverInitTwo :需要OS支持但是无需使用NVM的BSW模块初始化,并将此部分驱动的初始化称为Init Block II;
EcuM_AL_DriverInitThree:需要OS支持同时也需要使用NVM的BSW模块初始化,并将此部分驱动的初始化称为Init Block III;
RUN Sequence
RUN II
通过调用函数ComM_CommunicationAllowed来使得相应的通信通道允许通信;
在该阶段,EcuM将允许保持一个最小的运行事件EcuMRunMinimumDuration,以便让SW-C有机会向EcuM模块请求RUN Request;
在该阶段也需要进行休眠总线的唤醒源验证工作;
除非没有通信请求,否则ComM不会释放RUN Request,也就不会退出RUN II阶段;
RUN III
在RUN III阶段,如果Sw-C请求PostRun,那么就会停留在该状态,SW-C可以运行其相应的代码如存储重要的数据等,直至释放PostRun Request;
若在该阶段存在RUN Request,那么就会立刻跳回到RUN II阶段;
若既不存在RUN Request,也不存在PostRun Reqest,那么就会直接进入到ShutDown阶段中的PreShutdown阶段;
ShutDown Sequence
De_Init所有的SW-C,同时保证通信协议栈处于关闭状态。
清除所有的Wakeup Event;
关闭Dem模块;
根据不同的ShutDown目标进入不同的状态(Sleep或者OFF或者Reset);
ShutDown Target
OFF:CPU掉电;
RESET:这属于一个暂态,CPU Reset;
Sleep:CPU处于低功耗状态,未掉电;
Go Sleep
调用NvM_WriteAll函数完成写操作,同时开启NVM写超时计数器;
调用函数EcuM_EnableWakeupSources使能Wake up事件接收;
在该阶段,OS并没有关闭,处于正常Running状态;
若此阶段存在Pending Wakeup Event,则直接调用函数NvM_CancelWriteAll取消写操作,然后直接跳转Wakeup阶段的Wakup Validation子状态;
当Nvm_WriteAll成功执行完或者写超时,则直接进入到Sleep阶段;
Go OFF I
仅设置LIN的通信状态为FALSE;
完成ComM,BswM的Deinit操作;
调用NvM_WriteAll函数完成写操作,并开启写超时计数器;
等待NvM写成功或者NvM写超时,调用函数ShutdownOS关闭OS;
在ShutDown OS的过程中通过shutdown hook函数调用EcuM_ShutDown来进入OFF II阶段;
Go OFF II
如果ShutDown Target是OFF,则调用Callout函数EcuM_AL_SwitchOff来直接断掉CPU供电;
如果ShutDown Target是RESET,则调用Callout函数EcuM_AL_Reset进而调用MCAL标准函数Mcu_PerformReset来重启CPU;
Sleep Sequence
Sleep I
Sleep II
Wakeup Sequence
Wakeup One:
Wakeup Validation
Wakeup Reaction:
Wakeup Two:
Wakeup I
设置MCU模式为Normal Mode;
抑制当前pending的Wakeup Event;
调用函数EcuM_AL_DriverRestart重新启动驱动,主要初始化Block I与Block II;
使能Run Reqest以及PostRun Request;
解锁Scheduler并可能重新运行OS;
Wakeup Validation
获取当前Pending Wakeup Event并调用函数EcuM_ValidateWakeupEvent开启验证;
如果validate超时,则可以通过调用函数EcuM_StopWakeupSources停止验证工作;
在该阶段,存在以下5种唤醒源在任何时刻都无需验证:
WKSOURCE_POWER;
WKSOURCE_RESET
WKSOURCE_INTERNAL_RESET;
WKSOURCE_INTERNAL_WDG ;
WKSOURCE_EXTERNAL_WDG;
Wakeup Reaction
根据event Validation之后的结果选择进入不同的阶段,一种是验证有效,进入RUN II阶段,另外一种是验证无效,进入Go Sleep阶段;
Wakeup II
如果是从Sleep阶段跳转至该阶段,则首先要调用Dem_Init函数来完成Dem模块初始化,因为是新一轮operation cycle;
如果是从Startup阶段跳转至该阶段,则可能需要等待NvM readall操作完成;
最后可直接跳转至RUN II阶段直接运行;
常用函数接口
表3 EcuM模块常用函数列