[AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现

news2025/2/1 14:06:30

目录

  • 关键词
  • 平台说明
  • 前言
  • 一、总体流程
  • 二、配置
    • 2.1 DCM and DEM
    • 2.2 BSWM
      • 2.2.1 Mode Notifaication Port
      • 2.2.2 Rules
    • 2.3 service port
      • 2.3.1 做好DCM-->BSWM 和DCM -->SWC_Diag 的server port mapping
      • 2.3.2 做好BSWM ESH_ModeNotification 的server port mapping
    • 2.4 SWC 中mapping DcmEcuReset port
  • 三、code
    • 3.1 BswM
      • 3.1.1判定从Dcm传过来的复位模式设定请求
      • 3.1.2 执行设置下电模式和操作
  • 3.2 Dcm
  • 3.3 Rte
  • 3.4 EcuM

  

关键词

嵌入式、C语言、autosar、EcuM、Rte、BswM

平台说明

项目Value
OSautosar OS
autosar厂商vector
芯片厂商TI
编程语言C,C++
编译器HighTec (GCC)

在这里插入图片描述

前言

本文档主要描述了如何实现Dcm实现复位的流程(hardwareReset)

一、总体流程

二、配置

在这里插入图片描述

2.1 DCM and DEM

在DcmDsdService中配置好复位服务

在这里插入图片描述

2.2 BSWM

2.2.1 Mode Notifaication Port

DcmEcuReset是基于Dcm的标准接口,如果没有自动生成请手动创建。

在这里插入图片描述

2.2.2 Rules

创建对应的expression、action、actionlist和rules用于当诊断触发时的操作。

在这里插入图片描述

2.3 service port

2.3.1 做好DCM–>BSWM 和DCM -->SWC_Diag 的server port mapping

在这里插入图片描述

2.3.2 做好BSWM ESH_ModeNotification 的server port mapping

在这里插入图片描述

2.4 SWC 中mapping DcmEcuReset port

后续SWC_Diag runnable 操作和触发是模式进入决定还是其他由开发者决定。

在这里插入图片描述

三、code

3.1 BswM

3.1.1判定从Dcm传过来的复位模式设定请求

BSWM_LOCAL FUNC(BswM_HandleType, BSWM_CODE) BswM_Rule_BswMRule_DcmEcuResetHard(BswM_PCPartitionConfigIdxOfPartitionIdentifiersType partitionIdx)
{
  BswM_HandleType retVal = BSWM_NO_ACTIONLIST(partitionIdx);
  /* Evaluate logical expression LE_BswMRule_DcmEcuResetHard. */
  if(BswM_Mode_Notification_DcmEcuReset_DcmEcuReset == RTE_MODE_DcmEcuReset_HARD)
  {
    if( BswM_GetRuleStates(BSWM_ID_RULE_BswMRule_DcmEcuResetHard, partitionIdx) != BSWM_TRUE ) /* COV_BSWM_TRIGGEREDRULEEXECUTION */
    {
      BswM_UpdateRuleStates(BSWM_ID_RULE_BswMRule_DcmEcuResetHard, BSWM_TRUE, partitionIdx);
      /* Return triggered action list BswM_ActionList_AL_DcmEcuResetHardActions. */
      retVal = BSWM_ID_AL_AL_DcmEcuResetHardActions;
    }
  }
  else
  {
    BswM_UpdateRuleStates(BSWM_ID_RULE_BswMRule_DcmEcuResetHard, BSWM_FALSE, partitionIdx);
    /* No false action list configured. */
  }
  BSWM_DUMMY_STATEMENT(partitionIdx); /* PRQA S 1338, 2983, 3112 */ /* MD_MSR_DummyStmt */
  return retVal;
}

3.1.2 执行设置下电模式和操作

BSWM_LOCAL FUNC(Std_ReturnType, BSWM_CODE) BswM_ActionList_AL_DcmEcuResetHardActions(BswM_PCPartitionConfigIdxOfPartitionIdentifiersType partitionIdx)
{
  /*lint -save -e534 *//* PRQA S 3109, 3200 1 */ /* MD_MSR_14.3, MD_BSWM_3200 */
  Dem_Shutdown();
  /*lint -restore */
  BswM_UpdateTimer(partitionIdx, BSWM_TMR_ESH_NvM_WriteAllTimer, 6000u);
  /*lint -save -e534 *//* PRQA S 3109, 3200 1 */ /* MD_MSR_14.3, MD_BSWM_3200 */
  NvM_WriteAll();
  /*lint -restore */
  (void)EcuM_SelectShutdownTarget(ECUM_STATE_RESET, EcuMConf_EcuMResetMode_ECUM_RESET_IO);
  BSWM_DUMMY_STATEMENT(partitionIdx); /* PRQA S 1338, 2983, 3112 */ /* MD_MSR_DummyStmt */
  return E_OK;
}/* PRQA S 6010, 6030, 6050 */ /* MD_MSR_STPTH, MD_MSR_STCYC, MD_MSR_STCAL */

3.2 Dcm

调用0x11服务触发。
/*! Service 0x11 sub-service properties table  */
CONST(Dcm_CfgSvc11SubFuncInfoType, DCM_CONST) Dcm_CfgSvc11SubFuncInfo[4]=
{
   { Dcm_Service11_01Processor} /* SF: 0x01 */
  ,{ Dcm_Service11_03Processor} /* SF: 0x03 */
  ,{ Dcm_Service11_04Processor} /* SF: 0x04 */
  ,{ Dcm_Service11_05Processor} /* SF: 0x05 */
};

3.3 Rte

数据传递:Dcm – > BswM,Dcm --> SWC_diag, BswM – >EcuM

FUNC(Dcm_EcuResetType, RTE_CODE) Rte_Mode_BswM_Notification_DcmEcuReset_DcmEcuReset(void) /* PRQA S 3408 */ /* MD_Rte_3408 */
{
  Dcm_EcuResetType curMode;
  if (Rte_AckFlags.Rte_ModeSwitchAck_Dcm_DcmEcuReset_DcmEcuReset_Ack == 0U)
  {
    curMode = RTE_TRANSITION_BswM_DcmEcuReset;
  }
  else
  {
    curMode = Rte_ModeMachine_Dcm_DcmEcuReset_DcmEcuReset;
  }
  return curMode;
}

FUNC(Std_ReturnType, RTE_CODE) Rte_Switch_Dcm_DcmEcuReset_DcmEcuReset(Dcm_EcuResetType nextMode) /* PRQA S 1505 */ /* MD_MSR_Rule8.7 */
{
  Std_ReturnType ret = RTE_E_OK; /* PRQA S 2981 */ /* MD_MSR_RetVal */

  uint8 internalIndexNextMode = Rte_GetInternalModeIndex_Dcm_DcmEcuReset(nextMode);
  uint8 internalIndexCurrentMode;
  Dcm_EcuResetType currentMode;
  SuspendOSInterrupts();
  currentMode = Rte_ModeMachine_Dcm_DcmEcuReset_DcmEcuReset;
  internalIndexCurrentMode = Rte_GetInternalModeIndex_Dcm_DcmEcuReset(currentMode);
  if (internalIndexNextMode >= 7U)
  {
    ResumeOSInterrupts();
    Rte_CallDetReportError(RTE_SWITCH_SERVICE_ID, RTE_E_DET_MODEARGUMENT);
    ret = RTE_E_LIMIT;
  }
  else if (Rte_AckFlags.Rte_ModeSwitchAck_Dcm_DcmEcuReset_DcmEcuReset_Ack == 0U)
  {
    ret = RTE_E_LIMIT;
    ResumeOSInterrupts();
  }
  else if (internalIndexCurrentMode >= 7U)
  {
    ResumeOSInterrupts();
    Rte_CallDetReportError(RTE_SWITCH_SERVICE_ID, RTE_E_DET_MODESTATE);
    ret = RTE_E_LIMIT;
  }
  else
  {
    Rte_EventMaskType ModeSwitchEventMask;

    ModeSwitchEventMask = Rte_GetModeEntryEventMask_Dcm_DcmEcuReset_DcmEcuReset(internalIndexNextMode); /* PRQA S 2986 */ /* MD_Rte_2986 */

    if (ModeSwitchEventMask != (Rte_EventMaskType)0)
    {
      ret = Rte_IocSend_Rte_M_Dcm_DcmEcuReset_DcmEcuReset(nextMode);

      Rte_AckFlags.Rte_ModeSwitchAck_Dcm_DcmEcuReset_DcmEcuReset_Ack = 0U;
      ResumeOSInterrupts();

      (void)ActivateTask(Mode_Task); /* PRQA S 3417 */ /* MD_Rte_Os */
    }
    else
    {
      Rte_ModeMachine_Dcm_DcmEcuReset_DcmEcuReset = nextMode;
      Rte_AckFlags.Rte_ModeSwitchAck_Dcm_DcmEcuReset_DcmEcuReset_Ack = 1U;
      ResumeOSInterrupts();
    }
  }

  return ret;
} /* PRQA S 6010, 6030, 6050, 6080 */ /* MD_MSR_STPTH, MD_MSR_STCYC, MD_MSR_STCAL, MD_MSR_STMIF */
FUNC(Dcm_EcuResetType, RTE_CODE) Rte_Mode_BswM_Notification_DcmEcuReset_DcmEcuReset(void) /* PRQA S 3408 */ /* MD_Rte_3408 */
{
  Dcm_EcuResetType curMode;
  curMode = Rte_ModeMachine_Dcm_DcmEcuReset_DcmEcuReset;
  return curMode;
}

3.4 EcuM

设置下电和复位模式

FUNC(Std_ReturnType, ECUM_CODE) EcuM_SelectShutdownTarget(VAR(EcuM_StateType, AUTOMATIC) targetState,
VAR(EcuM_ModeType, AUTOMATIC) resetSleepMode)
{
  /* ----- Local Variables ---------------------------------------------- */
  uint8 errorId = ECUM_E_NO_ERROR;
  Std_ReturnType retval;

  /* ----- Development Error Checks ------------------------------------- */
  /* #21 Check the current state of the EcuM. */
#if (ECUM_DEV_ERROR_DETECT == STD_ON)
  if ((EcuM_GetModuleState() < ECUM_STATE_STARTUP_TWO) || (EcuM_GetModuleState() > ECUM_STATE_APP_RUN))
  {
    errorId = ECUM_E_MODULE_NOT_IN_RUN_STATE;
    retval = E_NOT_OK;
  }
  else
  /* #22 Check if the parameters targetState and resetSleepMode are in a valid range.  */
  /* if (STATE == RESET AND ResetMode in Range) OR
   *     STATE == SLEEP AND SleepMode in Range) OR
   *     STATE == OFF)
   */
#endif
  if (
      /* Check for a valid state parameter */
      ((targetState != (EcuM_StateType) ECUM_STATE_OFF) && (targetState != (EcuM_StateType) ECUM_STATE_RESET)
          && (targetState != (EcuM_StateType) ECUM_STATE_SLEEP))
#if(ECUM_RESETMODECOUNT != 0u)
      ||
      /* Check for a valid reset mode parameter */
      ((targetState == (EcuM_StateType) ECUM_STATE_RESET) && (resetSleepMode >= ECUM_RESETMODECOUNT))
#endif
#if(ECUM_SLEEPMODELIST == STD_ON)
      ||
      /* Check for a valid sleep mode parameter */
      ((targetState == (EcuM_StateType) ECUM_STATE_SLEEP) && (resetSleepMode >= EcuM_GetSizeOfSleepModeList()))
# if(ECUM_VALIDOFSLEEPMODELIST == STD_ON)
      ||
      /* Check if this sleep mode is active in this variant */
      (!EcuM_IsValidOfSleepModeList(resetSleepMode))
# endif
#endif
  )
  {
    errorId = ECUM_E_STATE_PAR_OUT_OF_RANGE;
    retval = E_NOT_OK;
  }
  else
  {
    /* ----- Implementation ----------------------------------------------- */
    if (targetState == ECUM_STATE_OFF)
    {
      /* #30 Set the state of the current shutdown target. */
      /* #31 In case of ECUM_STATE_OFF ignore the resetSleepMode parameter and set the current shutdown mode to 0. */
      EcuM_InternalSetShutdownTargetAndMode(targetState, 0u);
    }
    else
    {
      /* #30 Set the state of the current shutdown target. */
      /* #32 In case of ECUM_STATE_SLEEP / ECUM_STATE_RESET set the current shutdown mode to parameters value. */
      EcuM_InternalSetShutdownTargetAndMode(targetState, resetSleepMode);
    }

    retval = E_OK;
  }

  /* ----- Development Error Report --------------------------------------- */
#if(ECUM_DEV_ERROR_REPORT == STD_ON)
  if (errorId != ECUM_E_NO_ERROR)
  {
    EcuM_Det_ReportError(ECUM_SID_SELECT_SHUTDOWN_TARGET, errorId);
  }
#else
  ECUM_DUMMY_STATEMENT(errorId); /* PRQA S 1338, 2983, 3112 */ /* MD_MSR_DummyStmt */
#endif

  return retval;
}
FUNC(Std_ReturnType, ECUM_CODE) EcuM_GoToSelectedShutdownTarget(void)
{
  /* ----- Local Variables ---------------------------------------------- */
  Std_ReturnType retVal;
# if (ECUM_SLEEPMODELIST == STD_ON)
  EcuM_StateType localShutdownTarget;
  uint8 localShutdownMode;

  /* ----- Implementation ----------------------------------------------- */
  EcuM_InternalGetShutdownTargetAndMode(&localShutdownTarget, &localShutdownMode); /* SBSW_ECUM_POINTER_TO_LOCAL_VARIABLES */
  /* Check if the current shutdown target is set to Sleep, Reset or Off. */
  if (localShutdownTarget == ECUM_STATE_SLEEP)
  {
#  if (ECUM_POLLINGOFSLEEPMODELIST == STD_ON)
    /*  In case of Sleep differ if the current sleepmode needs polling or not. */
    if (EcuM_IsPollingOfSleepModeList(localShutdownMode))
    {
      /* In case the sleepmode needs polling, call the corresponding EcuM API. */
      retVal = EcuM_GoPoll();
    }
    else
#  endif
    {
      /* In case the sleepmode does not need polling, call the corresponding EcuM API. */
      retVal = EcuM_GoHalt();
    }
  }
  else
# endif
  {
    /* In case of Off / Reset, call the corresponding EcuM API. */
    retVal = EcuM_GoDown( ECUM_MODULE_ID);
  }

  return retVal;
}
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1329332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美好蕴育润康:为孕产期女性量身定制的专业营养

如今&#xff0c;孕产期是女性人生中特别而又重要的阶段。这段时间&#xff0c;孕期妈妈经常饱受许多痛苦和不适&#xff0c;更需要额外的关爱和呵护&#xff0c;以确保母婴健康。为了满足孕产期女性特殊的营养需求&#xff0c;美好蕴育润康应运而生&#xff0c;成为她们身边的…

web网页端使用webSocket实现语音通话功能(SpringBoot+VUE)

写在前面 最近在写一个web项目&#xff0c;需要实现web客户端之间的语音通话&#xff0c;期望能够借助webSocket全双工通信的方式来实现&#xff0c;但是网上没有发现可以正确使用的代码。网上能找到的一个代码使用之后只能听到“嘀嘀嘀”的杂音 解决方案&#xff1a;使用Jso…

QC/PD快充电源产品应用介绍

• 原边650-700V SJ MOSFET采用低FOM值的ESM 技术&#xff0c;有利于提高系统效 率&#xff0c; 以及更佳的EAS和EMI等特性&#xff0c;对于一些不含PFC电路的系统更友好。 • 副边采用低FOM值的SGT同步整流电路&#xff0c;相比肖特基二极管整流能有更低的 损耗&#xff0c;有…

2023年12月GESP认证C++等级考试(三级)真题试卷

2023年12月GESP认证C等级考试&#xff08;三级&#xff09;真题试卷 题目总数&#xff1a;27 总分数&#xff1a;100 选择题 第 1 题 单选题 下⾯C数组的定义中&#xff0c;会丢失数据的是( )。 A. char dict_key[] {p,t,o}; B. int dict_value[] {33,22,11}; C. char …

spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop

前言&#xff1a;本文不介绍 AOP 的基本概念、动态代理方式实现 AOP&#xff0c;以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP&#xff0c;也就是实际项目开发中如何使用 AOP 去实现相关功能。 如果有需要了解 AOP 的概念、动态代理实现 AOP 的&…

如何用低成本进行宣传?媒介盒子分享

企业创立之初想要用低成本取得较好的宣传效果可以实现吗&#xff1f;可以。软文营销就能帮助企业做到。 然而数字时代中用户接受到的信息数量远远超过他们的理解能力。所以只有那些用户喜欢看到的信息才会被注意到&#xff0c;宣传才能起到效果。今天媒介盒子就来和大家聊聊&a…

软件测试:最强面试题整理出炉附答案,一点点小总结,建议收藏

一、Web自动化测试 1.Selenium中hidden或者是display &#xff1d; none的元素是否可以定位到&#xff1f; 不能,可以写JavaScript将标签中的hidden先改为0&#xff0c;再定位元素 2.Selenium中如何保证操作元素的成功率&#xff1f;也就是说如何保证我点击的元素一定是可以点…

【P2PTransportChannel 】2: 创建Connetion、 BasicPortAllocatorSession

基于m98P2PTransportChannel::MaybeStartGathering() 触发PortAllocator 对 session的管理(创建等) P2PTransportChannel::MaybeStartGathering() session都放在PortAllocator的 一个vector 中:std::vector<std::unique_ptr<PortAllocatorSession>> pooled_sess…

FreeRTOS之任务状态查询

1、相关API函数的使用 uxTaskPriorityGet(Task1Task_Handler);//传入task1的任务句柄,获取任务优先级 vTaskPrioritySet(Task1Task_Handler,30);//改变任务优先级 task_num uxTaskGetNumberOfTasks();//获取任务数量 #include "sys.h" #include "delay.h"…

【CF闯关练习】—— 900分段

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;cf闯关练习 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

【Nacos】—客户端与服务端源码解析

Nacos系列 Nacos—简述、注册中心、配置中心 Nacos安装教程 SpringBoot项目与Nacos配置 一、背景介绍 Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴开源的服务发现和配置管理工具&#xff0c;它是一个全面的微服务基础设施组件&#xff0c;提供…

微信小程序开发系列-02注册小程序

上一篇文章&#xff0c;创建了一个最小的小程序&#xff0c;但是&#xff0c;还有3个疑问没有弄清楚&#xff0c;还是基于demo1工程&#xff0c;这篇文章继续探索。 当前的目录结构是否是完备的呢&#xff1f;&#xff08;虽然小程序可以运行起来&#xff09;app.js文件内容还…

GrayLog日志平台的基本使用-收集系统日志

1、新建Indices 2、新建Input Inputs新增syslog UDP的类型&#xff0c;接收端口为1514 UDP 用于接收Linux服务器使用rsyslog转发过来的系统日志 Input配置后&#xff0c;需要开放端口&#xff1a;firewall-cmd --permanent --zonepublic --add-port1514/udp; firewall-cmd --r…

【开源工程及源码】超级经典开源项目实景三维数字孪生智慧机场

智慧机场可视化平台通过可视化手段&#xff0c;将复杂的机场运营数据以图形、图表等形式展现&#xff0c;使管理者能够更直观、实时地了解机场的各个方面。飞渡科技通过整合物联网IOT、人工智能、大数据分析等技术&#xff0c;围绕机场管理、运控、安防、服务、监测等业务领域&…

【Filament】绘制立方体

1 前言 本文主要介绍使用 Filament 绘制彩色立方体&#xff0c;读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形 2 绘制立方体 本文项目结构如下&#xff0c;完整代码资源 → Filament绘制立方体。 2.1 自定义基类 为…

智赋百景|2023-2024年福建省大数据集团数据应用开发大赛重磅开赛!

为推动数据要素赋能千行百业&#xff0c;拓展自然语言处理技术在不同业务场景下的落地应用&#xff0c;进一步实现“智赋百景”&#xff0c;由福建省大数据集团有限公司主办&#xff0c;福建大数据一级开发有限公司、福建大数据交易有限公司、福建省数字经济产业工会共同承办的…

【小白专用】php以pdo方式连接sqlserver,开启sqlsrv扩展

一、安装ODBC程序&#xff0c; 下载适用于 SQL Server 的 ODBC 驱动程序 - 适用于 SQL Server 的 ODBC 驱动程序 |Microsoft 学习 运行安装程序&#xff0c;出现如下图所示页面&#xff1b; 选择下一步&#xff1b;选择我同意许可协议中的条款后选择下一步&#xff1b; 点击安…

告别高昂存储,高效灵活管理数据

前言 在当今数字化时代&#xff0c;企业面临着海量数据的挑战&#xff0c;这些数据承载着技术创新和业务发展的重要使命。因此&#xff0c;高效、安全地收集、存储和管理数据成为了企业关注的焦点。对于需要长期储存且低频聚合分析的数据&#xff0c;组织需要更加低成本和便捷…

Android平台RTSP流如何添加动态水印后转推RTMP或轻量级RTSP服务

技术背景 我们在对接外部开发者的时候&#xff0c;遇到这样的技术诉求&#xff0c;客户用于地下管道检测场景&#xff0c;需要把摄像头的数据拉取过来&#xff0c;然后叠加上实时位置、施工单位、施工人员等信息&#xff0c;然后对外输出新的RTSP流&#xff0c;并本地录制一份…

Java中使用JTS实现WKB数据写入、转换字符串、读取

场景 Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内的方位角&#xff1a; Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内…