网络管理机制
AUTOSAR网络管理机制其实十分简单,概括下来三句话:
需要通信就发网络报文,否则就停发网络报文,所有节点同睡同醒。
下图是网络管理的状态机:
网络管理包括三个模式:Network Mode、Prepare Bus-Sleep Mode和Bus-Sleep Mode。
- Network Mode
Network Mode是节点正常工作所处的模式,该模式包括三个子状态:Repeat Message State、Normal Operation State和Ready Sleep State。
- Repeat Message State
在Repeat Message状态下,节点会周期性发送NM报文,该状态的持续时长是可以配置的。Repeat Message State的进入路径有:
-
1、在Bus-Sleep Mode或Prepare Bus-Sleep Mode下收到CanNm_NetworkRequest()本地唤醒请求;
-
2、在Bus-Sleep Mode或Prepare Bus-Sleep Mode下收到CanNm_PassiveStartUp()被动唤醒请求;
-
3、在Prepare Bus-Sleep Mode下收到NM报文;
-
4、在Normal Operation State或Ready Sleep State下本地请求node detection或收到其它节点的node detection请求。
Repeat Message State的离开路径有:
-
1、有本地唤醒请求时进入Normal Operation State;
-
2、 否则进入Ready Sleep State。
Repeat Message State在整个状态机中处于交叉路口的位置,和其它几个状态间均有联系。
- Normal Operation State
节点本地有通信需求时会一直处于Normal Operation状态,在该状态下会周期性的发送NM报文,Normal Operation State的进入路径有:
- 1、Repeat Message State结束时仍有本地请求;
- 2、Ready Sleep State下有通信需求(Network requested)。
Normal Operation State的离开路径有:
- 1、不再有本地通信需求(Network released)时跳转到Ready Sleep State;
- 2、本地请求node detection或收到其它节点的node detection请求时跳转到Repeat + Message State。
- Ready Sleep State
在Ready Sleep状态下节点不再发送NM报文,此时如果其它节点一直发送NM报文的话,节点便会保持在Ready Sleep State。Ready Sleep State的进入路径有:
- 1、Normal Operation State下不再有本地通信需求;
- 2、Repeat Message State结束时没有本地通信需求。
Ready Sleep State的离开路径有:
- 1、不再收到其它节点的NM报文时,等待NM Timeout Timer超时后跳转到Prepare Bus-Sleep Mode;
- 2、本地又有通信需求时跳转到Normal Operation State;
- 3、本地请求node detection或收到其它节点的node detection请求时跳转到Repeat Message State。
- Prepare Bus-Sleep Mode
在Prepare Bus-Sleep模式下,会停发应用报文,但那些已经装填到底层寄存器/buffer等待发送的报文仍然会继续发完,因此,在该模式总线活动最终会恢复平静。
Prepare Bus-Sleep Mode的进入路径有:
-
1、Ready Sleep State下不再收到NM报文,NM Timeout Timer超时。
Prepare Bus-Sleep Mode的离开路径有: -
1、Wait Bus Sleep Timer超时,进入Bus-Sleep Mode;
-
2、接收到NM报文,跳转到Repeat Message State;
-
3、有本地唤醒请求,跳转到Repeat Message State;
-
4、有被动唤醒请求,跳转到Repeat Message State。
- Bus-Sleep Mode
当所有节点都不再发送NM报文,并且也没有节点有唤醒请求,最终这些节点会进入Bus-Sleep模式。Bus-Sleep Mode的进入路径有一个:
- 1、在Prepare Bus-Sleep Mode下发生Wait Bus Sleep Timer超时。
Bus-Sleep Mode的离开路径有:
- 1、有本地唤醒请求,跳转到Repeat Message State;
- 2、有被动唤醒请求,跳转到Repeat Message State。
- 网络报文格式
默认的网络报文格式定义如下:
需要注意的是规范并未限制Source Node Identifier和Control Bit Vector的位置,你可以变更两者的字节位置,如果要修改的话,记得所有节点需要同步修改,以保证相互间能够正常通信。
字节1放的是Control Bit Vector(CBV),具体每个Bit的定义如下:
Bit0:Repeat Message Request
该位用于”Node Detection“功能,何谓Node Detection,顾名思义就是检测有哪些节点正在参与总线活动。假设总线上有三个节点,经过一段时间后A、B仍然有通信请求,网络状态保持在Normal Opertion State,C由于不再需要通信,但是A、B又一直发送NM报文,因此处于Ready Sleep State。
如果此时A想要知道总线上有哪些节点活动,单纯看NM报文的话,只能知道有B,怎么办呢,这时就可以利用节点检测功能,首先,A自己切换到Repeat Message状态,并将CBV的Bit0设置为1,节点B和C收到NM报文后,由于Repeat Message Request位为1,各自会切换到Repeat Message状态开始发送NM报文,A节点收到NM报文后,便知道总线上还有B、C节点在。
Bit3:NM Coordinator Sleep Ready Bit
该位用于”Coordinator Synchronization Support“功能,可以实现不同总线间的协同关闭,具体的协同机制由AUTOSAR Network Management Interface模块实现,可以参考相关文档。
Bit4:Active Wake-up Bit
该位用于标识是否本地唤醒,如果节点是通过CanNm_NetworkRequest()唤醒的网络,那么Active Wake-up位为1。
Bit6:Partial Network Information Bit
该位用来指明是否使用Partial Network功能,如果为1的话,User data部分需要包括PNI信息。什么是Partial Network呢,举个例子:总线上有A、B、C、D、E五个节点,有一项功能需要A、C、D协同完成,B、E不需参与,就可以将A、C、D划分为一个Partial Network,同理也可以将B、D、E划分为一个Partial Network。
我们将A、C、D的Partial Network编号为1,B、D、E的编号为2,网络报文中需要增加相关字段用来放PN信息,比如,使用Byte2的最低两个Bit分别表示PN1、PN2:
每个节点会设置PN掩码,对A来说,PN掩码为0x01(因为它只参与PN1),当收到C或D的网络报文时,由于Byte2的Bit0是1,与自己的掩码运算结果是1(非0),说明自己需要参与此PN;如果是收到B或E发来的网络报文,Byte2的Bit1是1,Bit0是0,掩码运算结果是0,就不会参与。对D来讲由于要参与两个PN,因此掩码需要设置为0x03。有了这套滤波机制,就可以实现A、C、D通信的时候B、E通信关闭,从而降低ECU功耗。
关于PNI有两种处理方式,一种叫做EIRA(External Internal Requests Aggregated),这种方式会汇集外部接收到的PN和内部自主请求的PN信息,得到一个总的输出结果;另一种叫做ERA(External Requests Aggregated),这种方式会汇集外部接收到的PN信息,并且不同网络单独处理。
- 网络发送行为
网络进入Repeat Message State时开始发送NM报文,标准的发送行为如下所示:
经过一个偏移时间Msg Cycle Offset后发送首条NM报文,后续报文的周期间隔为Msg Cycle Time。
如果使用了Immediate Restart Enabled功能,那么在Prepare Bus-Sleep Mode下发生主动唤醒跳转到Repeat Message State时会立刻发送NM报文:
与标准的发送行为相比,更多的还是使用Immediate Nm Transmissions发送方式,该方式有两个关键参数:次数和周期。
进入Repeat Message状态后会先以特定周期(Immediate Nm Cycle Time)发送特定次数(n)的NM报文,然后恢复至正常周期(Msg Cycle Time)继续发送NM报文。
- 降低总线负载
从上面可以看到,节点的NM报文都是固定周期发送的,总线上节点数量越多,负载率也就越高,为此可以使用如下两条策略:
-
1、节点在收到NM报文后,设置Msg Cycle Timer = CanNmMsgReducedTime,CanNmMsgReducedTime > 1/2CanNmMsgCycleTime且CanNmMsgReducedTime < CanNmMsgCycleTime;
-
2、节点在发送NM报文后,设置Msg Cycle Timer = CanNmMsgCycleTime。
需要说明的是这个策略只适用于Normal Operation State。
看个例子,A、B、C三个节点的CanNmMsgCycleTime均为70ms,节点A的CanNmMsgReducedTime=40ms,节点B的CanNmMsgReducedTime=50ms,节点C的CanNmMsgReducedTime=60ms。假设某个时刻A发了NM报文,对A自身来讲按照规则2需将MsgCycleTimer设置为70ms,对B、C来讲,作为接收方按照规则1需将MsgCycleTimer分别设置为50ms和60ms,那么显然,由于B的定时最短,过了50ms后B会发NM报文,B再把自身的MsgCycleTimer设置为70ms,A、C作为接收方分别把自己的MsgCycleTimer设置为40ms和60ms,下次就会轮到定时最短的A发送…
依此类推,最终结果就是总线上只有CanNmMsgReducedTime最小的两个节点在轮流发NM报文,一旦有节点满足休眠不再发网络报文,剩下节点中CanNmMsgReducedTime最小的两个节点会继续轮流发送。当最后只有一个节点时,便会按照正常的CanNmMsgCycleTime来发送。
通过这种策略机制保证了无论总线上有多少个节点,在CanNmMsgCycleTime时间内最多只会有两条NM报文。