首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

AUTOSAR的运行流程

  • 23-11-14 08:23
  • 4085
  • 5125
blog.csdn.net

AUTOSAR的运行流程

文章目录

  • AUTOSAR的运行流程
    • EXP:
    • ENTRY(_START)
      • _START
      • __StartUpSoftware
      • __StartUpSoftware_Phase2-6
      • __Core0_start
    • TASK(启动)
      • ECU_StartupTask();
    • RUN Sequence
      • RUN
      • ShutDown
      • Sleep
      • Wakeup

在这里插入图片描述

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也仍未启动。

从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程序。在该阶段,将主要完成以下几种操作:
  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工具链)》之总目录

注:本文转载自blog.csdn.net的PlutoZuo的文章"https://blog.csdn.net/PlutoZuo/article/details/131089815"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top