
AUTOSAR网络通信问题分析
前言
前面已经系统介绍过ComM, CanSM, CanNM, Com模块,最近在工程实践网络通信相关的需求时发现对网络通信的很多点还是比较模糊,具体有以下问题:
(1)什么时候开始发送和停止发送网络管理报文?
(2)什么时候开始发送和停止发送应用报文?
(3)诊断请求如何影响通信网络?
(4)网络释放如何影响系统休眠?
本文就来回答这些问题。
参考文章;
正文
在回答以上问题前,我们先复习下和报文收发相关的ComM, CanNM, CanSM, Com模块,这里不再详细介绍模块的内容,只介绍和报文收发直接相关的函数接口(模块自己调用及需要User外部调用的接口)。
Note: 文本以CAN协议栈来讲解。
1.Com模块
Com模块负责应用报文的收发,只要Com_MainfunctionRx和Com_MainfunctionTx所在的Task被Os调度了,Com模块就开始尝试周期的收发应用报文,但是Com模块在收发报文的时候会判断报文所在的PduGroup有没有被Enable,如果报文所在的PduGroup是被Disable的那么应用报文在Com层就已经发送不出去且也不会更新接收报文了。而PduGroup默认是Disable的,PduGroup的Enable和Disable需要用户(User)来调用,一般配置BswM的模式仲裁和模式控制来实现。
模式仲裁的MC模式控制条件一般有:
1)网络管理所在ComM通道进入FullCom模式 &&
2)系统状态EcuState进入到Run状态 &&
3)系统电源电压正常(看OEM的需求,一般高低电压都会关闭报文) &&
4)诊断的0x28服务没有关闭应用报文
User通过Com_IpduGroupControl接口来控制PduGroup的Enable和Disable。
void Com_IpduGroupControl(
Com_IpduGroupVector ipduGroupVector,
boolean initialize
)
[SWS_Com_00792] At invocation of the function Com_IpduGroupControl, the
AUTOSAR COM module shall start/stop every ComIPduaccording to the passed states of the ComIpduGroups in the parameter ipduGroupVector.(SRS_Com_00218)
2.ComM模块
上图是非PN模式下ComM一个Channel的状态机图,系统启动后ComM的State默认在COMM_NO_COMMUNICATION模式的COMM_NO_CONO_PENDING_REQUEST子状态。接下来我们介绍最重要的状态迁移条件和状态迁移是执行的动作。
1)状态迁移条件
a)ComM_RequestComMode()接口由User在ComM模块外部调用,可以通过SWC和配置SWC。
Note: 用户调用了ComM_RequestComMode(FullCom)后ComM的状态机也不一定切换到FullCom,调用了ComM_RequestComMode(NoCom)后ComM的状态机也不一定切换到NoCom。
b)ComM_EcuM_WakeUpIndication由EcuM模块调用。ECU上电或唤醒后,如果检测到为远程唤醒或其他添加需要ECU进行passive唤醒时,调用 ComM_EcuM_WakeUpIndication()(如果ECUM中的wakeup source绑定了ComM通道,则在调用EcuM_CheckWakeup()时自动调用)。
c)ComM_NM_RestartIndication和ComM_Nm_NetworkStartIndication由CanNM调用。
d)ComM_DCM_ActiveDiagnostic和ComM_DCM_InactiveDiagnostic由DCM模块进入诊断Session和退出诊断Session时调用。
e) ComM_CommunicationAllowed()一般由用户通过BswM的模式控制来调用。一般在ECU系统从Startup切换到Run状态的时候设置ComM_CommunicationAllowed(ChannelID,TRUE),PostRun切换到PreShutdown的时候设置ComM_CommunicationAllowed(ChannelID,FALSE)。
f)Com_NM_BusSleepMode(由CanNM模块调用。CanNM状态机从Prepare Bus-Sleep Mode切换到Bus-Sleep Mode的时候状态。
Note: 能进入Prepare Bus-Sleep Mode的时候,CAN总线上一定收不到滤波范围的NM报文了。
2)状态迁移动作
进入COMM_NO_COMMUNICATION状态时:
A)ComM模块调用CanSM_RequestComMode(network:=<channel state machine’s network>, mode:= COMM_NO_COMMUNICATION)关闭Can控制器(CanDriver)的收发报文能力。
B)ComM模块调用Nm_NetworkRelease()请求释放网络(当前CAN网络应该是网路管理CAN,ComMNmVariant=FULL)。
进入COMM_FULL_COMMUNICATION状态时:
A)ComM模块调用CanSM_RequestComMode(network:=<channel state machine’s network>, mode:= COMM_FULL_COMMUNICATION)开启Can控制器(CanDriver)的收发报文能力。
B)如果由用户调用了ComM_RequestComMode()请求FullCom,则ComM模块调用Nm_NetworkRequest()请求主动开启网络(当前CAN网络应该是网路管理CAN,ComMNmVariant=FULL);如果EcuM调用了ComM_EcuM_WakeUpIndication或者CanNM模块调用了ComM_Nm_RestartIndication或者CanNM模块调用了 ComM_Nm_NetworkStartIndication,则ComM模块调用Nm_PassiveStartup请求被动唤醒网络。
Note: CanSM_RequestComMode的调用最终会影响报文是否最终在CAN物理总线上收发;Nm_NetworkRelease()和Nm_NetworkRequest()和Nm_PassiveStartup的调用会影响CanNM状态机的跳转,也就影响Can NM报文的发送和接收。
3.CanNM模块
状态迁移条件:
1)CanNm_NetworkRequest(),由ComM模块调用,具体参考ComM模块章节。
2)CanNm_NetworkRelease(),由ComM模块调用,具体参考ComM模块章节。
3)CanNm_PassiveStartup(),由ComM模块调用,具体参考ComM模块章节。
4)CanNm_RxIndication(),由PduR模块调用。
状态迁移执行动作:
1)ComM_Nm_RestartIndication() ,协同网络管理时使用,较少使用。
2)ComM_Nm_NetworkStartIndication(),通知在总线睡眠模式(Bus-Sleep Mode)下接收到nm消息,这表明网络中的某些节点已经进入了网络模式。
3)ComM_Nm_PrepareBusSleepMode(),CanNM模块调用,通知ComM模块CanNM模块进入到Prepare Bus-Sleep Mode。
4) ComM_Nm_NetworkMode(),CanNM模块调用,通知ComM模块CanNM模块进入到NetWork Mode。
5)ComM_Nm_BusSleepMode(),CanNM模块调用,通知ComM模块CanNM模块进入到Bus Sleep Mode。
Note: CanNm只会通知ComM模块顶层状态机模式之间的切换,Network Mode下的子State之间的切换不会通知到ComM模块。
网络管理报文的周期发送:
网络管理报文只在Network Mode下的Repeat Message State和Normal Operation State周期发送网络管理报文。
4.CanSM模块
ComM调用CanSM_RequestComMode后,CanSM会切换到CAM_BSM_S_PRE_FULLCOM状态,随后,最后进入CAM_BSM_S_PRE_FULLCOM状态的S_CC_STARTED子状态,会调用CanIf_SetControllerMode开启CanController(也就是CanDriver)。
5.问题回答
问题1:什么时候开始发送和停止发送网络管理报文?
答:网络管理报文只在Network Mode下的Repeat Message State和Normal Operation State周期发送网络管理报文。影响NM报文发送的条件是ComM模块何时调用NM_NetworkRequest,NM_NetworkRelease,Nm_PassiveStartup以及是否收到总线上其他网络管理的重复报文Repeat Message Bit请求。
问题2:什么时候开始发送和停止发送应用报文?
答:发送报文所在PduGroup是Enable的且对应CAN controller是Started且Can Transceiver是Normal状态,应用报文就会成功发送。而CAN controller和Can Transceiver的状态是由ComM调用CanSM的接口开请求控制的。也就可以换个说法,发送报文所在PduGroup是Enable的且Pdu所在的ComM Channel是在Funll Com状态时,应用报文就会成功发送。
问题3:诊断请求如何影响通信网络?
答:ComM Channel State在FULL Com时如果本地唤醒源都Disable了且User调用了ComM_RequestMode(NoCom),但是诊断通信Session还在维持的话,ComM Channel State还是会维持在Full Com状态。
问题4:网络释放如何影响系统休眠?
答:网络释放!=系统休眠,网络唤醒!=ECU唤醒。网络释放是系统休眠的一个必要条件,但是网路释放是系统不一定进入休眠。
参考文献:
[1]Specification of CAN Network ManagementAUTOSAR CP Release 4.3.1
[2]Specification of NetworkManagement Interface AUTOSAR CP Release 4.3.1
[3] Specification of Communication Manager AUTOSAR Release 4.2.2
[4] Specification of Basic Software Mode Manager AUTOSAR Release 4.2.2
文章转载自公众号:汽车电子嵌入式
