AUTOSAR网络管理节点内部有两个状态,一个是Requested - 被请求状态,另一个是Released - 被释放状态,当节点的应用层需要使用总线进行通讯的时候,会调用接口使得节点进入请求状态,当应用层没有通信需求的时候,调用接口使得节点进入释放状态。
需要注意的是,即使节点当前处于释放状态,节点的通讯依然有可能是处于开启状态,因为网络上的其它节点有可能正在请求总线。所以这个状态代表的是节点应用层是否有通信需求,并不代表总线开启或关闭。有通讯需求的时候处于请求状态,无通讯需求的时候处于释放,但总线是否在通讯不仅仅取决于当前节点自己,而是取决于网络上的所有节点。
节点上电初始化后默认进入释放状态。
处于网络模式中的节点,网络通信是处于开启或工作模式(包含了开始工作时和结束工作时的准备阶段)。网络模式又细分为以下三个阶段:
当节点从其他模式进入Network Mode时,默认进入Repeat Message State,该阶段是网络正式开始工作前的准备阶段,用来等待网络中所有相关节点进行网络准备,开启通信。
节点由Repeat Message State进入Normal Operation State,该状态为节点通信正常工作状态。
节点工作完成后,由Normal Operation State状态进入Ready Sleep State,准备进入睡眠状态。该阶段用来等待网络中所有节点工作完成,之后统一进入睡眠状态。
节点从网络模式的准备睡眠阶段进入预睡眠模式,该模式与Ready Sleep State的作用类似,但它已经不再属于网络模式了,是正式进入睡眠阶段前更进一步的准备阶段。
睡眠模式就是节点停止工作的模式,可以节省能量消耗,是整个网络管理的最终目的。网络管理工作就是管理各个节点如何有序进入睡眠模式和恢复工作状态。节点上电或复位后应默认进入睡眠模式。
在AUTOSAR中,网络管理报文以NM PDU的形式存在,典型的结构如下图所示:
其中有用的两个字节就是Byte0-Source Node Identifier(节点源地址)和Byte1-Control Bit Vector(控制字节)。这两个字节在NM PDU中的位置是可以配置的。
节点源地址是节点的标识符,网络中所有节点的源地址是唯一的,通常位于0x400-0x4FF范围内。
Control Bit Vector的定义如下,在节点初始化的时候被置为0x00:
我们对着标准中的这幅状态转换图,来详细说一下各个状态之间是如何转换的,以及节点处于每个状态时要做哪些工作。
节点上电或复位后,经初始化函数CanNm_Init()默认进入总线睡眠状态,在总线睡眠状态下应停发所有应用报文和网络管理报文,但要可以接收网络管理报文,以使得其它节点能够唤醒当前节点。
当节点收到了网络管理报文时,不是直接进入网络模式,而是上报应用层,应用层判断当前状态,允许的话会调用CanNm_PassiveStartup()函数,使节点进入网络模式。当节点自身想要进行网络通讯时,调用CanNm_NetworkRequest()使节点进入网络模式。前者是被动,后者是主动。后者发送的网络管理报文中CBV的Active Wakeup Bit位为1.
节点在网络模式中要一直发送应用报文。
节点进入网络模式后,默认进入重复报文阶段,启动定时器NM-Timeout,NM-Timeout用来记录网络管理报文是否超时,其超时时间为CanNmTimeoutTime,每收到或成功发送一帧网络管理报文,都应重启NM-Timeout。节点要开始周期发送网络管理报文。常规情况下,节点要先等待一个时间偏移量(CanNmMsgCycleOffset)后再发送第一帧网络管理报文,发送周期为CanNmMsgCycleTime,发送次数为CanNmRepeatMessageTime。
网络中所有节点的报文发送周期CanNmMsgCycleTime和CanNmTimeoutTime都是相同的,且CanNmTimeoutTime必须大于CanNmMsgCycleTime;所有节点的CanNmMsgCycleOffset都是不同的,以防止网络中所有节点同时发送网络管理报文造成网络拥塞。
当节点在重复报文阶段发送了CanNmRepeatMessageTime次网络管理报文后,需要退出重复报文阶段,退出时判断网络当前处于释放状态还是请求状态,如果处于请求状态,则进入常规运行阶段,如果处于释放状态,则进入准备睡眠阶段。
在常规运行阶段中,节点要周期发送网络管理报文,发送周期为CanNmMsgCycleTime。节点网络此时处于正常工作状态。
在常规运行阶段中,定时器NM-Timeout如果超时了要被重启。
当节点处于常规运行阶段时,如果收到了Repeat Message Request置为1的网络管理报文,则会强制重新进入重复报文阶段。进入重复报文阶段后的逻辑同上。
当节点不再需要进行网络通讯时,应用层会调用**CanNm_NetworkRelease()**函数,释放网络,节点进入准备睡眠阶段,停发网络管理报文,但要保持应用报文的发送。
节点处于准备睡眠阶段时,如果应用层重新需要使用网络,可以调用CanNm_NetworkRequest()函数使节点重新回到常规运行阶段。
当节点处于准备睡眠阶段时,如果收到了Repeat Message Request置为1的网络管理报文,也会强制重新进入重复报文阶段。进入重复报文阶段后的逻辑同上。
如上文所述,当重复报文阶段退出时如果节点网络处于释放状态,则节点直接进入准备睡眠阶段。
当节点在准备睡眠阶段NM-Timeout超时,即网络中所有节点都已进入准备睡眠阶段(或不处于网络模式),网络中没有网络管理报文,节点将会进入预睡眠模式,同时启动定时器Wait Bus-Sleep Timer,其超时时间为CanNmWaitBusSleepTime,所有节点的CanNmWaitBusSleepTime都应配置为相同的,以保证所有节点同时进入睡眠模式。
节点在预睡眠模式中同样不发送网络管理报文,同时还要停止应用报文的发送。
步骤⑩和⑫我理解是一回事,就是当节点处于预睡眠模式的时候,应用层想要使用网络进行通讯,或收到了其他节点的网络管理报文,就会重新进入网络模式,也是默认进入重复报文阶段。
当节点在预睡眠模式中定时器Wait Bus-Sleep Timer超时后,就会进入睡眠模式,睡眠模式中网络管理报文和应用报文同样都不发送,节点正式进入休眠状态,应尽可能地关闭功能,降低能量消耗。
我们前文说过,当节点进入重复报文阶段时,会重复发送几次网络管理报文。常规情况下,因为网络管理报文通常周期比较长,且第一帧报文还有偏移量,所以激活网络的实时性不是很好,标准中为解决这个问题制定了一个能够立即发送网络管理报文的策略。
当CanNmImmediateNmTransmissions > 0时,要启动网络管理报文立即发送模式,此时CanNmMsgCycleOffset不再起作用,节点尽可能快地发送第一帧网络管理报文,发送周期不再为CanNmMsgCycleTime,而是用更短的CanNmImmediateNmCycleTime,共发送CanNmImmediateNmTransmissions次,然后进入常规运行阶段,之后网络管理报文的发送周期恢复CanNmMsgCycleTime。
注意:网络管理报文立即发送模式只有当节点主动唤醒网络的时候才启用,被动唤醒时不启用。是当前节点用来快速唤醒网络中其它节点的一个策略。
由上文可知,当节点处于重复报文阶段和常规运行阶段的时候,都会周期性发送网络管理报文,这对总线负载是一种消耗,且网络中节点越多,总线负载占用越大。标准中制定了一种策略来降低总线负载。
通常情况下,在常规运行阶段,所有节点都要发送网络管理报文,节点中有一个定时器CanNm Message Cycle Timer,每发送一帧网络管理报文,该定时器就重新装载CanNmMsgCycleTime的值,即网络管理报文的发送周期为CanNmMsgCycleTime。但其实只要有一个节点在发送报文,网络中所有节点就都可以保持在网络模式,多发的网络管理报文是对总线负载的浪费。
总线负载降低策略具体为:
当配置参数与CanNmBusLoadReductionEnabled为有效,且节点处于常规运行阶段时,进入总线负载降低模式,此时:
这种策略的结果是:网络中只有CanNmMsgReducedTime 值最小的两个节点交替发送网络管理报文。
我们假设节点A的CanNmMsgReducedTime 最小,B次之,在某一时刻,网络上所有节点都进入了总线负载降低模式,此时某个节点发送了一帧网络管理报文,之后该节点因为是发送节点,所以定时器CanNm Message Cycle Timer重置为CanNmMsgCycleTime ,其余节点是接收节点,CanNm Message Cycle Timer重置为各自的CanNmMsgReducedTime,节点A的CanNmMsgReducedTime值最小,所以一段时间后率先发了一条网络管理报文,之后将CanNm Message Cycle Timer重置为CanNmMsgCycleTime,其余节点CanNm Message Cycle Timer再次重置为各自的CanNmMsgReducedTime,此时网络中节点B变成了CanNm Message Cycle Timer值最小的节点,一段时间后会发出一条网络管理报文,这又会使得节点A的CanNm Message Cycle Timer值变成最小,所以实现了网络中CanNmMsgReducedTime 值最小的两个节点交替发送网络管理报文,其余节点不发送网络管理报文。
当最小的两个节点中某个节点进入准备睡眠阶段,不再发送网络管理报文了,那么CanNmMsgReducedTime 值略大的下一个节点会开始发送网络管理报文。
当网络中只有一个节点处于常规运行阶段时,网络管理报文的周期为CanNmMsgCycleTime。
当配置参数CanNmRemoteSleepIndEnabled为有效的时候,如果节点在CanNmRemoteSleepIndTime时间后仍没有收到其他节点发送的网络管理报文,说明其它节点都已经进入休眠或准备休眠,此时应调用Nm_RemoteSleepIndication()函数通知应用层网络中所有节点都进入了休眠。如果此时节点又收到了其他节点发送的网络管理报文,应该再调用Nm_RemoteSleepCancellation()函数通知应用层取消之前的指示。该策略称为远程睡眠指示。
下表展示了所有网络管理相关的时间参数,最左栏是配置参数,通常通过配置工具进行配置,中间栏是节点中网络管理程序需要用到的定时器: