Partial Networking(PN)功能相对来说,稍稍复杂一点。PN功能的实现也不能单单看某个模块,因为模块间的交互信息对网络状态的切换至关重要。对于PN功能,我主要想从CanNM和ComM两个模块谈,本篇先从CanNM聊。希望能将一些概念讲透,因为在实际项目中,工具的很多配置项我们可能一知半解,在问题排查时,多少让我们摸不着头脑。因此,我想把自己解读的Autosar信息传达出来,分享一下。
提示:基于CAN总线。
1
为什么要PN功能
为什么需要PN(Partial Network)功能呢?实质还是为了节能。没有PN功能时,一个网段内的所有ECU同醒同睡。有时,在一个网段内,可能只需要某些ECU正常工作即可,不相关的ECU没必要唤醒(费电)。所以,增加PN功能是节能的一个优选项。
举例:
不含PN功能的网段,所有ECU同睡同醒。某些工况下(A工况),其实只需要ECU2和ECU4保持工作状态即可,因为没有PN功能,所以该网段内的ECU1、ECU2、ECU3、ECU4、ECU5均保持唤醒,所以就费电了,如下所示:
含有PN功能的网段,同样A工况下,ECU2和ECU4保持正常工作状态,ECU1、ECU3、ECU5休眠,相对不含PN功能的网段,含PN功能的网段将更节能,如下所示:
2
NM PDUs的接收处理
在嵌入式中,任何信息的交互无非就是收和发。对于PN功能的实现也不例外,节点收到网络管理报文是PN功能讨论的基础。对于CanNM模块而言,它通过注册在CanIf中的回调函数CanNm_RxIndication()获取NM PDUs信息。拿到NM PDUs信息以后,CanNM模块开始拆解信息,通过对信息的拆解决定是否将信息进一步传递给其他模块,比如:COM、ComM、NM等。
在Autosar中,PN功能的开启需要多个模块配置PN参数选项,先说CanNM模块。在CanNM模块,首先需要配置CanNmPnEnabled参数,即CanNmPnEnabled = TRUE。
(1)如果参数CanNmPnEnabled = FALSE,CanNM收到NM PDUs直接进行后续动作,即通知NM模块等,此时PN功能忽略(无效)。只要收到有效范围的网络管理报文(一般会规定网络管理报文是一个范围,比如:0x500~0x57F),网络即可唤醒;
(2)参数CanNmPnEnabled = TRUE,也不能说PN功能开始生效。此时需要进一步判断参数CanNmAllNmMessagesKeepAwake和PNI(Partial Network Information Bit)信息。PNI在NM PDUs中所处的位置如下所示:
提示:Control Bit Vector简称CBV,和Source Node Identifier(SNI)一样,一般需要在配置工具中配置,即配置CBV和SNI在PDU中的位置。
如果PNI = 0(即没有PN请求),也就没有PN功能的进一步处理,此时如果CanNmAllNmMessagesKeepAwake = TRUE,那么接收的任何有效网络管理报文进一步处理,即可以唤醒该节点网络;如果CanNmAllNmMessagesKeepAwake = FALSE,则该NM PDUs也不用再进一步处理了,CanNM模块直接丢弃该PDU,即该节点的网络无法唤醒。
如果PNI = 1(即有PN请求),CanNM模块需要过滤User Data中的PNC(Partial Network Cluster )信息,换句话说:PN请求信息包含在User Data中。一般由PNC个数决定使用多少User Data空间,比如:需要设置9个PNC,而每个PNC占用一个bit,即需要9个bit,则使用2个User Data(2 Byte)空间即可。过滤前面聊过,可以参考Autosar网络管理:CanNM PN功能。如果过滤PNC信息,发现每个bit都与该ECU不相关,且CanNmAllNmMessagesKeepAwake = FALSE,那么CanNM直接丢掉该NM PDU,如果CanNmAllNmMessagesKeepAwake = TRUE,那么当前节点网络仍然需要被唤醒。
PNC信息可占用位置如下所示(User Data部分),如果SNI不用,则User Data可以拓展到7 Byte,将CBV配置为第一个字节,如下所示:
3
ERA/EIRA
开发PN功能的朋友,对ERA(External Request Array )/EIRA(External and Internal Request Array )想必并不陌生。但是能说清楚这两个参数怎么用吗?老实说,我理解得可能不是很到位,此段抛砖引玉。
对于ERA/EIRA,可以理解为PN请求的状态集,而这个状态集的信息分别存储在各自的Buffer中,简单说:可以独立配置。
ERA:可以理解为外部PN请求,比如:接收到其他ECU发送来的网络管理报文,PNI置位,PNC有效。
EIRA:可以理解为外部PN请求和内部PN请求,外部PN请求和ERA一样,内部PN请求可以理解为不同channel转发过来的PN请求,比如:某个ECU包含两个CAN节点(CAN1和CAN2),且都可以作为网关节点(实际还需要关注网关类型)。CAN1收到网络管理报文,对应的PNC关联CAN2,CAN1可以内部转发给CAN2,唤醒CAN2网络,这就是内部PN请求。
内部请求实际是通过signal走COM传递给ComM,这里简单提一下,后面我们在讨论ComM和PN的关系。可以把ERA和EIRA看作信号,通过COM层标准收发接口进行信息交互。既然依赖COM,那么CanNM此时可以看作底层模块,通过PduR_CanNmRxIndication()接口通知到PDUR,PDUR再路由给COM模块,之后ComM通过COM层信号接口获取PN请求的状态信息。
PduR_CanNmRxIndication()属于配置接口,Autosar中描述如下所示:
ComM与PN管理的关系
对于每一个PNC(partial network cluster)的通信状态,ComM模块都有独立的一套状态机进行管理。当CanNM从CanIf层拿到NM PDU以后,会将User Data部分数据独立拆解出来,通过PDUR、COM,以信号的形式最终送给ComM模块。为什么将User Data部分独立拆解出来?因为User Data部分包含着PNC信息,该信息取决于项目需求:需要多少PNC,就开辟多少User Data空间。也就是说,ComM获取的PNC信息与NM PDU中User Data 一一对应。
使能或是关闭PNC,最终的表现就是允许PNC关联的Node(或者说Channel)通信与否。我们知道应用报文(Com层对应的Pdu)的发送/关闭由BswM管控,如果ECU收到的PNC关联其对应的某个Channel,ComM模块就会进行通信请求(进行状态切换),BswM获取请求信息后,使能或者禁止Com层对应的I-PDU groups通信。
1
ComM对PNC管理
前面我们说PN功能开启需要在CanNM模块打开CanNmPnEnabled参数,而在ComM模块还需要将配置参数ComMPncSupport打开。在Autosar中,规定CanNmPnEnabled和ComMPncSupport需要存储在NVM中,以便诊断服务使用,但是在实际的项目开发中,是否这样实现还是需要看具体项目需求。
ComM管理每一个PNC状态的切换,当状态切换时,均需要通过接口BswM_ComM_CurrentPncMode()通知到BswM,以便BswM对Com层的I-PDU groups进行通信的管控。
ComM在管控每个PNC状态机之前,首先要获取对应Channel的PNC信息,PNC信息通过Com层标准信号接口获取ERA signal或者EIRA signal。如果signal是多字节的,一般会在Com层配置成uint8_n类型。
Autosar里规定PNC对应的信号,最大可以包含56个PNC状态位信息,这最大56是如何来的呢?对于一个经典CAN帧,一个PDU中最多携带8 byte有效数据,在CanNM模块中,CBV字节是必须的,而NodeID是可选则,这样在CanNM层级最多可以有7 byte的User Data,因此ComM最多可以管控7*8 = 56个PNC。
虽然NodeID在CanNM是可选的,但还是要识别和过滤NM PDU,当NodeID在CanNM可选时,可以依赖xxIf层或者驱动层对NM PDU过滤和识别,驱动层负责将有效ID范围的NM PDU送给xxIf层,xxIf层通过识别ID,负责将该PDU发送给对应的上层,比如:xx_TP层,xx_NM层等。
一直在说ComM通过信号获取对应的PNC信息,这里我们再具体说一下,对ComM来说,获取的是 EIRA 或者 ERA信号,这两个信号独立。可以使用其中一个,也可以均使用,ComM通过Com_ReceiveSignal()接口获取。
ComM既然会接收信号,当然也会将PNC状态信息通过信号发送给对应的通信总线。
ComM模块可以处理EIRA 或者ERA信号的接收,但是发送只能处理EIRA信号。
2
ComM PNC状态机
对于每个Partial Network,会对应一个PNC状态机,因为PNC最多可以有56个,因此ComM最多可以管理56个PNC状态机。注意:PNC和ComM层的Channel不是一个概念,ComM的Channel对应具体的物理总线数。
在ComM模块中,一个Channel可以对应一个PNC,也可以对应多个PNC。
ComM管理的PNC状态机包括两大Mode:PNC_FULL_COMMUNICATION、PNC_NO_COMMUNICATION。PNC_FULL_COMMUNICATION模式又包含三个子状态:PNC_PREPARE_SLEEP、PNC_READY_SLEEP、PNC_REQUESTED。
对上图状态行为进行解读:
系统上电时,PNC默认状态即PNC_NO_COMMUNICATION。如果某个PNC进入PNC_NO_COMMUNICATION状态后,没有收到内部或者外部请求,则状态不跳转。
(1)EcuM或者NM模块调用ComM_EcuM_WakeUpIndication()接口,且配置参数ComMSynchronousWakeUp = TRUE,PNC的状态由PNC_NO_COMMUNICATION切换到PNC_FULL_COMMUNICATION::PNC_PREPARE_SLEEP状态。且该PNC对应的ComMPncPrepareSleepTimer(ComMPncPrepareSleepTimer > 0)启动,同时通知到BswM,PNC状态切换。
(2)EcuM模块调用ComM_EcuM_WakeUpIndication()接口,且配置参数ComM_PncWakeUpEnabled = TRUE ,PNC的状态由PNC_NO_COMMUNICATION切换到PNC_FULL_COMMUNICATION::PNC_PREPARE_SLEEP状态。且该PNC对应的ComMPncPrepareSleepTimer启动(ComMPncPrepareSleepTimer > 0),同时通知到BswM,PNC状态切换。
(3)如果PNC请求信号收到(至少一个bit在EIRA 中置位),PNC的状态由PNC_NO_COMMUNICATION切换到PNC_FULL_COMMUNICATION::PNC_READY_SLEEP 状态。
(4)如果ComMUser调用ComM_RequestComMode()接口请求 FULL_COMMUNICATION,PNC的状态由PNC_NO_COMMUNICATION切换到PNC_FULL_COMMUNICATION::PNC_REQUESTED 状态。
(5)如果PNC请求信号收到(至少一个bit在ERA 中置位),AND ComMPncGatewayEnabled = TRUE,AND ComMPncGatewayType != NONE。PNC的状态由PNC_NO_COMMUNICATION切换到PNC_FULL_COMMUNICATION::PNC_REQUESTED 状态。
该状态下,所有与此PNC关联的通道均进入Full Communication状态。
进入PNC_REQUESTED子状态工况:
ComMUser对此PNC请求COMM_FULL_COMMUNICATION;
ERA信号中的PNC置位,且此PN是同步的。
进入PNC_PREPARE_SLEEP子状态工况:
接收的EIRA信号PNC未置位;
EcuM通知ComM,Passive唤醒事件发生,且是同步唤醒,且ComMPncPrepareSleepTimer > 0。
进入PNC_READY_SLEEP子状态工况:
此PN的所有ComMUser请求COMM_NO_COMMUNICATION, AND 接收到的EIRA信号PNC置位 ,AND 所有的ERA信号PN未置位,且此PN是同步的。
3
PNC Gateway
使能PNC的网关功能,需要在ComM中配置参数ComMPncGatewayEnabled = TRUE。默认的网关类型是:COMM_GATEWAY_TYPE_ACTIVE。
PNC的网关类型分为:Active PNC Gateway和Passive PNC Gateway 两种。
ComM通过ERA或者EIRA与其他ECU交互PNC信息。对于ERA,仅当PNC网关功能开启,分配给多个ComM通道时可用。每个PNC在位向量中使用相同的位位置,由 PNC ID 定义。比如:定义PNC1、PNC2,这两个PNC均长度均为2 byte,其中bit0均表示关联某个ECU的指定Channel与否。
ComM负责协调网络的网关行为,即将PNC激活请求从一个通道路由到其他通道。通过发送 EIRA TX 信号完成路由。通道的路由取决于该通道的网关类型。
如果在网关类型为PASSIVE的通道上接收到ERA=1的请求,则该请求不会镜像回该通道,即该请求不会在EIRA Tx 信号中设置,并且不会路由到网关类型为PASSIVE的通道。请求仅路由到网关类型为ACTIVE 的通道。
如果在网关类型为 ACTIVE 的通道上通过 ERA=1接收到PN请求,则该请求会镜像回此通道,且路由到所有其他协调通道。
如果在网关类型为NONE的通道上通过ERA=1接收到请求,则该请求不会存储在内部ComM ERA信号中,即该PNC请求被忽略。因此,请求不会镜像回此通道,也不会路由到任何其他通道,即请求不会设置在EIRA发射信号中。
网关类型为NONE的通道忽略通过ERA信号接收的PNC请求,但它们处理通过 EIRA Rx 信号接收的PNC请求。在这种情况下,目标PNC状态不受通过 ERA 接收的PNC请求影响,但通过EIRA=1 接收的 PNC 请求而进行状态改变。