AUTOSAR进阶图解==>AUTOSAR_SWS_BSWModeManager
AUTOSAR BSW Mode Manager (BswM) 详解
目录
- 概述
- 架构设计
- 状态机
- 配置结构
- 初始化序列
- API接口
- 使用示例
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软件架构中的位置以及与其他模块的交互关系:
-
分层结构:
- 应用层:包含应用软件组件(SWC),它们通过RTE向下层发送模式请求
- 运行时环境层:RTE负责转发应用层的请求到BSW层
- 服务层:包含COM、SD、NvM、EcuM等服务模块
- ECU抽象层/复杂驱动层:包含ComM、EthIf、FrSM、CanSM、LinSM、EthSM等模块
-
BswM的位置:
- BswM位于独立的"基础软件模式管理"包中
- 它与多个层次的模块都有交互,体现了其中心协调者的角色
-
交互关系:
- 模式请求流:各模块通过向下箭头表示向BswM发送模式请求
- 模式控制流:BswM通过向上箭头表示对其他模块进行模式控制
-
主要交互模块:
- 向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具有以下核心功能:
-
模式管理:
- 管理BSW模块的模式切换
- 处理来自各模块的模式请求
- 根据预定义的规则执行相应动作
- 协调模块间的模式一致性
-
仲裁机制:
- 接收多个模块的模式请求
- 根据配置的规则和优先级决定最终的模式
- 执行相应的动作列表
-
接口提供:
- 为应用层和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从上电到关闭的完整生命周期:
-
主要状态:
- BSWM_UNINITED:未初始化状态,上电后的初始状态
- BSWM_IDLE:空闲状态,模块正常运行并处理请求的主要状态
- BSWM_SHUTDOWN:关闭状态,收到关闭请求后进入的状态
-
状态转换:
- 系统上电 → BSWM_UNINITED:系统上电后BswM处于未初始化状态
- BSWM_UNINITED → BSWM_IDLE:初始化完成后转入空闲状态
- BSWM_IDLE → BSWM_SHUTDOWN:收到EcuM关闭请求后进入关闭状态
- BSWM_SHUTDOWN → 系统关闭:关闭完成后系统关闭
-
BSWM_UNINITED内部状态:
- 等待初始化 → 初始化中:调用BswM_Init()函数开始初始化
- 初始化中 → 已初始化:初始化成功
- 初始化中 → 初始化失败:初始化过程中出现错误
- 初始化失败 → 错误状态:进入错误状态
-
BSWM_IDLE内部状态:
- 等待请求 → 处理请求:收到模式请求
- 处理请求 → 执行动作:仲裁规则匹配成功
- 执行动作 → 等待请求:动作执行完成,回到等待状态
- 处理请求 → 等待请求:无匹配规则,直接回到等待状态
-
BSWM_SHUTDOWN内部状态:
- 准备关闭 → 关闭中:调用BswM_Shutdown()开始关闭流程
- 关闭中 → 已关闭:关闭流程完成
3.2 状态说明
-
未初始化状态 (BSWM_UNINITED):
- 模块处于上电后的初始状态
- 此时不能处理任何模式请求
- 必须等待BswM_Init()调用完成初始化
-
空闲状态 (BSWM_IDLE):
- 模块已初始化并可以处理请求
- 接收各模块的模式变更请求
- 根据配置的规则执行相应动作
- 大部分时间在此状态循环
-
关闭状态 (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的完整配置结构:
-
顶层结构:
- BswM:顶层容器,包含所有BswM相关配置
- BswMGeneral:通用配置参数
- BswMModeControl:模式控制相关配置
- BswM:顶层容器,包含所有BswM相关配置
-
通用配置 (BswMGeneral):
- BswMReleaseVersion:模块版本信息
- BswMDevErrorDetect:开发错误检测开关
- BswMVersionInfoApi:版本信息API开关
- BswMTimerControl:定时器控制开关
-
模式控制 (BswMModeControl):
- BswMModeRequestPort:模式请求端口配置
- BswMModeRequestSource:模式请求源配置
- BswMDataTypeMappingSet:数据类型映射配置
- BswMConfig:配置集合
-
模式请求源 (BswMModeRequestSource):
- 定义各种模式请求源,如:
- BswMComIndication
- BswMEcuMIndication
- BswMCanSMIndication
- 等多种模式请求源
- 定义各种模式请求源,如:
-
配置集合 (BswMConfig):
- BswMArbitration:仲裁规则配置
- BswMBehavior:行为配置
- BswMModeCondition:模式条件配置
- BswMUserIncludeFile:用户包含文件配置
-
仲裁配置 (BswMArbitration):
- BswMBswMode:BSW模式配置
- BswMGenericMode:通用模式配置
- BswMRule:仲裁规则配置
- BswMRuleBase:规则基础配置
-
行为配置 (BswMBehavior):
- BswMAction:动作配置
- BswMActionList:动作列表配置
- BswMModeSwitchAcknowledgement:模式切换确认配置
4.2 配置参数说明
-
BswMGeneral参数:
- BswMDevErrorDetect:开发错误检测开关,用于启用/禁用开发阶段的错误检测
- BswMVersionInfoApi:版本信息API开关,用于启用/禁用版本信息API
- BswMTimerControl:定时器控制开关,用于启用/禁用定时器功能
-
BswMModeRequestPort参数:
- BswMModeRequestPortRef:模式请求端口引用
- BswMInitialMode:初始模式值
- BswMRequestProcessing:请求处理方式
-
BswMRule参数:
- BswMConditionValue:条件值
- BswMRuleStates:规则状态
- BswMRulePriority:规则优先级,用于确定规则执行顺序
-
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模块初始化和请求处理的完整流程:
-
参与者:
- 应用程序:触发初始化过程的应用
- EcuM:ECU管理器,负责调用BswM初始化
- BswM:BSW模式管理器,本图的主角
- SchM_BswM:调度管理器,提供互斥访问
- Det:开发错误跟踪模块,用于错误报告
-
初始化阶段:
- 应用程序调用EcuM_Init()启动初始化流程
- EcuM调用BswM_Init(ConfigPtr)初始化BswM模块
- BswM检查配置指针的有效性
- 如果配置无效,BswM报告错误并返回
- 如果配置有效,BswM执行以下操作:
- 初始化内部变量
- 保存配置指针
- 设置模块状态为初始化
- 初始化所有模式请求端口
- 设置初始模式值
- 应用初始仲裁规则
-
运行阶段:
- 应用程序调用BswM_RequestMode()请求模式切换
- BswM检查模块状态
- 如果模块未初始化,BswM报告错误并返回
- 如果模块已初始化,BswM执行以下操作:
- 更新请求的模式值
- 触发模式仲裁
- 执行匹配的动作列表
-
互斥控制:
- 在处理模式请求和执行动作时,BswM通过SchM接口确保互斥访问
- 调用SchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0()进入互斥区
- 调用SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0()退出互斥区
5.2 函数说明
-
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()
-
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接口:
-
初始化和关闭API:
void BswM_Init(const BswM_ConfigType* ConfigPtr)
:初始化BswM模块void BswM_Shutdown(void)
:关闭BswM模块
-
模式请求API:
void BswM_RequestMode(BswM_UserType userType, BswM_ModeType requestedMode)
:请求特定模式
-
模式指示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
-
定时器API:
void BswM_TimerExpired(BswM_TimerType timer)
:通知定时器到期
-
其他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;
}