从手写代码到AUTOSAR工具链-BswM应用篇
从手写代码到AUTOSAR工具链-BswM应用篇
aestech
每天分享一篇技术文章!
接前面两篇:
1、从手写代码到AUTOSAR工具链 - RTE入门篇
2、从手写代码到AUTOSAR工具链_EcuM应用篇
1 引言
在 AUTOSAR 规范中, BswM 是最基础也是最好玩的模块之一,相比 EcuM 实操的简单易学,我在学习 BswM 时经历了从不知如何下手到充分感受程序之美的奇妙过程。
本文依旧从传统的手工编程入手,讲述 BswM 所对应手写程序的代码段,重点突出其应用方法,对模块的内部机理仅做简单介绍,感兴趣的读者可参考相应 AUTOSAR 规范。
2 BswM 模块简介
下面介绍 BswM 的功用和设计步骤。
2.1 模块 概述
BswM 基本功能可以用 2 个不同的任务来描述:模式仲裁( Mode Arbitration )和模式控制( Mode Control )。
模式仲裁部分启动由基于规则的仲裁引发的模式切换,其中的模式请求和模式指示从 SWC 或其它 BSW 模块接收。
模式控制部分通过执行行为列表实现模式切换,行为列表中包含其它 BSW 模块的模式转换操作。
2.2 模式仲裁
BswM 执行基于规则的模式仲裁,这些规则由简单的布尔表达式组成。
2.2.1 仲裁规则
每个规则是 1 个包含一组模式请求条件的逻辑表达式。当输入模式请求和模式指示发生变化时,或在 BswM 主函数执行过程中,这些规则被评估。评估结果( TRUE 或 FALSE )用于决定相应模式控制行为列表的执行。
2.2.2 模式条件和逻辑表达式
逻辑表达式由一个模式仲裁规则组成,该规则可以使用不同的运算符,如 AND 、 OR 、 XOR 、 NOT 、 NAND 。表达式中的每个条目对应 1 个模式请求条件:如果模式条件引用一个 BswM 模式请求端口( BswMModeRequestPort ),条件将确认该请求或指示的模式是否与某个特定的模式相等( EQUAL 或 NOT_EQUAL );如果模式条件引用一个 BswM 事件请求端口( BswMEventRequestPort ),条件将确认该请求端口是置位还是清除( SET 或 CLEAR )。
BswM 事件请求与模式请求的区别在于:在事件请求中,请求者不向 BswM 发送要请求的模式 / 值, BswM 无需评估模式条件,而只需判定接收的事件。当请求者发送 / 调用该事件时, BswM 事件请求端口在处在置位( SET )状态。 BswM 后续可以通过执行 BswM 清除事件请求( BswMClearEventRequest )行为重新使 BswM 事件请求端口处在清除( CLEAR )状态。
图 2-1 为包含 2 个条件的 BswM 规则示例。
图 2-1: 包含 2 个条件的 BswM 规则示例
2.3 模式控制
BswM 的模式控制部分基于模式仲裁的结果执行所有需要的行为( Action ),这些行为的集合就是行为列表( Action Lists )。 1 个行为列表就是一组按顺序排列的行为,在模式仲裁触发时执行。
2. 4 设计步骤
BswM 设计主要在 ISOLAR-AB 环境下进行。
2.4.1 ARXML 创建
在 BswM 模块创建时同步进行。
2.4.2 模块配置
在 ISOLAR-B 中创建并配置 BswM 模块。
3 控制实例
我们继续以应用在重卡主驾座椅上的 “ ECAS 控制器”为例,说明 BswM 的实现过程。该控制器的核心功能是“将座椅高度始终保持在设定位置上”,通过控制进气阀和排气阀的开闭调节空气弹簧的充气量,从而实现加载在座椅的重量发生变化时(不坐人或坐不同重量的人)其高度始终不变。表 3-1 为与之相关的主要部件及其功用。
表 3-1: 座椅 ECAS 控制器相关主要部件及其功用
序号 |
部件名称 |
功用 |
1 |
高度传感器 |
实时采集座椅当前高度 |
2 |
进气阀和排气阀 |
( 1 )进气阀打开,排气阀关闭:空气弹簧充气,座椅高度上升 ( 2 )进气阀关闭,排气阀打开:空气弹簧放气,座椅高度下降 ( 3 )进气阀和排气阀都关闭:空气弹簧无动作,座椅高度不变 ( 4 )进气阀和排气阀都打开:错误状态 |
4 手写代码实现方法
座椅 ECAS 控制器除“高度控制”的核心功能外,还包含以下主要模块:
( 1 )通信模块:与座椅舒适性模块、控制面板组成 CAN 网络,接收控制面板的高度调节指令,并实时反馈自身状态。
( 2 )数据存储模块:在 EEPROM 中存储座椅设定高度和部件故障状态等参数。
( 3 )休眠模块:当监测到 KL15 的状态由 ON 变为 OFF (用户关闭钥匙开关)后,延迟一段时间切断单片机电源(启用自杀电路)。
上述模块的部分或全部在 BswM 中实现,图 4-1 为手工编程方式的流程图。
图 4-1: 座椅 ECAS 控制器 BswM 手工编程流程图
5 AUTOSAR 工具链实现方法
本章介绍在 ISOLAR-AB 中创建和配置“座椅 ECAS 控制器” BswM 模块的步骤。
5.1 设计目标
BswM 模块的设计目标是实现图 5-1 所示的状态机。
图 5-1: BswM 状态机
5. 2 BswM 模块创建和通用配置
首先需要在 ISOLAR-B 中创建 BswM 模块及其 ARXML 文件,再对其进行“通用配置”,这是后续一系列配置操作的基础。
5.2.1 BswM 模块创建
按照图 5-2 和图 5-3 所示的步骤创建 BswM 模块。
图 5-2: BswM 模块创建启动
图 5-3: BswM 模块创建操作
5.2.2 BswM 通用配置
按照图 5-4 所示进入 BswM 通用配置界面,表 5-1 和表 5-2 为其配置情况。
图 5-4: BswM 通用配置界面进入
表 5-1: BswM 通用参数配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswMGeneral |
配置箱名称 |
2 |
BswMCanSMEnabled |
false |
禁止 CanSM 模块与 BswM API 相关 |
3 |
BswMComMEnabled |
true |
使能 ComM 模块与 BswM API 相关 |
4 |
BswMDcmEnabled |
true |
使能 Dcm 模块与 BswM API 相关 |
5 |
BswMDevErrorDetect |
true |
错误检测和通知使能 |
6 |
BswMEcuMEnabled |
true |
使能 EcuM 模块与 BswM API 相关 |
7 |
BswMEthIfEnabled |
false |
禁止 EthIf 模块与 BswM API 相关 |
8 |
BswMEthSMEnabled |
false |
禁止 EthSM 模块与 BswM API 相关 |
9 |
BswMFrSMEnabled |
false |
禁止 FrSM 模块与 BswM API 相关 |
10 |
BswMGenericRequestEnable |
true |
使能通用请求与 BswM API 相关 |
11 |
BswMJ1939DcmEnabled |
false |
禁止 J1939Dcm 模块与 BswM API 相关 |
12 |
BswMJ1939NmEnabled |
false |
禁止 J1939Nm 模块与 BswM API 相关 |
13 |
BswMLinSMEnabled |
false |
禁止 LinSM 模块与 BswM API 相关 |
14 |
BswMLinTPEnabled |
false |
禁止 LinTP 模块与 BswM API 相关 |
15 |
BswMMainFunctionPeriod |
0.01 |
BswM 主函数调用周期: 0.01s |
16 |
BswMNmEnabled |
false |
禁止 Nm 模块与 BswM API 相关 |
17 |
BswMNvMEnabled |
false |
禁止 NvM 模块与 BswM API 相关 |
18 |
BswMRbMaxNumOfRules |
30 |
指定 BswM 模块的每个变量能够被配置的最大规则数量 |
19 |
BswMSchMEnabled |
true |
使能 SchM 模块与 BswM API 相关 |
20 |
BswMSdEnabled |
false |
禁止 Sd 模块与 BswM API 相关 |
21 |
BswMVersionInfoApi |
true |
使能用 BswM_GetVersionInfo() 服务读取版本信息 |
22 |
BswMWdgMEnabled |
false |
使能 WdgM 模块与 BswM API 相关 |
23 |
BswMRbDebugEnable |
false |
如果模式请求被中断,不记录任何信息 |
24 |
BswMRbIntrptQueueMaxSize |
5 |
队列中最大的 BswM 请求 |
表 5-2: BswM 用户包含文件
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswMUserIncludeFiles |
配置箱名称 |
2 |
BswMUserIncludeFile |
Rte_main.h CanIf.h ComM.h Com.h PduR.h EcuM.h Dcm.h calibrate.h |
被 BswM 模块包含的头文件 |
5.3 模式配置
下面进行 BswM 模式创建和相关配置。
5.3.1 ARXML 创建
在 ISOLAR-AB 中创建 BswM_ModeMapping.arxml 及其 “ AUTOSAR_BswM ”的 AR Package 。
5.3.2 打开 AUTOSAR 浏览器窗口
后续操作在 “ AUTOSAR Explore ”窗口下进行,图 5-5 为显示该窗口的方式。
图 5-5: AUTOSAR Explore 窗口显示方式
5.3.3 元素创建
在 AUTOSAR_BswM 下创建名为“ ModeDeclarationGroups ”的子 AR Package ,再如图 5-6 所示为其建立元素( Elements ),元素类型和名称如表 5-3 所列。
图 5-6: AR Package 元素创建
表 5-3: AR Package 元素创建表
序号 |
元素类型 |
元素名称 |
1 |
Mode Declaration Group |
MDG_ECUM_STATE |
2 |
DataType Mapping Set |
ECUM_STATE_Mapping |
图 5-7: AR Package 元素创建执行效果
5.3.4 模式创建
图 5-8 为 BswM 模式的创建方法,表 5-4 为应创建的 BswM 模式。
图 5-8: BswM 模式操作方法
表 5-4: BswM 模式
模式值 |
模式名称 |
含义 |
1 |
ECUM_STATE_STARTUP_ONE |
初始化模式 1 : EEPROM 初始化和数据读取 |
2 |
ECUM_STATE_STARTUP_TWO |
初始化模式 2 :通信初始化、 RTE 启动 |
3 |
ECUM_STATE_RUN |
初始化模式 3 :通信启动、应用层初始化 |
4 |
ECUM_STATE_APP_RUN |
运行模式:程序正常执行 |
5 |
ECUM_STATE_POST_RUN |
预休眠模式:通信关闭、 EEPROM 数据写入 |
6 |
ECUM_STATE_PREP_SHUTDOWN |
预下电模式: RTE 关闭 |
7 |
ECUM_STATE_SHUTDOWN |
下电模式:控制器下电 |
5.3.5 参数配置
需要对 BswM 起始状态等参数进行配置。
图 5-9: BswM 模式参数配置界面
表 5-5: BswM 模式参数配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
MDG_ECUM_STATE |
配置箱名称 |
2 |
Category |
EXPLICIT_ORDER |
|
3 |
ShortNamePattern |
- |
|
4 |
OnTransitionValue |
- |
|
5 |
InitialMode |
ECUM_STATE_STARTUP_ONE |
BswM 初始模式 |
5.3.6 映射创建
按照图 5-10 的方法进行。
图 5-10: 映射创建
5.4 行为配置
图 5-11 为 BswM 行为配置方法,表 5-6 列出了应创建的 BswM 行为。
图 5-11: BswM 行为配置
表 5-6: BswM 行为
序号 |
行为配置描述 |
含义 |
1 |
BswM_AI_BswMSwitchStartupTwo ShortName : BswMSchMSwitch BswMSchMModeDeclarationGroupRef : None BswMSchMSwitchedMode : ECUM_STATE_STARTUP_TWO |
BswM 切换至初始化模式 2 |
2 |
BswM_AI_BswMSwitchRun ShortName : BswMSchMSwitch BswMSchMModeDeclarationGroupRef : None BswMSchMSwitchedMode : ECUM_STATE_RUN |
BswM 切换至初始化模式 3 |
3 |
BswM_AI_BswMSwitchAppRun ShortName : BswMSchMSwitch BswMSchMModeDeclarationGroupRef : None BswMSchMSwitchedMode : ECUM_STATE_APP_RUN |
BswM 切换至运行模式 |
4 |
BswM_AI_BswMSwitchPostRun ShortName : BswMSchMSwitch BswMSchMModeDeclarationGroupRef : None BswMSchMSwitchedMode : ECUM_STATE_POST_RUN |
BswM 切换至预休眠模式 |
5 |
BswM_AI_BswMSwitchPrepShutdown ShortName : BswMSchMSwitch BswMSchMModeDeclarationGroupRef : None BswMSchMSwitchedMode : ECUM_STATE_PREP_SHUTDOWN |
BswM 切换至预下电模式 |
6 |
BswM_AI_BswMSwitchShutdown ShortName : BswMSchMSwitch BswMSchMModeDeclarationGroupRef : None BswMSchMSwitchedMode : ECUM_STATE_SHUTDOWN |
BswM 切换至下电模式 |
7 |
BswM_AI_GoDown ShortName : BswMUserCallout BswMUserCalloutFunction : EcuM_GoDown(42) |
EcuM 关闭 |
8 |
BswM_AI_ComMReqFullComm_User0 ShortName : BswMComMModeSwitch BswMComMRequestedMode : BSWM_FULL_COM BswMComMUserRef : ComMUser_Can_Network_BCAN_Channel |
BCAN 节点模式为全通信 |
9 |
BswM_AI_ComMReqNoComm_User0 ShortName : BswMComMModeSwitch BswMComMRequestedMode : BSWM_NO_COM BswMComMUserRef : ComMUser_Can_Network_BCAN_Channel |
BCAN 节点模式为无通信 |
10 |
BswM_AI_ComMCommAllowed_Can1 ShortName : BswMComMAllowCom BswMComAllowed : true BswMComMAllowChannelRef : ComMChannel_Can_Network_BCAN_Channel |
CAN1 节点通信允许 |
11 |
BswM_AI_ComMCommNotAllowed_Can1 ShortName : BswMComMAllowCom BswMComAllowed : false BswMComMAllowChannelRef : ComMChannel_Can_Network_BCAN_Channel |
CAN1 节点通信禁止 |
12 |
BswM_AI_RteTimerStart ShortName : BswM_UserCallout BswMUserCalloutFunction : IC_RteTimerStart() |
RTE 启动 |
13 |
BswM_AI_RteStop ShortName : BswMUserCallout BswMUserCalloutFunction : Rte_Stop() |
RTE 停止 |
14 |
BswM_AI_CanIfInit ShortName : BswMUserCallout BswMUserCalloutFunction : CanIf_Init(NULL_PTR) |
CanIf 初始化 |
15 |
BswM_AI_ComMInit ShortName : BswMUserCallout BswMUserCalloutFunction : ComM_Init(NULL_PTR) |
ComM 初始化 |
16 |
BswM_AI_ComInit ShortName : BswMUserCallout BswMUserCalloutFunction : Com_Init(NULL_PTR) |
Com 初始化 |
17 |
BswM_AI_PduRInit ShortName : BswMUserCallout BswMUserCalloutFunction : PduR_Init(&PduR_Config) |
PduR 初始化 |
18 |
BswM_AI_EcuM_MainFunction ShortName : BswMUserCallout BswMUserCalloutFunction : Loop_EcuM_MainFunction() |
调用 EcuM 主函数 |
19 |
BswM_AI_ComMDeInit ShortName : BswMUserCallout BswMUserCalloutFunction : ComM_DeInit() |
ComM 反向初始化 |
20 |
BswM_AI_StartPdu ShortName : BswMPduGroupSwitch BswMPduGroupSwitchReinit : false BswMDisabledPduGroupRef : NONE BswMEnabledPduGroupRef : ComIPduGroup_Rx 、 ComIPduGroup_Tx |
Pdu 启动 |
21 |
BswM_AI_StopPdu ShortName : BswMPduGroupSwitch BswMPduGroupSwitchReinit : false BswMDisabledPduGroupRef : ComIPduGroup_Rx 、 ComIPduGroup_Tx BswMEnabledPduGroupRef : NONE |
Pdu 停止 |
22 |
BswM_AI_ PowerOff ShortName : BswMUserCallout BswMUserCalloutFunction : PowerControlOff() |
系统下电 |
23 |
BswM_AI_ App _Init ShortName : BswMUserCallout BswMUserCalloutFunction : Controller_initialize () |
APP 初始化 |
24 |
BswM_AI_ Eeprom ReadAll ShortName : BswMUserCallout BswMUserCalloutFunction : InitEepromParameter() |
EEPROM 全部数据读取 |
25 |
BswM_AI_DcmInit ShortName : BswMUserCallout BswMUserCalloutFunction : Dcm_Init() |
Dcm 初始化 |
26 |
BswM_AI_BswMSwitch Startup One ShortName : BswMSchMSwitch BswMSchMModeDeclarationGroupRef : None BswMSchMSwitchedMode : ECUM_STATE_STARTUP_ONE |
BswM 切换至初始化模式 1 |
27 |
BswM_AI_ Eeprom WriteAll ShortName : BswMUserCallout BswMUserCalloutFunction : SaveParameterToEeprom() |
EEPROM 全部数据写入 |
5.5 行为列表配置
图 5-12 和图 5-13 为 BswM 行为列表配置方法。
图 5-12: BswM 行为列表操作
图 5-13: BswM 行为列表条目参数配置
下面逐一列出项目需要配置的行为列表。
表 5-7: BswM 行为列表
序号 |
行为列表名称 |
行为列表名称执行 ① |
功用 |
1 |
BswM_AL_BswMSwitchStartupTwo |
BSWM_CONDITION |
进入初始化模式 2 的行为序列 |
2 |
BswM_AL_BswMSwitchRun |
BSWM_TRIGGER |
进入初始化模式 3 的行为序列 |
3 |
BswM_AL_BswMSwitchAppRun |
BSWM_TRIGGER |
进入运行模式的行为序列 |
4 |
BswM_AL_BswMSwitchPrepShutdown |
BSWM_TRIGGER |
进入预下电模式的行为序列 |
5 |
BswM_AL_BswMSwitchShutdown |
BSWM_TRIGGER |
进入下电模式的行为序列 |
6 |
BswM_AL_BswMSwitchGoDown |
BSWM_TRIGGER |
控制器下电 |
7 |
BswM_AL_BswMSwitchOne |
BSWM_TRIGGER |
进入初始化模式 1 的行为序列 |
① BSWM_CONDITION :规则每次被评估时行为列表都要执行; BSWM_TRIGGER :规则评估结果改变时行为列表才执行
表 5-8: BswM_AL_BswMSwitchStartupTwo 列表条目配置
序号 |
行为列表条目 |
失败时中止 |
索引 |
行为列表条目引用 |
1 |
BswM_ALI_ Eeprom Read All |
FALSE |
0 |
BswM_AI_ Eeprom ReadAll |
2 |
BswM_ALI_BswMStartupTwo |
FALSE |
1 |
BswM_AI_BswMSwitchStartupTwo |
表 5-9: BswM_AL_BswMSwitchRun 列表配置
序号 |
行为列表条目 |
失败时中止 |
索引 |
行为列表条目引用 |
1 |
BswM_ALI_CanIfInit |
FALSE |
0 |
BswM_AI_CanIfInit |
2 |
BswM_ALI_PduRInit |
FALSE |
1 |
BswM_AI_PduRInit |
3 |
BswM_ALI_ComInit |
FALSE |
2 |
BswM_AI_ComInit |
4 |
BswM_ALI_DcmInit |
FALSE |
3 |
BswM_AI_DcmInit |
5 |
BswM_ALI_ComMInit |
FALSE |
4 |
BswM_AI_ComMInit |
6 |
BswM_ALI_RteTimerStart |
FALSE |
5 |
BswM_AI_RteTimerStart |
7 |
BswM_ALI_BswMRun |
FALSE |
6 |
BswM_AI_BswMSwitchRun |
表 5-10: BswM_AL_BswMSwitchAppRun 列表配置
序号 |
行为列表条目 |
失败时中止 |
索引 |
行为列表条目引用 |
1 |
BswM_ALI_StartPdu |
FALSE |
0 |
BswM_AI_StartPdu |
2 |
BswM_ALI_AllowComm_Can0 |
FALSE |
1 |
BswM_AI_ComMCommAllowed_Can1 |
3 |
BswM_ALI_ComMReqFullComm_User0 |
FALSE |
2 |
BswM_AI_ComMReqFullComm_User0 |
4 |
BswM_ALI_ App_Init |
FALSE |
3 |
BswM_AI_ App _Init |
5 |
BswM_ALI_BswMAppRun |
FALSE |
4 |
BswM_AI_BswMSwitchAppRun |
表 5-11: BswM_AL_BswMSwitchPrepShutdown 列表配置
序号 |
行为列表条目 |
失败时中止 |
索引 |
行为列表条目引用 |
1 |
BswM_ALI_NotAllowComm_Can0 |
FALSE |
0 |
BswM_AI_ComMCommNotAllowed_Can1 |
2 |
BswM_ALI_ComMReqNoComm_User0 |
FALSE |
1 |
BswM_AI_ComMReqNoComm_User0 |
3 |
BswM_ALI_StopPdu |
FALSE |
2 |
BswM_AI_StopPdu |
4 |
BswM_ALI_WriteAll |
FALSE |
3 |
BswM_AI_ Eeprom WriteAll |
5 |
BswM_ALI_BswMPrepShutdown |
FALSE |
4 |
BswM_AI_BswMSwitchPrepShutdown |
表 5-12: BswM_AL_BswMSwitchShutdown 列表配置
序号 |
行为列表条目 |
失败时中止 |
索引 |
行为列表条目引用 |
1 |
BswM_ALI_RteStop |
FALSE |
0 |
BswM_AI_RteStop |
2 |
BswM_ALI_ComMDeInit |
FALSE |
1 |
BswM_AI_ComMDeInit |
3 |
BswM_ALI_BswMShutdown |
FALSE |
2 |
BswM_AI_BswMSwitchShutdown |
表 5-13: BswM_AL_BswMSwitchGoDown 列表配置
序号 |
行为列表条目 |
失败时中止 |
索引 |
行为列表条目引用 |
1 |
BswM_ALI_GoDown |
FALSE |
0 |
BswM_AI_GoDown |
2 |
BswM_ALI_EcuM_MainFunction |
FALSE |
1 |
BswM_AI_EcuM_MainFunction |
3 |
BswM_ALI_ PowerOff |
FALSE |
2 |
BswM_AI_ PowerOff |
表 5-14: BswM_AL_BswMSwitchOne 列表配置
序号 |
行为列表条目 |
失败时中止 |
索引 |
行为列表条目引用 |
1 |
BswM_ALI_BswMStartupOne |
FALSE |
0 |
BswM_AI_BswMSwitch Startup One |
5.6 请求端口配置
“ BswMModeRequestPort ”配置箱的每个实例定义 1 个模式请求接口,用于向 BswM 请求或指示模式。这些接口用端口或 C 函数实现,基于该请求源是 SWC 还是 BSW 模块。
共有 3 种不同的模式请求类型。
( 1 )来自 SWC 的模式请求;
( 2 )来自其它 BSW 模块的模式请求,如 DCM ;
( 3 )来自 RTE 或其它 BSW 模块的状态 / 模式指示,如总线特定状态管理器。
5 . 6.1 请求端口创建
图 5-14 为 BswM 请求端口配置方法,表 5-15 列出了创建的请求端口。
图 5-14: BswM 请求端口配置
表 5-15: BswM 请求端口列表
序号 |
BswM 模式请求端口 |
BswM 请求处理 ① |
功用 |
1 |
BswM_MRP_BswM_MDG |
BSWM_DEFERRED |
|
2 |
BswM_MRP_SwcModeRequest |
BSWM_DEFERRED |
① BSWM_DEFERRED :当接收到模式请求时,模式仲裁处理延后到 BswM 主函数中进行; BSWM_IMMEDIATE :当接收到模式请求时,模式仲裁处理立即执行
5.6.2 模式请求源 配置
“ BswMModeRequestSource ”配置箱指定模式请求源或状态 / 模式指示。模式请求者可以是 SWC 或其它 BSW 模块,如总线特定状态管理器。
表 5-16: 模式请求源配置子箱说明
序号 |
配置子箱名称 |
说明 |
1 |
BswMBswModeNotification |
模式请求源来自另一个 BSW 模块 |
2 |
BswMSwcModeRequest |
模式请求源来自 SWC |
表 5-17: BswM_MRP_BswM_MDG 端口参数配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswMBswModeNotification |
配置箱名称 |
2 |
BswMRbBswModeDeclarationGroup |
/AUTOSAR_BswM/ModeDeclarationGroups/MDG_ECUM_STATE |
模式声明组的引用 |
表 5-18: BswM_MRP_SwcModeRequest 端口参数配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswMSwcModeRequest |
配置箱名称 |
2 |
BswMRbModeRequestQueueSize |
0 |
模式通信无队列 |
3 |
BswMSwcModeRequestVariableDataPrototypeRef |
VDP_uint16 |
S/R 接口请求模式数据元素的引用: uint16 |
5.7 模式条件 配置
“ BswMModeCondition ”配置箱描述 BswM 模式条件,这些条件既可以用于生成 1 个规则,也可以作为逻辑表达式的一部分。
5.7 .1 模式条件创建
图 5-15 和图 5-16 为 BswM 模式条件配置方法,表 5-19 列出应创建的模式条件。
图 5-15: BswM 模式条件配置
图 5-16: BswM 模式条件参数配置
表 5-19: BswM 模式条件列表
序号 |
名称 |
功用 |
1 |
BswM_MC_BswM_StartupOne |
判定程序处在初始化模式 1 的条件 |
2 |
BswM_MC_BswM_StartupTwo |
判定程序处在初始化模式 2 的条件 |
3 |
BswM_MC_BswM_Run |
判定程序处在初始化模式 3 的条件 |
4 |
BswM_MC_BswM_PostRun |
判定程序处在预休眠模式的条件 |
5 |
BswM_MC_BswM_PrepShutdown |
判定程序处在预下电模式的条件 |
6 |
BswM_MC_BswM_Shutdown |
判定程序处在下电模式的条件 |
5 . 7.2 模式条件 值参数 配置
“ BswMConditionValue ”配置箱包含用于模式请求比较的模式类型和值的参数和引用,它由 2 个子箱组成,如表 5-20 所列。
表 5-20: 模式条件值配置子箱
序号 |
名称 |
功用 |
1 |
BswMBswMode |
定义 BSW 中的值和模式类型 |
2 |
BswMModeDeclaration |
当模式对应一个模式请求或模式指示的接口,则需要配置这个子箱。模式声明定义在 SWC 的模板中,故需要使用与模式声明对应的外部引用 |
表 5-21: BswM_MC_BswM_StartupOne 模式条件配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_MC_BswM_StartupOne |
模式条件名称 |
|
2 ① |
BswMConditionType |
BSWM_EQUALS |
指定模式条件评估的比较类型 |
|
3 ② |
BswMConditionMode |
BswM_MRP_BswM_MDG |
模式请求端口或事件请求端口的引用 |
4 |
ShortName |
BswMConditionValue |
配置箱名称 |
5 |
ShortName |
BswMModeDeclaration |
配置箱名称 |
|
6 ② |
BswMModeValueRef |
ECUM_STATE_STARTUP_ONE |
与该条件相对应模式请求的模式声明的外部引用 |
①BSWM_EQUALS |BSWM_EQUALS_NOT :被 BswMConditionMode 引用的 BswM 模式请求端口与在 BswMConditionValue 中配置的值相比较,相等或不等;
BSWM_EVENT_IS_SET | BSWM_EVENT_IS_CLEARED :被 BswMConditionMode 引用的 BswM 事件请求端口被检查为“置位”或“清除”
② BswM_MRP_BswM_MDG ( MDG_ECUM_STATE ) ==ECUM_STATE_STARTUP_ONE ,条件成立;否则条件不成立
表 5-22: BswM_MC_BswM_StartupTwo 模式条件配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_MC_BswM_StartupTwo |
模式条件名称 |
2 |
BswMConditionType |
BSWM_EQUALS |
指定模式条件评估的比较类型 |
3 |
BswMConditionMode |
BswM_MRP_BswM_MDG |
模式请求端口或事件请求端口的引用 |
4 |
ShortName |
BswMConditionValue |
配置箱名称 |
5 |
ShortName |
BswMModeDeclaration |
配置箱名称 |
6 |
BswMModeValueRef |
ECUM_STATE_STARTUP_TWO |
与该条件相对应模式请求的模式声明的外部引用 |
表 5-23: BswM_MC_BswM_Run 模式条件配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_MC_BswM_Run |
模式条件名称 |
2 |
BswMConditionType |
BSWM_EQUALS |
指定模式条件评估的比较类型 |
3 |
BswMConditionMode |
BswM_MRP_BswM_MDG |
模式请求端口或事件请求端口的引用 |
4 |
ShortName |
BswMConditionValue |
配置箱名称 |
5 |
ShortName |
BswMModeDeclaration |
配置箱名称 |
6 |
BswMModeValueRef |
ECUM_STATE_RUN |
与该条件相对应模式请求的模式声明的外部引用 |
表 5-24: BswM_MC_BswM_PostRun 模式条件配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_MC_BswM_PostRun |
模式条件名称 |
2 |
BswMConditionType |
BSWM_EQUALS |
指定模式条件评估的比较类型 |
|
3 ① |
BswMConditionMode |
BswM_MRP_SwcModeRequest |
模式请求端口或事件请求端口的引用 |
4 |
ShortName |
BswMConditionValue |
配置箱名称 |
5 |
ShortName |
BswMModeDeclaration |
配置箱名称 |
|
6 ① |
BswMModeValueRef |
ECUM_STATE_POST_RUN |
与该条件相对应模式请求的模式声明的外部引用 |
① SWC 中的请求 == ECUM_STATE_POST_RUN ,条件成立;否则条件不成立
表 5-25: BswM_MC_BswM_PrepShutdown 模式条件配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_MC_BswM_PrepShutdown |
模式条件名称 |
2 |
BswMConditionType |
BSWM_EQUALS |
指定模式条件评估的比较类型 |
3 |
BswMConditionMode |
BswM_MRP_BswM_MDG |
模式请求端口或事件请求端口的引用 |
4 |
ShortName |
BswMConditionValue |
配置箱名称 |
5 |
ShortName |
BswMModeDeclaration |
配置箱名称 |
6 |
BswMModeValueRef |
ECUM_STATE_PREP_SHUTDOWN |
与该条件相对应模式请求的模式声明的外部引用 |
表 5-26: BswM_MC_BswM_Shutdown 模式条件配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_MC_BswM_Shutdown |
模式条件名称 |
2 |
BswMConditionType |
BSWM_EQUALS |
指定模式条件评估的比较类型 |
3 |
BswMConditionMode |
BswM_MRP_BswM_MDG |
模式请求端口或事件请求端口的引用 |
4 |
ShortName |
BswMConditionValue |
配置箱名称 |
5 |
ShortName |
BswMModeDeclaration |
配置箱名称 |
6 |
BswMModeValueRef |
ECUM_STATE_SHUTDOWN |
与该条件相对应模式请求的模式声明的外部引用 |
5.8 逻辑表达式配置
“ BswMLogicalExpression ”配置箱包含用于模式仲裁的逻辑表达式,其由一组参数和一个逻辑运算符组成。
每一个参数既可以是模式条件,又可以是子表达式,用以定义更加复杂的逻辑表达式。
5.8 .1 逻辑表达式创建
图 5-17 为 BswM 逻辑表达式的配置方法,表 5-27 列出应创建的逻辑表达式。
图 5-17: BswM 逻辑表达式配置
表 5-27: BswM 逻辑表达式列表
序号 |
名称 |
功用 |
1 |
BswM_LE_StartupOne |
判定当前模式是否为初始化模式 1 |
2 |
BswM_LE_StartupTwo |
判定当前模式是否为初始化模式 2 |
3 |
BswM_LE_Run |
判定当前模式是否为初始化模式 3 |
4 |
BswM_LE_PostRun |
判定当前模式是否为预休眠模式 |
5 |
BswM_LE_PrepShutdown |
判定当前模式是否为预下电模式 |
6 |
BswM_LE_Shutdown |
判定当前模式是否为下电模式 |
5 . 8. 2 逻辑表达式 参数 配置
按照下面一组表格配置 6 个逻辑表达式的参数。
表 5-28: BswM_LE_StartupOne 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_LE_StartupOne |
逻辑表达式名称 |
2 |
BswMLogicalOperator |
- |
指定用于逻辑表达式的运算符,如果表达式仅包含单一条件,则此配置项不起作用 |
3 |
BswMArgumentRef |
BswM_MC_BswM_StartupOne |
选择模式条件或子表达式的引用 |
表 5-29: BswM_LE_StartupTwo 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_LE_StartupTwo |
逻辑表达式名称 |
2 |
BswMLogicalOperator |
- |
指定用于逻辑表达式的运算符,如果表达式仅包含单一条件,则此配置项不起作用 |
3 |
BswMArgumentRef |
BswM_MC_BswM_StartupTwo |
选择模式条件或子表达式的引用 |
表 5-30: BswM_LE_Run 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_LE_Run |
逻辑表达式名称 |
2 |
BswMLogicalOperator |
- |
指定用于逻辑表达式的运算符,如果表达式仅包含单一条件,则此配置项不起作用 |
3 |
BswMArgumentRef |
BswM_MC_BswM_Run |
选择模式条件或子表达式的引用 |
表 5-31: BswM_LE_PostRun 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_LE_PostRun |
逻辑表达式名称 |
2 |
BswMLogicalOperator |
- |
指定用于逻辑表达式的运算符,如果表达式仅包含单一条件,则此配置项不起作用 |
3 |
BswMArgumentRef |
BswM_MC_BswM_PostRun |
选择模式条件或子表达式的引用 |
表 5-32: BswM_LE_PrepShutdown 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_LE_PrepShutdown |
逻辑表达式名称 |
2 |
BswMLogicalOperator |
- |
指定用于逻辑表达式的运算符,如果表达式仅包含单一条件,则此配置项不起作用 |
3 |
BswMArgumentRef |
BswM_MC_BswM_PrepShutdown |
选择模式条件或子表达式的引用 |
表 5-33: BswM_LE_Shutdown 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_LE_Shutdown |
逻辑表达式名称 |
2 |
BswMLogicalOperator |
- |
指定用于逻辑表达式的运算符,如果表达式仅包含单一条件,则此配置项不起作用 |
3 |
BswMArgumentRef |
BswM_MC_BswM_Shutdown |
选择模式条件或子表达式的引用 |
5.9 规则配置
“ BswMRule ”配置箱的每个实例描述一条 BswM 仲裁规则,该规则由一个简单的模式条件或较复杂的逻辑表达式组成。这个配置箱同时引用对应规则判定为 TRUE 或 FALSE 时激活的行为列表。
5.9 .1 规则创建
图 5-18 为 BswM 规则的配置方法,表 5-34 列出应创建的规则。
图 5-18: BswM 规则配置
表 5-34: BswM 规则列表
序号 |
名称 |
功用 |
1 |
BswM_AR_StartupOne |
初始化模式 1 的程序执行规则 |
2 |
BswM_AR_StartupTwo |
初始化模式 2 的程序执行规则 |
3 |
BswM_AR_Run |
初始化模式 3 的程序执行规则 |
4 |
BswM_AR_PostRun |
预休眠模式的程序执行规则 |
5 |
BswM_AR_Shutdown |
预下电模式的程序执行规则 |
6 |
BswM_AR_Godown |
下电模式的程序执行规则 |
5.9 .2 规则参数配置
按照下面一组表格配置 6 个规则的参数。
表 5-35: BswM_AR_StartupOne 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_AR_StartupOne |
规则名称 |
2 |
BswMNestedExecutionOnly |
false |
独立规则,每次适用时都要进行评估 |
3 |
BswMRuleInitState |
BSWM_FALSE |
这个参数作为 BswM 复位 / 初始化行为的一部分。行为列表将在规则评估结果与前次相比发生变化时执行,该参数定义规则“前次评估结果”的初始值 |
4 |
BswMRuleExpressionRef |
BswM_LE_StartupOne |
用于评估规则的逻辑表达式的引用 |
5 |
BswMRuleFalseActionList |
- |
逻辑表达式判定结果为 FALSE 时执行的行为列表 |
6 |
BswMRuleTrueActionList |
BswM_AL_BswMSwitchStartupTwo |
逻辑表达式判定结果为 TRUE 时执行的行为列表 |
表 5-36: BswM_AR_StartupTwo 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_AR_StartupTwo |
规则名称 |
2 |
BswMNestedExecutionOnly |
false |
独立规则,每次适用时都要进行评估 |
3 |
BswMRuleInitState |
BSWM_FALSE |
这个参数作为 BswM 复位 / 初始化行为的一部分。行为列表将在规则评估结果与前次相比发生变化时执行,该参数定义规则“前次评估结果”的初始值 |
4 |
BswMRuleExpressionRef |
BswM_LE_StartupTwo |
用于评估规则的逻辑表达式的引用 |
5 |
BswMRuleFalseActionList |
- |
逻辑表达式判定结果为 FALSE 时执行的行为列表 |
6 |
BswMRuleTrueActionList |
BswM_AL_BswMSwitchRun |
逻辑表达式判定结果为 TRUE 时执行的行为列表 |
表 5-37: BswM_AR_Run 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_AR_Run |
规则名称 |
2 |
BswMNestedExecutionOnly |
false |
独立规则,每次适用时都要进行评估 |
3 |
BswMRuleInitState |
BSWM_FALSE |
这个参数作为 BswM 复位 / 初始化行为的一部分。行为列表将在规则评估结果与前次相比发生变化时执行,该参数定义规则“前次评估结果”的初始值 |
4 |
BswMRuleExpressionRef |
BswM_LE_Run |
用于评估规则的逻辑表达式的引用 |
5 |
BswMRuleFalseActionList |
- |
逻辑表达式判定结果为 FALSE 时执行的行为列表 |
6 |
BswMRuleTrueActionList |
BswM_AL_BswMSwitchAppRun |
逻辑表达式判定结果为 TRUE 时执行的行为列表 |
表 5-38: BswM_AR_PostRun 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_AR_PostRun |
规则名称 |
2 |
BswMNestedExecutionOnly |
false |
独立规则,每次适用时都要进行评估 |
3 |
BswMRuleInitState |
BSWM_FALSE |
这个参数作为 BswM 复位 / 初始化行为的一部分。行为列表将在规则评估结果与前次相比发生变化时执行,该参数定义规则“前次评估结果”的初始值 |
4 |
BswMRuleExpressionRef |
BswM_LE_PostRun |
用于评估规则的逻辑表达式的引用 |
5 |
BswMRuleFalseActionList |
- |
逻辑表达式判定结果为 FALSE 时执行的行为列表 |
6 |
BswMRuleTrueActionList |
BswM_AL_BswMSwitchPrepShutdown |
逻辑表达式判定结果为 TRUE 时执行的行为列表 |
表 5-39: BswM_AR_Shutdown 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_AR_Shutdown |
规则名称 |
2 |
BswMNestedExecutionOnly |
false |
独立规则,每次适用时都要进行评估 |
3 |
BswMRuleInitState |
BSWM_FALSE |
这个参数作为 BswM 复位 / 初始化行为的一部分。行为列表将在规则评估结果与前次相比发生变化时执行,该参数定义规则“前次评估结果”的初始值 |
4 |
BswMRuleExpressionRef |
BswM_LE_PrepShutdown |
用于评估规则的逻辑表达式的引用 |
5 |
BswMRuleFalseActionList |
- |
逻辑表达式判定结果为 FALSE 时执行的行为列表 |
6 |
BswMRuleTrueActionList |
BswM_AL_BswMSwitchShutdown |
逻辑表达式判定结果为 TRUE 时执行的行为列表 |
表 5-40: BswM_AR_Godown 逻辑表达式配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswM_AR_Godown |
规则名称 |
2 |
BswMNestedExecutionOnly |
false |
独立规则,每次适用时都要进行评估 |
3 |
BswMRuleInitState |
BSWM_FALSE |
这个参数作为 BswM 复位 / 初始化行为的一部分。行为列表将在规则评估结果与前次相比发生变化时执行,该参数定义规则“前次评估结果”的初始值 |
4 |
BswMRuleExpressionRef |
BswM_LE_Shutdown |
用于评估规则的逻辑表达式的引用 |
5 |
BswMRuleFalseActionList |
- |
逻辑表达式判定结果为 FALSE 时执行的行为列表 |
6 |
BswMRuleTrueActionList |
BswM_AL_BswMSwitchGoDown |
逻辑表达式判定结果为 TRUE 时执行的行为列表 |
5.10 数据类型映射集配置
该箱包含数据类型映射集的引用,图 5-19 为其配置方法,表 5-41 列出配置项。
图 5-19: 数据类型映射集配置
表 5-41: 数据类型映射集参数 配置
序号 |
配置项 |
配置值 |
说明 |
1 |
ShortName |
BswMDataTypeMappingSets |
配置箱名称 |
2 |
BswMDataTypeMappingSetRef |
ECUM_STATE_Mapping |
数据类型映射集的引用 |
5.11 RTE 设计
由上文的设计过程可以看出, “ ECAS 控制器”软件共有 7 个模式,单片机上电后程序自动进入初始化模式 1 、随后无条件进入初始化模式 2 、初始化模式 3 、运行模式,并在 KL15 为 ON 时保持在运行模式。一旦检测到 KL15 由 ON 变为 OFF ,再依次进入预休眠模式、预下电模式和下电模式。这就意味着只有从运行模式到预休眠模式的切换需要程序手动进行,其它模式切换均在 BswM 模块内自动完成。
在 RTE 设计过程中,需要在某 SWC 中创建一个 uint16 类型的 PPort 并与 BswM 模块的 RP_BswMArbitration_BswM_MRP_SwcModeRequest 端口连接,之后在相应运行实体内完成 KL15 状态监测和切换到预休眠模式的代码, SWC 操作非本文的重点内容,这里不再详细描述,感兴趣的读者可参照《从手写代码到 AUTOSAR 工具链 _RTE 入门篇》。
5.12 BswM 模块设计总结
不知道大家赏完前文的设计步骤后,有没有 “很复杂、很混乱”的感觉,反正我在最初接触到这个模块时,内心是崩溃的。配置箱中行为、行为列表、端口、条件、逻辑表达式、规则 ...... 不但不知道是做什么用的,连搞懂它们的配置次序似乎都是件挺困难的事情。
现在我从手写代码老工程师的角度来阐述 BswM 模块:整个嵌入式程序中有若干个模式, BswM 模块的任务就是按照一定规则来实现这些模式间的切换,即实现与下文类似的伪代码段。
......
/* 程序处在某个运行模式 */
if((a==1) && (b==2))
{
执行代码段 A;
}
else
{
执行代码段 B;
}
......
BswM 的设计过程就是对代码段中元素进行配置的过程。
( 1 )请求端口: a 、 b 相当于 BswM 中的请求端口;
( 2 )模式条件: a==1 或 b==2 相当于 BswM 中的模式条件;
( 3 )逻辑表达式: (a==1) && (b==2) 相当于 BswM 中的逻辑表达式;
( 4 )规则:整个代码段相当于 BswM 中的规则;
( 5 )行为和行为列表:代码段 A 和代码段 B 相当于 BswM 中的 2 个行为列表;每个行为列表可由一个或多个行为组成。
这样讲解,是不是感觉明白多了?
6 下期预告
从去年 8 月至今,我连续承接了 2 个自动驾驶项目 VCU 基础软件的开发工作,在此过程中首次尝试了在 ISOLAR_AB 环境中“创建工程并逐一添加模块”的开发方式。在下期中,我想和大家探讨下如何“从无到有”的开发一个完整的 AUTOSAR 项目,与之前讲述的 RTE 、 EcuM 、 BswM 模块相结合,希望能达到“以点带面、以面促点、点面结合、全面发展”的学习效果。
—END—
添加下方信加入汽专业交流群
(仅限专业人士,添加备注单位+姓名)
-
2023年血糖新标准公布,不是3.9-6.1,快来看看你的血糖正常吗? 2023-02-07
-
2023年各省最新电价一览!8省中午执行谷段电价! 2023-01-03
-
GB 55009-2021《燃气工程项目规范》(含条文说明),2022年1月1日起实施 2021-11-07
-
PPT导出高分辨率图片的四种方法 2022-09-22
-
2023年最新!国家电网27家省级电力公司负责人大盘点 2023-03-14
-
全国消防救援总队主官及简历(2023.2) 2023-02-10
-
盘点 l 中国石油大庆油田现任领导班子 2023-02-28
-
我们的前辈!历届全国工程勘察设计大师完整名单! 2022-11-18
-
关于某送变电公司“4·22”人身死亡事故的快报 2022-04-26
