通信的开启和关闭一般需要BswM和网络管理以及ComM协同配合,前一篇博文讲了AUTOSAR架构的网络管理,这里着重介绍BswM对通信的控制。
关于BswM
BswM(Basic software Management)即基础软件管理模块,BswM的基本功能有两类:模式仲裁(Mode Arbitration)以及模式控制(Mode Control)。
- 模式仲裁主要执行模式切换,模式切换主要是由底层模块或者SWC请求相应模式导致的;
- 模式控制主要执行由于模式切换导致的一些动作或者动作队列
模式控制
模式控制部实际上是定义了一些BswM可以进行的Action,Action需要组合成为ActionList才能被模式仲裁使用,Action的类型有三种:
- 调用BSW其他模块或者RTE相应接口函数,支持的接口如下图
- 链接到其他的ActionList上,这使得ActionList可以嵌套;
- 模式仲裁规则(ArbitrationRule,下文会详细介绍)
模式仲裁
-
ModeRequestPorts,模式请求来源指的是模式仲裁过程中需要判断的数据源是什么,而这些数据源的获取都是已定义好的标准接口,你只需要进行相应配置就能完成针对其他Bsw模块数据获取,即BswM会提供并生成相应的函数接口来获取对应Bsw模块的数据输入,BswM模块支持的请求来源如下图:
模式请求的执行分为立即(Immeditate)和循环调度(Deffered)的。所谓立即的,代表模式请求过来后,将马上进行规则判断;而循环调度的,是通过BswM MainFunction来周期去循环判断结果的。 -
ModeCondition ,模式条件指的是根据模式请求来源与设定的常量相做对比(EQUALS/EQUALS_NOT)。举个例子:配置了一个名为BswM_MC_BswM_WakeUp的模式条件,其中模式请求来源为BswM_MRP_BswM_MDG,ECUM_STATE_WAKEUP为设定的常量,配置的ConditionType为EQUALS,那么这个模式条件实际上就是BswM_MRP_BswM_MDG==ECUM_STATE_POSTRUN的一个表达式;
-
Logical Expresstions,逻辑表达式可以使用很多种逻辑运算符:与,或,异或等等。而逻辑运算符的对象就是模式请求条件,举例:
配置了一个名为BswM_LE_PostRunToShutDown的逻辑表达式,他的模式条件为BswM_MC_BswM_PostRun和BswM_MC_WriteAllComplete,其中BswM_MC_BswM_PostRun配置为BswM_MRP_BswM_MDGECUM_STATE_POSTRUN,BswM_MC_WriteAllComplete配置为BswM_MRP_NvmWriteAllComplete != NVM_REQ_PENDING,逻辑运算符配置为与(AND),那么这个逻辑表达式实际上就代表了(BswM_MRP_BswM_MDGECUM_STATE_POSTRUN && BswM_MRP_NvmWriteAllComplete != NVM_REQ_PENDING);
-
ArbitrationRule,仲裁规则的构成要素包括LogicalExpressions、TrueActionList、FalseActionList和RuleInitState。LogicalExpressions用于条件判断,根据判断结果决定执行TrueActionList还是FalseActionList。举例:
这里配置了一个名为BswM_AR_PostRunToShutDown的仲裁规则,关联的逻辑表达式为BswM_LE_PostRunToShutDown,TrueActionList为BswM_AL_BswModules_ShutDown,也就是当BswM_LE_PostRunToShutDown判断为真时,执行BswM_AL_BswModules_ShutDown的动作。伪码就是
if((BswM_MRP_BswM_MDG==ECUM_STATE_POSTRUN)&&(BswM_MRP_NvmWriteAllComplete != NVM_REQ_PENDING))
{
do BswM_AL_BswModules_ShutDown;
}
BswM对通信的控制
BswM的模式控制支持的通信的接口有:
- ComMAllowCom
- ComMModeLimitation
- ComMModeSwitch
- BswMPduGroupSwitch
- BswMPduRouterControl
- BswMNMControl
BswM的模式仲裁支持的通信(只针对Can)相关的模式请求来源有:
- CanSMIndication
- ComMIndication
- ComMInitiateReset
- ComMPncRequest
- NmIfCarWakeUpIndication
通信(只针对CAN)控制实现
应用报文的打开需要满足:
- CommunicationAllowed为TRUE
- 通信模式切换到COMM_FULL_COMMUNICATION
- 相关的PduGroup打开
CommunicationAllow
一般配置在BswM,当运行状态从WAKEUP跳转到RUN的Rule的True ActionList中的一个Action)。配置如下:
Rule:
ActionList:
Action:
通信状态切换
通信状态在上电之后为COMM_NO_COMMUNICATION,跳转到COMM_FULL_COMMUNICATION有2个途径,分别是本地唤醒和远程唤醒,对于Mcu来说本地唤醒通常有KL15上电等,Mcu检测到本地唤醒之后可以直接调度ComM_RequestComMode来请求COMM_FULL_COMMUNICATION,也可以通过BswM来请求ComM进入COMM_FULL_COMMUNICATION;远程唤醒为Can报文唤醒,唤醒序列可以参考网络管理篇博文。进入COMM_FULL_COMMUNICATION之后诊断报文,XCP报文等可以开始通信,应用报文则还需要打开关联的PDU Group才能通信。
通信的下电也是一个协同的过程,需要本地唤醒和远程唤醒都释放网络之后网络才能进入到COMM_NO_COMMUNICATION,对应用报文来说,关闭只要满足[1]进入到COMM_NO_COMMUNICATION,[2]CommunicationAllowed为NOT Allowed,[3]相关的PDU Group处于Stop状态这三个条件中的任意一个就会停止通信。
PduGroup的打开/关闭
应用报文必须要分配到至少一个PDU Group里面,应用报文需要打开相关的PduGroup才能被发送接收,通常对不带PN网络管理的节点,简单的做法是,将某一路的Rx关联到一个PduGroup,Tx关联到一个Group,通过BswM控制,当BswM接收到的CanSM的modeIndication指示该Channel的状态不在CANSM_BSWM_NO_COMMUNICATION时打开,否则关闭;当BswM接收到的CanSM的modeIndication指示PropulsionCan的状态在CANSM_BSWM_FULL_COMMUNICATION时打开,否则关闭。
以Rx的group为例配置截图如下:
配置Action和ActionList
Action:打开
Action:关闭
ActionList:
- 配置MRP:
配置:ModeCondition
当CanSMIndication当前状态不在CANSM_BSWM_NO_COMMUNICATION下
配置Logical Expression:
配置Rule
Tx的Group的配置过程相同,把ModeCondiction配置成EQUAL CANSM_BSWM_FULL_COMMUNICATION即可。