当前位置: 首页 > news >正文

[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)*/
#endifif (/* 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);}
#elseECUM_DUMMY_STATEMENT(errorId); /* PRQA S 1338, 2983, 3112 */ /* MD_MSR_DummyStmt */
#endifreturn 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

相关文章:

  • C语言数据结构-排序
  • flutter + firebase 云消息通知教程 (android-安卓、ios-苹果)
  • 【爬虫软件】孔夫子二手书采集
  • Java 中的内部类的定义
  • python异常之try/else分句
  • 基于比较的排序算法总结(java实现版)
  • 175.【2023年华为OD机试真题(C卷)】API集群负载统计(遍历和条件判断实现JavaPythonC++JS)
  • 【Docker】升级docker或者docker到docker-ce完全保留镜像和容器,不影响原容器使用方法
  • 论文笔记 | Nature 2023 FunSearch:利用大语言模型在数学科学领域探索新的发现
  • 使用yarn安装electron时手动选择版本
  • docker运行java程序的Dockerfile
  • Mybatis之增删改查
  • log4j2远程代码执行漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)
  • 什么是误差,什么是重构误差,误差与重构误差有什么区别?
  • thinkphp+vue+mysql酒店客房管理系统 b1g8z
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Android交互
  • bearychat的java client
  • canvas 高仿 Apple Watch 表盘
  • Fundebug计费标准解释:事件数是如何定义的?
  • HashMap ConcurrentHashMap
  • IDEA常用插件整理
  • Javascript基础之Array数组API
  • Java面向对象及其三大特征
  • JWT究竟是什么呢?
  • php ci框架整合银盛支付
  • React16时代,该用什么姿势写 React ?
  • redis学习笔记(三):列表、集合、有序集合
  • spark本地环境的搭建到运行第一个spark程序
  • Vue2 SSR 的优化之旅
  • 大快搜索数据爬虫技术实例安装教学篇
  • 关于 Cirru Editor 存储格式
  • 记录:CentOS7.2配置LNMP环境记录
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端工程化(Gulp、Webpack)-webpack
  • 用Canvas画一棵二叉树
  • elasticsearch-head插件安装
  • Semaphore
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #在 README.md 中生成项目目录结构
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (poj1.2.1)1970(筛选法模拟)
  • (二)JAVA使用POI操作excel
  • (六)Hibernate的二级缓存
  • (五)c52学习之旅-静态数码管
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core 依赖注入的基本用发