[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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的抽象abstract

抽象abstract 什么是抽象类抽象类的注意事项、特点 使用好处常见应用场景&#xff1a;模版方法设计模式可以使用final关键字修饰模版方法 什么是抽象类 在Java中有一个关键字叫:abstract&#xff0c;它就是抽象的意思&#xff0c;可以用它修饰类、成员方法。abstract修饰类&am…

JUC AQS ReentrantLock源码分析

AQS java.util.concurrent.locks.AbstractQueuedSynchronizer AQS &#xff08;抽象队列同步器&#xff09;&#xff1a; AbstractQueuedSynchronizer 是什么 来自jdk1.5&#xff0c;是用来实现锁或者其他同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框架以及…

2. 结构型模式 - 桥接模式

亦称&#xff1a; Bridge 意图 桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用 问题 抽象&#xff1f; 实现&#xff1f; 听上去挺吓人&#xff1f; 让我们慢慢来&#x…

Zoho Mail企业邮箱:跨境协作利器,荣登Top榜单的首选之选

在全球化的商业环境中&#xff0c;高效的协作工具对于企业及个人来说都至关重要。邮件因其自身规格正式、全球通用等特点&#xff0c;在跨境通信场景中仍然是最高频使用的工具之一。 Zoho Mail企业邮箱因邮件抵达率高&#xff0c;数据加密严&#xff0c;纯净无广告&#xff0c;…

CSS基础小练习

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>圣诞节快乐</title><style>/*设置背景色*/body{background-image:linear-gradient(green 50%,red 50%);background-size:100% 30px;}/*让div在页面居中*/#text{…

【c】无限制输入字符

我们做题有时候会碰上这种的输入&#xff0c;一直输入字符&#xff0c; 下面附上两种解决办法 方法1&#xff1a; char s[10000]; int i0; int arr[1000]{0}; while(scanf("%c",&s[i])!EOF) { i; } 这样你就可以一直输入&#xff0…

DBeaver中使用外部格式化程序对进行sql格式化

本文介绍了如何在DBeaver中使用pgFormatter、sqlprase、sqlformatter等外部格式化程序对sql进行格式化。 目录 一、pgFormatter 1.准备工作 2.DBeaver中进行配置 二、sqlprase 1.准备工作 2.在DBeaver中配置 三、sql-formatter 1.准备工作 2.在DBeaver中配置 一、pgF…

位运算:Leetcode137.只出现一次的数字(2)

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 示例 1&#xff1a; 输入&#xff1a;nums [2,2,3,2] 输出&#xff1a;3示例 2&#xff1a; 输入&…

Openwrt AP 发射 WiFi 信号

问题 想一次把 OpenWrt 路由器 wifi 问题给解决&#xff0c;完全取代路由器。 使用 倍控的 N5105 设备&#xff0c;有 mPCIe 接口&#xff0c;使用了 intel AX200 无线网卡&#xff0c;支持 2.4G 与 5G。 设置步骤 OpenWrt 镜像 第一次使用的镜像不支持 wifi&#xff0c;在…

Google推出Gemini AI开发——10年工作经验的Android开发要被2年工作经验的淘汰了?

应用程序中利用 Gemini 前言&#xff08;可略过&#xff09;、使用 Gemini Pro 开发应用程序正文、Android Studio 中构建Gemini API Starter 应用第 1 步&#xff1a;在 AI 的新项目模板的基础上进行构建第 2 步&#xff1a;生成 API 密钥第 3 步&#xff1a;开始原型设计 正文…

核方法 : 多项式核函数

一、定义 多项式核函数&#xff1a; 将数据映射到高维空间&#xff0c;从而实现 低维线性不可分 到 高维线性可分 二、核心代码介绍 1、关于 svm_clf.decision_function &#xff1a; 2、关于 PolynomialFeatures(degree3) &#xff1a; 二、全量代码 import numpy as …

python读取Excel内容并展示成json

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 伙伴们&#xff0c;又是许久未曾见面了。最近也是在忙着加班&#xff0c;加上没有新技术的输入和产出&…