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

目录

  • 关键词
  • 平台说明
  • 前言
  • 一、总体流程
  • 二、配置
    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Qt之Quick模块】5. QML基本类型及示例用法

QML格式 QML基本类型 在 QML 中&#xff0c;有以下基本类型&#xff1a; int&#xff1a;整数类型。 Rectangle {function myFunction() {// 输出 debug 信息console.log("11 " (11));}Component.onCompleted: {myFunction();} }结果&#xff1a; 2. real&…

PHP数组定义和输出

数组就是一组数据的集合&#xff0c;把一系列数据组织起来&#xff0c;形成一个可操作的整体。 PHP中的数组与Java的数组不一样&#xff0c;需要有key&#xff08;键&#xff09;和value&#xff08;值&#xff09;&#xff0c;相当于Java中数组和键值对的结合。 数组的定义 …

zynqmp Linux + 裸机 (A53-0 Linux,A53-1 2 3 裸机大数据量实时处理,R5-0 协议处理,R5-1 屏幕显示逻辑等)填坑笔记

fpga 和arm 采用预留内存的方式&#xff0c;采用neon 协处理器只能做到 250M/S 的速度&#xff0c;预留内存采用mmap的方式&#xff0c;当读取内存页的时候采用缺页中断的方式&#xff0c;导致速度拖沓而且预留内存没有进行Linux系统的内存管理&#xff08;在系统内 memcpy的速…

JMeter常见错误分析

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

《PySpark大数据分析实战》-17.云服务模式Databricks介绍运行作业

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

数据结构之进阶二叉树(二叉搜索树和AVL树、红黑树的实现)超详细解析,附实操图和搜索二叉树的实现过程图

绪论​ “生命有如铁砧&#xff0c;愈被敲打&#xff0c;愈能发出火花。——伽利略”&#xff1b;本章主要是数据结构 二叉树的进阶知识&#xff0c;若之前没学过二叉树建议看看这篇文章一篇掌握二叉树&#xff0c;本章的知识从浅到深的对搜索二叉树的使用进行了介绍和对其底层…

【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

110基于matlab的混合方法组合的极限学习机和稀疏表示进行分类

基于matlab的混合方法组合的极限学习机和稀疏表示进行分类。通过将极限学习机&#xff08;ELM&#xff09;和稀疏表示&#xff08;SRC&#xff09;结合到统一框架中&#xff0c;混合分类器具有快速测试&#xff08;ELM的优点&#xff09;的优点&#xff0c;且显示出显着的分类精…

网安面试三十道题(持续更新)(sql注入系列)

61 给你一个网站&#xff0c;一般怎么做渗透测试的 先确定黑盒测试还是白盒测试 黑盒测试 信息收集&#xff1a; 服务器相关---&#xff1a;系统版本&#xff0c;真实IP&#xff0c;开放端口&#xff0c;使用的中间件 指纹信息---有无cdn加速&#xff0c;dns解析记录&#xff0…

ARM GIC(三) gicv2架构

ARM的cpu,特别是cortex-A系列的CPU,目前都是多core的cpu,因此对于多core的cpu的中断管理,就不能像单core那样简单去管理,由此arm定义了GICv2架构,来支持多核cpu的中断管理 一、gicv2架构 GICv2,支持最大8个core。其框图如下图所示: 在gicv2中,gic由两个大模块组成: …

页面级UI状态存储LocalStorage

目录 1、LocalStorageProp 2、LocalStorageLink 3、LocalStorage的使用 4、从UI内部使用LocalStorage 5、LocalStorageProp和LocalStorage单向同步的简单场景 6、LocalStorageLink和LocalStorage双向同步的简单场景 7、兄弟节点之间同步状态变量 LocalStorage是页面级的…

FISCO BCOS 中webase-deploy配置项详细说明

本文整理了webase-deploy的相关配置,例如如何webase启用基于自己搭的链,而不启用默认的两节点链 1.WeBASE 子系统版本 指定了 WeBASE 的各个子系统&#xff08;web、mgr、sign、front&#xff09;的版本号为 v1.5.5。 2.Docker 相关配置: docker.mysql 3.如果使用 Docker 安装&…

重温经典struts1之国际化(I18N)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 拿Google网站来举例&#xff0c;在世界上不同国家和地区&#xff0c;登陆Google网站&#xff0c;网站上都会显示本国家语言&#xff0c;它是怎么做到的&#xff0c;就是…

FasterRCNN目标检测

R-CNN 四个步骤: 对输入图片提取候选区&#xff08;region proposal&#xff09;&#xff0c;每张大约2000个。论文中采用selective search的方法。对每个候选区采用CNN网络提取特征。此处需要将proposal的尺寸缩放成统一的227x227&#xff0c;以匹配CNN网络。最终提取到的特征…

一款外置MOS开关降压型 LED 恒流控制器应用方案

一、基本概述 TX6121 是一款高效率、高精度的降压型大功率 LED 恒流驱动控制器芯片。芯片采用固定关断时间的峰值电流控制方式&#xff0c;关断时间可通过外部电容进行调节&#xff0c;工作频率可根据用户要求而改变。 通过调节外置的电流采样电阻&#xff0c;能控制高亮度 LE…

基于ssm+jsp学生综合测评管理系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把学生综合测评管理与现在网络相结合&#xff0c;利用java技术建设学生综合测评管理系统&#xff0c;实现学生综合测评的信息化。则对于进一步提高学生综合测评管理发展&#xff0c;丰富学生综合测评管理经验能起到不少的促进作用。…

【运维面试100问】(十一)淡淡I/O过程

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

手把手教你基于 FastGPT 搭建个人知识库

前言 大家好&#xff0c;我是潇潇雨声。我发现在使用 GPT 时&#xff0c;尽管它能够生成一些小红书文案和日志&#xff0c;但内容常常显得空洞缺乏深度。今天我想分享一个解决这个问题的方法&#xff0c;那就是基于开源项目 FastGPT[1]。 我们可以通过向 GPT 提供一些有针对性的…

大数据技术基本功-数据采集

产品指南&#xff5c;DataScale自定义采集器功能介绍产品指南&#xff5c;开发 DataScale Collector​​​​​​​

鸿蒙和各大厂合作,是不是要火起来

今年9月底&#xff0c;在华为秋季全场景新品发布会上&#xff0c;华为常务董事、终端BG CEO余承东宣布&#xff0c;鸿蒙原生应用全面启动&#xff0c;HarmonyOS NEXT开发者预览版将在2024年第一季度开放。 近日&#xff0c;腾讯、阿里、美团、网易&#xff0c;外包大厂中软国际…