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

AUTOSAR进阶图解==>AUTOSAR_SWS_BSWModeManager

AUTOSAR BSW Mode Manager (BswM) 详解

基础软件模式管理器规范文档

目录

  1. 概述
  2. 架构设计
  3. 状态机
  4. 配置结构
  5. 初始化序列
  6. API接口
  7. 使用示例

1. 概述

BSW Mode Manager (BswM) 是AUTOSAR架构中的基础软件模块,负责协调和管理ECU中各个基础软件模块的模式转换。通过定义的仲裁规则,BswM接收来自各个模块的模式请求,根据预定义的规则执行相应的动作,从而确保模块间的模式一致性和系统的有序运行。

BswM的主要职责包括:

  • 协调和管理BSW模块的模式转换
  • 处理来自应用层和BSW层的模式请求
  • 根据配置的仲裁规则执行相应动作
  • 确保模块间的模式一致性
  • 支持网络管理、通信管理和ECU状态管理

BswM在AUTOSAR软件架构中扮演着中枢协调器的角色,连接了应用软件、RTE和各个BSW模块,是实现复杂模式管理的关键组件。


2. 架构设计

BSW Mode Manager在AUTOSAR架构中的位置和与其他模块的交互关系如下图所示:

在这里插入图片描述

2.1 架构图解释

BSW Mode Manager架构图展示了BswM在AUTOSAR软件架构中的位置以及与其他模块的交互关系:

  1. 分层结构

    • 应用层:包含应用软件组件(SWC),它们通过RTE向下层发送模式请求
    • 运行时环境层:RTE负责转发应用层的请求到BSW层
    • 服务层:包含COM、SD、NvM、EcuM等服务模块
    • ECU抽象层/复杂驱动层:包含ComM、EthIf、FrSM、CanSM、LinSM、EthSM等模块
  2. BswM的位置

    • BswM位于独立的"基础软件模式管理"包中
    • 它与多个层次的模块都有交互,体现了其中心协调者的角色
  3. 交互关系

    • 模式请求流:各模块通过向下箭头表示向BswM发送模式请求
    • 模式控制流:BswM通过向上箭头表示对其他模块进行模式控制
  4. 主要交互模块

    • 向BswM请求模式的模块:SWC、RTE、COM、SD、NvM、EcuM、ComM、EthIf、FrSM、CanSM、LinSM、EthSM
    • BswM控制的模块:ComM、EcuM、COM、RTE

2.2 BSW Mode Manager功能

根据架构图中的注释和AUTOSAR规范,BSW Mode Manager具有以下核心功能:

  1. 模式管理

    • 管理BSW模块的模式切换
    • 处理来自各模块的模式请求
    • 根据预定义的规则执行相应动作
    • 协调模块间的模式一致性
  2. 仲裁机制

    • 接收多个模块的模式请求
    • 根据配置的规则和优先级决定最终的模式
    • 执行相应的动作列表
  3. 接口提供

    • 为应用层和BSW层提供统一的模式请求接口
    • 向其他模块提供模式控制功能

2.3 代码示例

以下是基于AUTOSAR规范的BswM请求处理伪代码示例:

/* 模式请求处理函数 */
void BswM_RequestMode(BswM_UserType userType, BswM_ModeType requestedMode)
{/* 检查模块状态 */if (BswM_Status != BSWM_INITIALIZED) {Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_REQUESTMODE_ID, BSWM_E_NO_INIT);return;}/* 更新请求的模式值 */BswM_SetRequestedMode(userType, requestedMode);/* 触发模式仲裁 */SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0();/* 查找匹配的规则 */for (uint16 i = 0; i < BswM_ConfigPtr->BswMRuleCount; i++) {if (BswM_CheckRule(BswM_ConfigPtr->BswMRules[i], userType, requestedMode)) {/* 执行匹配规则的动作列表 */BswM_ExecuteActionList(BswM_ConfigPtr->BswMRules[i].ActionListRef);}}SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();
}

3. 状态机

BSW Mode Manager的状态机描述了模块从初始化到运行时的状态转换过程:

在这里插入图片描述

3.1 状态机图解释

BSW Mode Manager状态机图展示了BswM从上电到关闭的完整生命周期:

  1. 主要状态

    • BSWM_UNINITED:未初始化状态,上电后的初始状态
    • BSWM_IDLE:空闲状态,模块正常运行并处理请求的主要状态
    • BSWM_SHUTDOWN:关闭状态,收到关闭请求后进入的状态
  2. 状态转换

    • 系统上电BSWM_UNINITED:系统上电后BswM处于未初始化状态
    • BSWM_UNINITEDBSWM_IDLE:初始化完成后转入空闲状态
    • BSWM_IDLEBSWM_SHUTDOWN:收到EcuM关闭请求后进入关闭状态
    • BSWM_SHUTDOWN系统关闭:关闭完成后系统关闭
  3. BSWM_UNINITED内部状态

    • 等待初始化初始化中:调用BswM_Init()函数开始初始化
    • 初始化中已初始化:初始化成功
    • 初始化中初始化失败:初始化过程中出现错误
    • 初始化失败错误状态:进入错误状态
  4. BSWM_IDLE内部状态

    • 等待请求处理请求:收到模式请求
    • 处理请求执行动作:仲裁规则匹配成功
    • 执行动作等待请求:动作执行完成,回到等待状态
    • 处理请求等待请求:无匹配规则,直接回到等待状态
  5. BSWM_SHUTDOWN内部状态

    • 准备关闭关闭中:调用BswM_Shutdown()开始关闭流程
    • 关闭中已关闭:关闭流程完成

3.2 状态说明

  1. 未初始化状态 (BSWM_UNINITED)

    • 模块处于上电后的初始状态
    • 此时不能处理任何模式请求
    • 必须等待BswM_Init()调用完成初始化
  2. 空闲状态 (BSWM_IDLE)

    • 模块已初始化并可以处理请求
    • 接收各模块的模式变更请求
    • 根据配置的规则执行相应动作
    • 大部分时间在此状态循环
  3. 关闭状态 (BSWM_SHUTDOWN)

    • 收到EcuM关闭请求后进入
    • 执行必要的关闭操作
    • 确保所有模块有序关闭

3.3 代码示例

以下是基于AUTOSAR规范的BswM状态机实现伪代码:

/* BswM状态类型定义 */
typedef enum {BSWM_UNINITED,  /* 未初始化状态 */BSWM_IDLE,      /* 空闲状态,正常运行 */BSWM_SHUTDOWN   /* 关闭状态 */
} BswM_StateType;/* 当前状态变量 */
static BswM_StateType BswM_State = BSWM_UNINITED;/* 初始化函数 */
void BswM_Init(const BswM_ConfigType* ConfigPtr)
{/* 检查配置指针 */if (ConfigPtr == NULL) {Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_INIT_ID, BSWM_E_NULL_POINTER);return;}/* 初始化内部变量 */BswM_ConfigPtr = ConfigPtr;/* 初始化所有请求端口的初始值 */for (uint16 i = 0; i < ConfigPtr->BswMModeRequestPortCount; i++) {BswM_ModeRequestStatus[i].Mode = ConfigPtr->BswMModeRequestPorts[i].BswMInitialMode;}/* 应用初始仲裁规则 */SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0();BswM_ApplyInitialRules();SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();/* 更新模块状态 */BswM_State = BSWM_IDLE;
}/* 关闭函数 */
void BswM_Shutdown(void)
{/* 检查模块状态 */if (BswM_State != BSWM_IDLE) {Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_SHUTDOWN_ID, BSWM_E_NO_INIT);return;}/* 更新模块状态 */BswM_State = BSWM_SHUTDOWN;/* 执行关闭操作 *//* ... *//* 完成关闭 *//* BswM_State = BSWM_UNINITED; */ /* 在一些实现中会重置为未初始化状态 */
}

4. 配置结构

BSW Mode Manager的配置结构定义了模块初始化和运行时需要的所有参数,包括请求端口、模式映射、仲裁规则和动作等:

在这里插入图片描述

4.1 配置类图解释

BSW Mode Manager配置类图展示了BswM的完整配置结构:

  1. 顶层结构

    • BswM:顶层容器,包含所有BswM相关配置
      • BswMGeneral:通用配置参数
      • BswMModeControl:模式控制相关配置
  2. 通用配置 (BswMGeneral)

    • BswMReleaseVersion:模块版本信息
    • BswMDevErrorDetect:开发错误检测开关
    • BswMVersionInfoApi:版本信息API开关
    • BswMTimerControl:定时器控制开关
  3. 模式控制 (BswMModeControl)

    • BswMModeRequestPort:模式请求端口配置
    • BswMModeRequestSource:模式请求源配置
    • BswMDataTypeMappingSet:数据类型映射配置
    • BswMConfig:配置集合
  4. 模式请求源 (BswMModeRequestSource)

    • 定义各种模式请求源,如:
      • BswMComIndication
      • BswMEcuMIndication
      • BswMCanSMIndication
      • 等多种模式请求源
  5. 配置集合 (BswMConfig)

    • BswMArbitration:仲裁规则配置
    • BswMBehavior:行为配置
    • BswMModeCondition:模式条件配置
    • BswMUserIncludeFile:用户包含文件配置
  6. 仲裁配置 (BswMArbitration)

    • BswMBswMode:BSW模式配置
    • BswMGenericMode:通用模式配置
    • BswMRule:仲裁规则配置
    • BswMRuleBase:规则基础配置
  7. 行为配置 (BswMBehavior)

    • BswMAction:动作配置
    • BswMActionList:动作列表配置
    • BswMModeSwitchAcknowledgement:模式切换确认配置

4.2 配置参数说明

  1. BswMGeneral参数

    • BswMDevErrorDetect:开发错误检测开关,用于启用/禁用开发阶段的错误检测
    • BswMVersionInfoApi:版本信息API开关,用于启用/禁用版本信息API
    • BswMTimerControl:定时器控制开关,用于启用/禁用定时器功能
  2. BswMModeRequestPort参数

    • BswMModeRequestPortRef:模式请求端口引用
    • BswMInitialMode:初始模式值
    • BswMRequestProcessing:请求处理方式
  3. BswMRule参数

    • BswMConditionValue:条件值
    • BswMRuleStates:规则状态
    • BswMRulePriority:规则优先级,用于确定规则执行顺序
  4. BswMAction参数

    • 包含多种不同类型的动作,如:
      • BswMComMAllowCom:通信允许控制
      • BswMRteStop/BswMRteStart:RTE停止/启动控制
      • BswMPduGroupSwitch:PDU组切换控制
      • 等多种动作类型

4.3 代码示例

以下是基于AUTOSAR规范的BswM配置结构的C语言定义示例:

/* BswM配置结构定义 *//* 通用配置类型 */
typedef struct {uint8 BswMReleaseVersion;boolean BswMDevErrorDetect;     /* 开发错误检测开关 */boolean BswMVersionInfoApi;     /* 版本信息API开关 */boolean BswMTimerControl;       /* 定时器控制开关 */
} BswM_GeneralType;/* 模式请求端口类型 */
typedef struct {void* BswMModeRequestPortRef;   /* 模式请求端口引用 */uint8 BswMInitialMode;          /* 初始模式值 */uint8 BswMRequestProcessing;    /* 请求处理方式 */
} BswM_ModeRequestPortType;/* 规则类型 */
typedef struct {uint8 BswMConditionValue;       /* 条件值 */uint8 BswMRuleStates;           /* 规则状态 */uint8 BswMRulePriority;         /* 规则优先级 */uint16 ActionListRef;           /* 动作列表引用 */
} BswM_RuleType;/* 动作列表类型 */
typedef struct {uint16 ActionCount;             /* 动作数量 */const void* Actions[];          /* 动作数组 */
} BswM_ActionListType;/* 主配置结构 */
typedef struct {const BswM_GeneralType* BswMGeneral;           /* 通用配置 */uint16 BswMModeRequestPortCount;               /* 模式请求端口数量 */const BswM_ModeRequestPortType* BswMModeRequestPorts; /* 模式请求端口 */uint16 BswMRuleCount;                          /* 规则数量 */const BswM_RuleType* BswMRules;                /* 规则 */uint16 BswMActionListCount;                    /* 动作列表数量 */const BswM_ActionListType* BswMActionLists;    /* 动作列表 */
} BswM_ConfigType;/* 配置实例定义示例 */
const BswM_ConfigType BswM_Configuration = {/* 通用配置 */&(BswM_GeneralType){.BswMReleaseVersion = 0x01,.BswMDevErrorDetect = TRUE,.BswMVersionInfoApi = TRUE,.BswMTimerControl = TRUE},/* 模式请求端口数量 */2,/* 模式请求端口 */(BswM_ModeRequestPortType[]){{.BswMModeRequestPortRef = &ComMRequestPort,.BswMInitialMode = COMM_NO_COMMUNICATION,.BswMRequestProcessing = BSWM_IMMEDIATE},{.BswMModeRequestPortRef = &EcuMRequestPort,.BswMInitialMode = ECUM_STATE_STARTUP,.BswMRequestProcessing = BSWM_IMMEDIATE}},/* 规则数量 */1,/* 规则 */(BswM_RuleType[]){{.BswMConditionValue = BSWM_TRUE,.BswMRuleStates = BSWM_ACTIVE,.BswMRulePriority = 10,.ActionListRef = 0}},/* 动作列表数量 */1,/* 动作列表 */(BswM_ActionListType[]){{.ActionCount = 1,.Actions = {&ComMAllowComAction}}}
};

5. 初始化序列

BSW Mode Manager的初始化序列描述了模块从未初始化到可操作状态的完整过程:

在这里插入图片描述

5.1 初始化序列图解释

BSW Mode Manager初始化序列图展示了BswM模块初始化和请求处理的完整流程:

  1. 参与者

    • 应用程序:触发初始化过程的应用
    • EcuM:ECU管理器,负责调用BswM初始化
    • BswM:BSW模式管理器,本图的主角
    • SchM_BswM:调度管理器,提供互斥访问
    • Det:开发错误跟踪模块,用于错误报告
  2. 初始化阶段

    • 应用程序调用EcuM_Init()启动初始化流程
    • EcuM调用BswM_Init(ConfigPtr)初始化BswM模块
    • BswM检查配置指针的有效性
    • 如果配置无效,BswM报告错误并返回
    • 如果配置有效,BswM执行以下操作:
      • 初始化内部变量
      • 保存配置指针
      • 设置模块状态为初始化
      • 初始化所有模式请求端口
      • 设置初始模式值
      • 应用初始仲裁规则
  3. 运行阶段

    • 应用程序调用BswM_RequestMode()请求模式切换
    • BswM检查模块状态
    • 如果模块未初始化,BswM报告错误并返回
    • 如果模块已初始化,BswM执行以下操作:
      • 更新请求的模式值
      • 触发模式仲裁
      • 执行匹配的动作列表
  4. 互斥控制

    • 在处理模式请求和执行动作时,BswM通过SchM接口确保互斥访问
    • 调用SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0()进入互斥区
    • 调用SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0()退出互斥区

5.2 函数说明

  1. BswM_Init(ConfigPtr)

    • 描述:初始化BswM模块内部状态,保存配置指针,初始化所有模式请求端口的初始值,应用初始模式仲裁规则,确保模块进入可操作状态
    • 参数
      • ConfigPtr [输入]:指向BswM配置结构的指针,类型:const BswM_ConfigType*,不能为NULL
    • 返回值:无
    • 相关函数
      • 上层:EcuM_Init()
      • 下层:Det_ReportError(),SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0(),SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0()
  2. BswM_RequestMode(UserType, ModeType)

    • 描述:处理模式请求,更新请求的模式值,触发模式仲裁,执行匹配的动作列表
    • 参数
      • UserType [输入]:请求者类型,类型:BswM_UserType
      • ModeType [输入]:请求的模式,类型:BswM_ModeType
    • 返回值:无
    • 相关函数
      • 上层:应用程序或其他模块
      • 下层:Det_ReportError(),SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0(),SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0()

5.3 代码示例

以下是基于AUTOSAR规范的BswM初始化和模式请求处理函数的完整实现示例:

/* BswM初始化函数 */
void BswM_Init(const BswM_ConfigType* ConfigPtr)
{/* 检查配置指针 */if (ConfigPtr == NULL) {Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_INIT_ID, BSWM_E_NULL_POINTER);return;}/* 保存配置指针 */BswM_ConfigPtr = ConfigPtr;/* 初始化内部变量 */BswM_Status = BSWM_INITIALIZED;/* 初始化所有模式请求端口 */for (uint16 i = 0; i < ConfigPtr->BswMModeRequestPortCount; i++) {/* 设置初始模式值 */BswM_ModeRequestStatus[i].Mode = ConfigPtr->BswMModeRequestPorts[i].BswMInitialMode;BswM_ModeRequestStatus[i].Initialized = TRUE;}/* 进入互斥区 */SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0();/* 应用初始仲裁规则 */for (uint16 i = 0; i < ConfigPtr->BswMRuleCount; i++) {if (BswM_EvaluateRule(&ConfigPtr->BswMRules[i])) {BswM_ExecuteActionList(ConfigPtr->BswMRules[i].ActionListRef);}}/* 退出互斥区 */SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();
}/* 模式请求处理函数 */
void BswM_RequestMode(BswM_UserType userType, BswM_ModeType requestedMode)
{BswM_ModeRequestPortIndexType portIdx;/* 检查模块状态 */if (BswM_Status != BSWM_INITIALIZED) {Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_REQUESTMODE_ID, BSWM_E_NO_INIT);return;}/* 查找对应的模式请求端口 */portIdx = BswM_GetModeRequestPortIndex(userType);if (portIdx == BSWM_INVALID_PORT_IDX) {Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_REQUESTMODE_ID, BSWM_E_REQ_USER_OUT_OF_RANGE);return;}/* 更新请求的模式值 */BswM_ModeRequestStatus[portIdx].Mode = requestedMode;/* 进入互斥区 */SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0();/* 触发模式仲裁 */for (uint16 i = 0; i < BswM_ConfigPtr->BswMRuleCount; i++) {if (BswM_EvaluateRule(&BswM_ConfigPtr->BswMRules[i])) {/* 执行匹配的动作列表 */BswM_ExecuteActionList(BswM_ConfigPtr->BswMRules[i].ActionListRef);}}/* 退出互斥区 */SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();
}/* 评估规则函数 */
static boolean BswM_EvaluateRule(const BswM_RuleType* rule)
{boolean result = FALSE;/* 检查规则状态 */if (rule->BswMRuleStates != BSWM_ACTIVE) {return FALSE;}/* 根据规则类型评估条件 */switch (rule->BswMConditionType) {case BSWM_EQUALS:result = (BswM_GetModeValue(rule->ModeRequestPort) == rule->BswMConditionValue);break;case BSWM_NOT_EQUALS:result = (BswM_GetModeValue(rule->ModeRequestPort) != rule->BswMConditionValue);break;case BSWM_GREATER:result = (BswM_GetModeValue(rule->ModeRequestPort) > rule->BswMConditionValue);break;case BSWM_GREATER_EQUALS:result = (BswM_GetModeValue(rule->ModeRequestPort) >= rule->BswMConditionValue);break;case BSWM_LESS:result = (BswM_GetModeValue(rule->ModeRequestPort) < rule->BswMConditionValue);break;case BSWM_LESS_EQUALS:result = (BswM_GetModeValue(rule->ModeRequestPort) <= rule->BswMConditionValue);break;default:Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_MAINFUNCTION_ID, BSWM_E_REQ_MODE_OUT_OF_RANGE);break;}return result;
}/* 执行动作列表函数 */
static void BswM_ExecuteActionList(uint16 actionListRef)
{const BswM_ActionListType* actionList;if (actionListRef >= BswM_ConfigPtr->BswMActionListCount) {Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_MAINFUNCTION_ID, BSWM_E_REQ_LIST_OUT_OF_RANGE);return;}actionList = &BswM_ConfigPtr->BswMActionLists[actionListRef];/* 执行动作列表中的所有动作 */for (uint16 i = 0; i < actionList->ActionCount; i++) {BswM_ExecuteAction(actionList->Actions[i]);}
}

6. API接口

BswM模块提供以下主要API接口:

  1. 初始化和关闭API

    • void BswM_Init(const BswM_ConfigType* ConfigPtr):初始化BswM模块
    • void BswM_Shutdown(void):关闭BswM模块
  2. 模式请求API

    • void BswM_RequestMode(BswM_UserType userType, BswM_ModeType requestedMode):请求特定模式
  3. 模式指示API(由其他模块调用,通知BswM模式变化):

    • void BswM_ComM_CurrentMode(NetworkHandleType Network, ComM_ModeType RequestedMode):通知ComM当前模式
    • void BswM_Dcm_RequestSessionMode(Dcm_SesCtrlType SessionMode):通知DCM会话模式请求
    • void BswM_EcuM_CurrentState(EcuM_StateType CurrentState):通知EcuM当前状态
    • 等多个模式指示API
  4. 定时器API

    • void BswM_TimerExpired(BswM_TimerType timer):通知定时器到期
  5. 其他API

    • void BswM_MainFunction(void):BswM主函数,由调度器周期性调用
    • void BswM_GetVersionInfo(Std_VersionInfoType* versioninfo):获取版本信息

7. 使用示例

以下是BswM的典型使用场景:

7.1 网络管理模式控制

/* 配置BswM规则和动作 */
const BswM_RuleType NetworkRule = {.BswMConditionValue = COMM_FULL_COMMUNICATION,.BswMRuleStates = BSWM_ACTIVE,.BswMRulePriority = 10,.ActionListRef = 0
};const BswM_ActionListType NetworkActionList = {.ActionCount = 1,.Actions = {&PduGroupSwitchAction}
};/* ComM模式变更时的回调 */
void BswM_ComM_CurrentMode(NetworkHandleType Network, ComM_ModeType RequestedMode)
{/* 检查模块状态 */if (BswM_Status != BSWM_INITIALIZED) {Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_COMM_CURRENTMODE_ID, BSWM_E_NO_INIT);return;}/* 更新ComM模式 */BswM_ComMModeStatus[Network] = RequestedMode;/* 触发模式仲裁 */SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0();BswM_TriggerArbitration();SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();
}

7.2 ECU状态管理

/* EcuM状态变更时的回调 */
void BswM_EcuM_CurrentState(EcuM_StateType CurrentState)
{/* 检查模块状态 */if (BswM_Status != BSWM_INITIALIZED) {Det_ReportError(BSWM_MODULE_ID, BSWM_INSTANCE_ID, BSWM_ECUM_CURRENTSTATE_ID, BSWM_E_NO_INIT);return;}/* 更新EcuM状态 */BswM_EcuMStateStatus = CurrentState;/* 如果是关闭状态,执行特殊处理 */if (CurrentState == ECUM_STATE_SHUTDOWN) {BswM_HandleShutdown();return;}/* 触发模式仲裁 */SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0();BswM_TriggerArbitration();SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();
}/* 处理关闭请求 */
static void BswM_HandleShutdown(void)
{/* 执行关闭相关的动作 */SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0();/* 关闭通信 */for (uint8 i = 0; i < COMM_CHANNEL_COUNT; i++) {ComM_CommunicationAllowed(i, FALSE);}/* 关闭RTE */BswM_RteStop();SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();/* 更新模块状态 */BswM_Status = BSWM_SHUTDOWN;
}BswM_EcuMStateStatus = CurrentState;/* 如果是关闭状态,执行特殊处理 */if (CurrentState == ECUM_STATE_SHUTDOWN) {BswM_HandleShutdown();return;}/* 触发模式仲裁 */SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0();BswM_TriggerArbitration();SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();
}/* 处理关闭请求 */
static void BswM_HandleShutdown(void)
{/* 执行关闭相关的动作 */SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0();/* 关闭通信 */for (uint8 i = 0; i < COMM_CHANNEL_COUNT; i++) {ComM_CommunicationAllowed(i, FALSE);}/* 关闭RTE */BswM_RteStop();SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();/* 更新模块状态 */BswM_Status = BSWM_SHUTDOWN;
}
http://www.dtcms.com/a/295701.html

相关文章:

  • 智慧驾驶疲劳检测算法的实时性优化
  • 深入思考【九九八十一难】的意义,试用歌曲能否解释
  • 【论文阅读50】-融合领域知识与可解释深度学习
  • 如何构建企业级 Mentor EDA 仿真平台
  • 进程调度的艺术:从概念本质到 Linux 内核实现
  • 从“各玩各的”到“无缝贴贴”:Modbus转Profinet让机器人告别“信息孤岛”
  • 【自动化运维神器Ansible】Ansible常用模块之shell模块详解
  • 数据版本控制系统(Oxen)
  • Terraform与Ansible的关系
  • Mysql-UDF提权
  • 家政小程序系统开发:开启智慧家政新时代
  • 详解力扣高频 SQL 50 题-1757.可回收且低脂的产品【入门】
  • 使用phpstudy极简快速安装mysql
  • LLM层归一化:γβ与均值方差的协同奥秘
  • 用 Function Call 让 AI 主动调用函数(超入门级示例)|保姆级大模型应用开发实战
  • day 34 打卡
  • LLM中典型的Transformer层中:MLP Residual; LN Agg: μ, σ; SM Agg 是什么意思
  • [202103][Docker 实战][第2版][耿苏宁][译]
  • [Linux入门] Linux 网络设置入门:从查看、测试到配置全攻略
  • 进阶系统策略
  • 二分查找----4.搜索旋转排序数组
  • 为什么Java的String不可变?
  • 洛谷P1512 伊甸园日历游戏
  • Qt(资源库和按钮组)
  • Django基础(八)———数据库外键及表关系
  • DRF - 博客列表API
  • GaussDB 数据库架构师(八) 等待事件概述-1
  • Spring Boot项目的模块继承父项目的全部依赖
  • 中国5G RedCap基站开通情况及2025年全年计划
  • 【ComfyUI学习笔记03】案例学习:图片放大的3个基本工作流