AUTOSAR的运行流程

EXP:
不同于每一个Partition都需要有一个BswM实体,每个core上有一个Partition上跑OS和EcuM就可以了。
ENTRY(_START)
_START
.MCALintegrationSswIfx_Ssw_Tc0.c
__StartUpSoftware
.MCALintegrationSswIfx_Ssw_Tc0.c
__StartUpSoftware_Phase2-6
.MCALintegrationSswIfx_Ssw_Tc0.c
__Core0_start
.MCALintegrationSswIfx_Ssw_Tc0.c
-
core0_main();
srcINFRAintegrationsrcOs_main.c
-
OS_MAIN();
srcINFRAintegrationsrcOs_main.c
//
/* The main program */
//
extern void SmuAlarm_Init(void);
OS_MAIN()
{unlock_wdtcon();
Os_InitializeVectorTable();
lock_wdtcon();
EcuM_Init();
} -
EcuM_Init();【STARTUP I】
srcBSWsrcBSWGenEcuMsrcEcuM_Startup.c
-
EXP:
当调用到EcuM_Init()时,EcuM开始接管ECU启动过程,并进行StartPreOS的操作。
StartPreOS是来给OS初始化做准备的阶段,应当尽可能保证最短过程。在这个过程当中,不应当使用中断,如果一定需要使用,只允许一类中断。 -
EcuM_AL_SetProgrammableInterrupts();
srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
-
EcuM_AL_DriverInitZero();
srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
-
EcuM_DeterminePbConfiguration();
srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
-
EcuM_Prv_PBPointerConsistencyCheck();
srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
-
EcuM_AL_DriverInitOne();
srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
- Det_Init();
- Mcu_Init();
- McuFunc_InitializeClock();
- Port_Init();
- Gpt_Init();
- Eth_17_GEthMac_Init();
- Fls_17_Dmu_Init();
-
EcuM_Prv_SetDefined
McuWakeupSource();srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
-
EcuM_SetWakeupEvent();
srcBSWsrcswgenEcuMsrcEcuM_WakeupServices.c
-
-
EcuM_Prv_StartSlaveCores();
srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
-
StartCore
( cntrLoopCtr_u16, &dataStatus_chr)srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
-
-
EcuM_SwitchOsAppMode();
srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
-
EcuM_Prv_StartOS();
srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
-
StartOS
( EcuM_Rb_adrConfigPtr_st->DefaultAppMode )srcBSWsrcBSWGenEcuMsrcEcuM_Prv.c
- StartupHook();
- ActivateTask();
-
-
TASK(启动)
srcINFRAintegrationsrcOs_main.c
ECU_StartupTask();
srcRTEEcu_StartupTask.c
-
EXP:
当EcuM调用StartOS()时,EcuM会短暂释放控制权给到OS的启动。集成工程师需要实现一个OS任务能够被自动启动,并将EcuM_StartTwo作为它的第一个执行动作。 -
EcuM_StartupTwo();【STARTUP II】
.srcRTEEcu_StartupTask.c
-
EXP:
执行到EcuM_StartupTwo后,开始了StartPostOS过程。
首先,需要启动BSW调度表,然后初始化BswM模块,初始化BSW调度表,最后开启调度表计时器,开始执行BSW或者SWC的周期事件。 -
SchM_Init();
-
SchM_IModeInit();
- BswM_Cfg_DfrdBswNotification_BswM_MRP_BswM_MDG_ECUM_STATE_STARTUP_ONE();
-
-
BswM_Init
(EcuM_Rb_adrConfigPtr_st->ModuleInitPtrPB.BswM_InitConfigPtr_cpst);- EXP:
当BSW调度表启动,BswM_Init被调用,我们可以认为进入了运行阶段。不过此时内存管理模块还没有初始化,也没有启动通信协议栈,RTE和SWC也仍未启动。
- EXP:
-
从EcuM的角度来说,ECU已经是运行状态,然而,接下来还会由BswM模块进行模式仲裁以及更多的BSW模块初始化,启动RTE,开始运行SWC。
以EB产品提供的demo为例,执行完EcuM_StartupTwo后,会初始化各个模块(例如通信协议栈模块,状态管理模块,内存管理模块等),并请求BswM进入到Startup Two A的状态
- BswM_Prv_CopyModeInitValues();
- BswM_Prv_CopyRuleInitSates();
-
SchM_IModeInit();
srcRTEEcu_StartupTask.c
-
BswM_Cfg_DfrdBswNotification_BswM_MRP_BswM_MDG_ECUM_STATE_STARTUP_ONE();
-
BswM_RequestMode( BSWM_CFG_USERID_BSWM_MRP_BSWM_MDG, /* user / RTE_MODE_MDG_ECUM_STATE_ECUM_STATE_STARTUP_ONE ); / mode */
-
BswM_Prv_RuleEval();
-
BswM_Prv_Arbitrate_Rule();
-
BswM_Prv_Evaluate_Rule();
-
BswM_Prv_Evaluate_ActionList();
-
BswM_Prv_Evaluate_Action();
-
BswM_Prv_AC_BswMActionFunction_FunPtr_cafctisActionType_en;
static CONST(BswM_Action_FuncPtr_t, BSWM_CONST) BswM_Prv_AC_BswMActionFunction_FunPtr_cafct[BSWM_ACTIONLIST_SIZE] =
{
NULL_PTR, /*ActionPointer pointing to NULL as we dont refer to ACTIONLIST here */
&BswM_Prv_Action_ComMAllowCom, /*Action Function corresponding to enum BSWM_ACTION_COMM_ALLOW_COM */
&BswM_Prv_Action_ComMModeLimit, /*Action Function corresponding to enum BSWM_ACTION_COMM_MODE_LMTN */
&BswM_Prv_Action_ComMModeSwitch, /*Action Function corresponding to enum BSWM_ACTION_COMM_MODE_SWITCH */
&BswM_Prv_Action_DeadlineMntCtrl, /*Action Function corresponding to enum BSWM_ACTION_DEADLINE_MNT_CTRL */
&BswM_Prv_Action_EcuMStateSwitch, /Action Function corresponding to enum BswM_Prv_ActionECUM_STATE_SWITCH/
&BswM_Prv_Action_EthIfSwitchPortGroup,
&BswM_Prv_Action_J1939DcmStateSwitch, /*Action Function corresponding to enum BSWM_ACTION_J1939DCM_STATE_SWITCH */
&BswM_Prv_Action_J1939RmStateSwitch, /*Action Function corresponding to enum BSWM_ACTION_J1939RM_STATE_SWITCH */
&BswM_Prv_Action_LINScheduleSwitch, /*Action Function corresponding to enum BSWM_ACTION_LIN_SCHDL_SWITCH */
&BswM_Prv_Action_NmControl, /*Action Function corresponding to enum BSWM_ACTION_NM_CNTRL */
&BswM_Prv_Action_BswMPduGroupSwitch, /*Action Function corresponding to enum BSWM_ACTION_PDU_GRP_SWITCH */
&BswM_Prv_Action_PduRGrpCtrl, /*Action Function corresponding to enum BSWM_ACTION_PDU_ROUTER_CNTRL */
&BswM_Prv_Action_RteModeRequest, /*Action Function corresponding to enum BSWM_ACTION_RTE_MODE_REQUEST */
&BswM_Prv_Action_RteSwitch, /*Action Function corresponding to enum BSWM_ACTION_RTE_SWITCH */
&BswM_Prv_Action_SchMSwitch, /*Action Function corresponding to enum BSWM_ACTION_SCHM_SWITCH */
&BswM_Prv_Action_SdClientServiceModeRequest, /Action Function corresponding to enum BswM_Prv_ActionSD_CLNT_SERV_MODE_REQ/
&BswM_Prv_Action_SdConsumedEventGroupModeRequest, /Action Function corresponding to enum BswM_Prv_ActionSD_CNSMD_EVNT_GRP_MODE_REQ/
&BswM_Prv_Action_SdServerServiceModeRequest, /Action Function corresponding to enum BswM_Prv_ActionSD_SERVR_SERV_MODE_REQ/
&BswM_Prv_Action_BswMSwitchIPduMode, /*Action Function corresponding to enum BSWM_ACTION_SWITCH_IPDU_MODE */
&BswM_Prv_Action_BswMTriggerIPduSend, /*Action Function corresponding to enum BSWM_ACTION_TRIG_IPDU_SEND */
&BswM_Prv_Action_UserCallout, /Action Function corresponding to enum BSWM_ACTION_USR_CALLOUT/
&BswM_Prv_Action_RbSwcUserCallout /Action Function corresponding to enum BSWM_ACTION_RB_SWC_USR_CALLOUT/
}; -
BswM_Prv_AC_BswMActionFunction_FunPtr_cafct[BSWM_ACTIONLIST_SIZE]
- NULL_PTR,
- &BswM_Prv_Action_ComMAllowCom,
- &BswM_Prv_Action_ComMModeLimit,
- &BswM_Prv_Action_ComMModeSwitch,
- &BswM_Prv_Action_DeadlineMntCtrl,
- &BswM_Prv_Action_EcuMStateSwitch,
- &BswM_Prv_Action_EthIfSwitchPortGroup,
- &BswM_Prv_Action_J1939DcmStateSwitch,
- &BswM_Prv_Action_J1939RmStateSwitch,
- &BswM_Prv_Action_LINScheduleSwitch,
- &BswM_Prv_Action_NmControl,
- &BswM_Prv_Action_BswMPduGroupSwitch,
- &BswM_Prv_Action_PduRGrpCtrl,
- &BswM_Prv_Action_RteModeRequest,
- &BswM_Prv_Action_RteSwitch,
- &BswM_Prv_Action_SchMSwitch,
- &BswM_Prv_Action_SdClientServiceModeRequest,
- &BswM_Prv_Action_SdConsumedEventGroupModeRequest,
- &BswM_Prv_Action_SdServerServiceModeRequest,
- &BswM_Prv_Action_BswMSwitchIPduMode,
- &BswM_Prv_Action_BswMTriggerIPduSend,
- &BswM_Prv_Action_UserCallout,
- &BswM_Prv_Action_RbSwcUserCallout
-
-
-
-
BswM_MainFunction();
srcRTEEcu_StartupTask.c
- BswM_Prv_ProcessDeferredReqst();
- BswM_Prv_ProcessDelayedReqst();
RUN Sequence
RUN
-
RUN II
- EXP:
RUN II,表示正常工作状态.
在RUN I阶段则表明已完成了所有BSW模块(包括OS及RTE)的初始化,开始运行SW-C程序。在该阶段,将主要完成以下几种操作:
- EXP:
- 通过调用函数ComM_CommunicationAllowed来使得相应的通信通道允许通信;
- 在该阶段,EcuM将允许保持一个最小的运行事件EcuMRunMinimumDuration,以便让SW-C有机会向EcuM模块请求RUN Request;
- 在该阶段也需要进行休眠总线的唤醒源验证工作;
- 除非没有通信请求,否则ComM不会释放RUN Request,也就不会退出RUN II阶段;
-
RUN III
- EXP:
RUN III,表示为进入到ShutDown所作的前提准备。
当最后一个Run Request被释放之后,EcuM就会进入到RUN III阶段(即Post RUN 阶段)。在PostRUN主要完成以下几种操作:
- EXP:
- 在RUN III阶段,如果Sw-C请求PostRun,那么就会停留在该状态,SW-C可以运行其相应的代码如存储重要的数据等,直至释放PostRun Request;
- 若在该阶段存在RUN Request,那么就会立刻跳回到RUN II阶段;
- 若既不存在RUN Request,也不存在PostRun Reqest,那么就会直接进入到ShutDown阶段中的PreShutdown阶段;
ShutDown
-
PreShutdown
- EXP:
不管ShutDown Target是什么,都会经历PreShutdown阶段,进入到该阶段,主要完成以下操作:
- EXP:
- De_Init所有的SW-C,同时保证通信协议栈处于关闭状态。
- 清除所有的Wakeup Event;
关闭Dem模块; - 根据不同的ShutDown目标进入不同的状态(Sleep或者OFF或者Reset);
-
ShutDown Target
- EXP:
在ShutDown阶段,ShutDown Target非常重要,因为其决定了ShutDown阶段应当走何种路线。ShutDown Target可分为以下三种:
OFF:CPU掉电;
RESET:这属于一个暂态,CPU Reset;
Sleep:CPU处于低功耗状态,未掉电;
默认的ShutDown Target可以通过配置得到,当然SW-C可以直接调用函数接口 EcuM_SelectShutdownTarget来覆盖掉默认的ShutDown Target。
- EXP:
-
Go Sleep
- EXP:
当ShutDown Target为Sleep时,那么就会进入到Go Sleep阶段,在该阶段主要完成以下操作:
- EXP:
- 调用NvM_WriteAll函数完成写操作,同时开启NVM写超时计数器;
- 调用函数EcuM_EnableWakeupSources使能Wake up事件接收;
- 在该阶段,OS并没有关闭,处于正常Running状态;
- 若此阶段存在Pending Wakeup Event,则直接调用函数NvM_CancelWriteAll取消写操作,然后直接跳转Wakeup阶段的Wakup Validation子状态;
- 当Nvm_WriteAll成功执行完或者写超时,则直接进入到Sleep阶段
-
Go OFF I
- EXP:
当ShutDown目标为OFF或者RESET时,则首先进入到该状态。在该阶段,主要完成以下几种操作:
- EXP:
- 仅设置LIN的通信状态为FALSE;
- 完成ComM,BswM的Deinit操作;
- 调用NvM_WriteAll函数完成写操作,并开启写超时计数器;
- 等待NvM写成功或者NvM写超时,调用函数ShutdownOS关闭OS;
- 在ShutDown OS的过程中通过shutdown hook函数调用EcuM_ShutDown来进入OFF II阶段;
- Go OFF II
Sleep
-
PreSleep
- EXP:
在进入Sleep状态之前,EcuM模块应当将所有的通信接口处在Standby状态,且需要使能必要的Wakeup Source。
进入到Sleep模式后,可以选择MCU Halt模式,等待Wakeup Event触发,也可以选择Polling模式,主动查找当前有无唤醒事件,两者根据系统设计选择其中一种即可。
- EXP:
-
Sleep I
- EXP:
在Sleep I阶段,即Halt模式,在该低功耗模式下,无需运行代码,但需要存在某种CheckSum算法来保证唤醒前后RAM空间的数值不会遭到破坏。
即通过调用EcuM_GenerateRamHash生成对应的Hash值,接收到唤醒事件后,则调用EcuM_CheckRamHash来完成前后RAM一致性检查。
若一致,则进入到Wakeup阶段,若不一致,则调用Dem模块的Event ID来上报故障并触发重启来保证安全。
- EXP:
-
Sleep II
- EXP:
在Sleep II阶段,即Polling模式,在该低功耗模式下,会降低系统时钟频率来运行代码,并实时检查有没有相应的唤醒源。
通过调用Callout函数EcuM_SleepActivity以及EcuM_CheckWakeup来检查是否存在唤醒源。
- EXP:
Wakeup
-
Wakeup One
- EXP:
当从Sleep状态进入到Wakeup阶段时,首先进入到Wakeup I阶段,在Wakeup I阶段主要完成以下几种操作:
- EXP:
- 设置MCU模式为Normal Mode;
- 抑制当前pending的Wakeup Event;
- 调用函数EcuM_AL_DriverRestart重新启动驱动,主要初始化Block I与Block II;
- 使能Run Reqest以及PostRun Request;
- 解锁Scheduler并可能重新运行OS;
-
Wakeup Validation
- EXP:
当从Go Sleep或者通过待电源控制的唤醒条件下启动时,则会进入到该阶段,在该阶段主要会进行以下操作:
- EXP:
- 获取当前Pending Wakeup Event并调用函数2. EcuM_ValidateWakeupEvent开启验证;
- 如果validate超时,则可以通过调用函数EcuM_StopWakeupSources停止验证工作;
在该阶段,存在以下5种唤醒源在任何时刻都无需验证:
WKSOURCE_POWER;
WKSOURCE_RESET
WKSOURCE_INTERNAL_RESET;
WKSOURCE_INTERNAL_WDG ;
WKSOURCE_EXTERNAL_WDG;
-
Wakeup Reaction
- EXP:
经过Wakeup Validation阶段后,肯定会进入到该阶段,在该阶段主要会进行以下几个操作:
- EXP:
- 根据event Validation之后的结果选择进入不同的阶段,一种是验证有效,进入RUN II阶段,另外一种是验证无效,进入Go Sleep阶段;
-
Wakeup Two
- EXP:
当经过Wakeup Reaction之后,如果验证成功就会进入到该阶段,在该阶段主要完成以下几类操作:
- EXP:
- 如果是从Sleep阶段跳转至该阶段,则首先要调用Dem_Init函数来完成Dem模块初始化,因为是新一轮operation cycle;
- 如果是从Startup阶段跳转至该阶段,则可能需要等待NvM readall操作完成;
- 最后可直接跳转至RUN II阶段直接运行;
评论记录:
回复评论: