AUTOSAR的运行流程

AUTOSAR的运行流程


在这里插入图片描述

EXP:

不同于每一个Partition都需要有一个BswM实体,每个core上有一个Partition上跑OS和EcuM就可以了。

ENTRY(_START)

_START

.\MCAL\integration\Ssw\Ifx_Ssw_Tc0.c

__StartUpSoftware

.\MCAL\integration\Ssw\Ifx_Ssw_Tc0.c

__StartUpSoftware_Phase2-6

.\MCAL\integration\Ssw\Ifx_Ssw_Tc0.c

__Core0_start

.\MCAL\integration\Ssw\Ifx_Ssw_Tc0.c

  • core0_main();

    \src\INFRA\integration\src\Os_main.c

  • OS_MAIN();

    \src\INFRA\integration\src\Os_main.c
    //
    /* The main program */
    /
    /
    extern void SmuAlarm_Init(void);
    OS_MAIN()
    {

    unlock_wdtcon();

    Os_InitializeVectorTable();

    lock_wdtcon();

    EcuM_Init();
    }

  • EcuM_Init();【STARTUP I】

    \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Startup.c

    • EXP:
      当调用到EcuM_Init()时,EcuM开始接管ECU启动过程,并进行StartPreOS的操作。
      StartPreOS是来给OS初始化做准备的阶段,应当尽可能保证最短过程。在这个过程当中,不应当使用中断,如果一定需要使用,只允许一类中断。

    • EcuM_AL_SetProgrammableInterrupts();

      \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

    • EcuM_AL_DriverInitZero();

      \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

    • EcuM_DeterminePbConfiguration();

      \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

    • EcuM_Prv_PBPointerConsistencyCheck();

      \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

    • EcuM_AL_DriverInitOne();

      \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

      • Det_Init();
      • Mcu_Init();
      • McuFunc_InitializeClock();
      • Port_Init();
      • Gpt_Init();
      • Eth_17_GEthMac_Init();
      • Fls_17_Dmu_Init();
    • EcuM_Prv_SetDefined
      McuWakeupSource();

      \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

      • EcuM_SetWakeupEvent();

        \src\BSW\src\bsw\gen\EcuM\src\EcuM_WakeupServices.c

    • EcuM_Prv_StartSlaveCores();

      \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

      • StartCore
        ( cntrLoopCtr_u16, &dataStatus_chr)

        \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

    • EcuM_SwitchOsAppMode();

      \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

    • EcuM_Prv_StartOS();

      \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

      • StartOS
        ( EcuM_Rb_adrConfigPtr_st->DefaultAppMode )

        \src\BSW\src\BSW\Gen\EcuM\src\EcuM_Prv.c

        • StartupHook();
        • ActivateTask();

TASK(启动)

\src\INFRA\integration\src\Os_main.c

ECU_StartupTask();

\src\RTE\Ecu_StartupTask.c

  • EXP:
    当EcuM调用StartOS()时,EcuM会短暂释放控制权给到OS的启动。集成工程师需要实现一个OS任务能够被自动启动,并将EcuM_StartTwo作为它的第一个执行动作。

  • EcuM_StartupTwo();【STARTUP II】

    .\src\RTE\Ecu_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也仍未启动。

从EcuM的角度来说,ECU已经是运行状态,然而,接下来还会由BswM模块进行模式仲裁以及更多的BSW模块初始化,启动RTE,开始运行SWC。

以EB产品提供的demo为例,执行完EcuM_StartupTwo后,会初始化各个模块(例如通信协议栈模块,状态管理模块,内存管理模块等),并请求BswM进入到Startup Two A的状态
- BswM_Prv_CopyModeInitValues();
- BswM_Prv_CopyRuleInitSates();

  • SchM_IModeInit();

    \src\RTE\Ecu_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();

    \src\RTE\Ecu_StartupTask.c

    • BswM_Prv_ProcessDeferredReqst();
    • BswM_Prv_ProcessDelayedReqst();

RUN Sequence

RUN

  • RUN II

    • EXP:
      RUN II,表示正常工作状态.
      在RUN I阶段则表明已完成了所有BSW模块(包括OS及RTE)的初始化,开始运行SW-C程序。在该阶段,将主要完成以下几种操作:
  1. 通过调用函数ComM_CommunicationAllowed来使得相应的通信通道允许通信;
  2. 在该阶段,EcuM将允许保持一个最小的运行事件EcuMRunMinimumDuration,以便让SW-C有机会向EcuM模块请求RUN Request;
  3. 在该阶段也需要进行休眠总线的唤醒源验证工作;
  4. 除非没有通信请求,否则ComM不会释放RUN Request,也就不会退出RUN II阶段;
  • RUN III

    • EXP:
      RUN III,表示为进入到ShutDown所作的前提准备。
      当最后一个Run Request被释放之后,EcuM就会进入到RUN III阶段(即Post RUN 阶段)。在PostRUN主要完成以下几种操作:
  1. 在RUN III阶段,如果Sw-C请求PostRun,那么就会停留在该状态,SW-C可以运行其相应的代码如存储重要的数据等,直至释放PostRun Request;
  2. 若在该阶段存在RUN Request,那么就会立刻跳回到RUN II阶段;
  3. 若既不存在RUN Request,也不存在PostRun Reqest,那么就会直接进入到ShutDown阶段中的PreShutdown阶段;

ShutDown

  • PreShutdown

    • EXP:
      不管ShutDown Target是什么,都会经历PreShutdown阶段,进入到该阶段,主要完成以下操作:
  1. De_Init所有的SW-C,同时保证通信协议栈处于关闭状态。
  2. 清除所有的Wakeup Event;
    关闭Dem模块;
  3. 根据不同的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。
  • Go Sleep

    • EXP:
      当ShutDown Target为Sleep时,那么就会进入到Go Sleep阶段,在该阶段主要完成以下操作:
  1. 调用NvM_WriteAll函数完成写操作,同时开启NVM写超时计数器;
  2. 调用函数EcuM_EnableWakeupSources使能Wake up事件接收;
  3. 在该阶段,OS并没有关闭,处于正常Running状态;
  4. 若此阶段存在Pending Wakeup Event,则直接调用函数NvM_CancelWriteAll取消写操作,然后直接跳转Wakeup阶段的Wakup Validation子状态;
  5. 当Nvm_WriteAll成功执行完或者写超时,则直接进入到Sleep阶段
  • Go OFF I

    • EXP:
      当ShutDown目标为OFF或者RESET时,则首先进入到该状态。在该阶段,主要完成以下几种操作:
  1. 仅设置LIN的通信状态为FALSE;
  2. 完成ComM,BswM的Deinit操作;
  3. 调用NvM_WriteAll函数完成写操作,并开启写超时计数器;
  4. 等待NvM写成功或者NvM写超时,调用函数ShutdownOS关闭OS;
  5. 在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模式,主动查找当前有无唤醒事件,两者根据系统设计选择其中一种即可。
  • Sleep I

    • EXP:
      在Sleep I阶段,即Halt模式,在该低功耗模式下,无需运行代码,但需要存在某种CheckSum算法来保证唤醒前后RAM空间的数值不会遭到破坏。
      即通过调用EcuM_GenerateRamHash生成对应的Hash值,接收到唤醒事件后,则调用EcuM_CheckRamHash来完成前后RAM一致性检查。
      若一致,则进入到Wakeup阶段,若不一致,则调用Dem模块的Event ID来上报故障并触发重启来保证安全。
  • Sleep II

    • EXP:
      在Sleep II阶段,即Polling模式,在该低功耗模式下,会降低系统时钟频率来运行代码,并实时检查有没有相应的唤醒源。
      通过调用Callout函数EcuM_SleepActivity以及EcuM_CheckWakeup来检查是否存在唤醒源。

Wakeup

  • Wakeup One

    • EXP:
      当从Sleep状态进入到Wakeup阶段时,首先进入到Wakeup I阶段,在Wakeup I阶段主要完成以下几种操作:
  1. 设置MCU模式为Normal Mode;
  2. 抑制当前pending的Wakeup Event;
  3. 调用函数EcuM_AL_DriverRestart重新启动驱动,主要初始化Block I与Block II;
  4. 使能Run Reqest以及PostRun Request;
  5. 解锁Scheduler并可能重新运行OS;
  • Wakeup Validation

    • EXP:
      当从Go Sleep或者通过待电源控制的唤醒条件下启动时,则会进入到该阶段,在该阶段主要会进行以下操作:
  1. 获取当前Pending Wakeup Event并调用函数2. EcuM_ValidateWakeupEvent开启验证;
  2. 如果validate超时,则可以通过调用函数EcuM_StopWakeupSources停止验证工作;
    在该阶段,存在以下5种唤醒源在任何时刻都无需验证:
    WKSOURCE_POWER;
    WKSOURCE_RESET
    WKSOURCE_INTERNAL_RESET;
    WKSOURCE_INTERNAL_WDG ;
    WKSOURCE_EXTERNAL_WDG;
  • Wakeup Reaction

    • EXP:
      经过Wakeup Validation阶段后,肯定会进入到该阶段,在该阶段主要会进行以下几个操作:
  1. 根据event Validation之后的结果选择进入不同的阶段,一种是验证有效,进入RUN II阶段,另外一种是验证无效,进入Go Sleep阶段;
  • Wakeup Two

    • EXP:
      当经过Wakeup Reaction之后,如果验证成功就会进入到该阶段,在该阶段主要完成以下几类操作:
  1. 如果是从Sleep阶段跳转至该阶段,则首先要调用Dem_Init函数来完成Dem模块初始化,因为是新一轮operation cycle;
  2. 如果是从Startup阶段跳转至该阶段,则可能需要等待NvM readall操作完成;
  3. 最后可直接跳转至RUN II阶段直接运行;

《AUTOSAR谱系分解(ETAS工具链)》之总目录

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值