Autosar之CanNm模块
简介
CanNm模块的核心功能是协调网络正常运行和总线睡眠模式之间的转换,除此之外,还提供了可选功能,例如检测当前节点或检测其他所有节点是否准备休眠等。
CanNm提供网络管理接口(Nm)和CanIf模块之间的适配。CanNm通过调用CanIf模块的发送API来传输数据,并提供接收API给CanIf用于接收下层网络管理报文。Nm模块调用CanNm模块API来更改CanNm的当前状态机状态,CanNm的状态机模式切换需要通知给Nm模块
图 CanNm在AUTOSAR中的位置
CanNm模块的主要功能为:
1、协调网络正常运行和总线睡眠模式之间的转换
2、可选功能
(1)检测远程睡眠指令功能
(2)用户数据功能
(3)被动模式功能
(4)NM PDU Rx指示功能
(5)状态变化通知功能
(6)通讯控制功能
(7)NM协调器同步支持功能
(8)减负载功能
3、局部联网功能
4、车辆唤醒功能
功能描述
AUTOSAR CanNm基于分散的直接网络管理策略,这意味着每个网络节点仅根据在通信系统内接收和/或发送报文,执行自给自足的活动。
AUTOSAR CanNm协调算法基于周期性的NM数据包,集群中的所有节点都通过广播传输接收这些数据包。接收到NM数据包表明发送节点要保持NM集群处于唤醒状态。如果任何节点准备好进入总线睡眠模式,它将停止发送NM数据包,但是只要接收到来自其他节点的NM数据包,它就会推迟过渡到总线睡眠模式。如果在专用计时器超时前都未接收到NM数据包,则每个节点都会启动到总线休眠模式的转换。CanNm通过状态机切换和各状态定时器管理来完成协调算法。
状态机切换
模式介绍
首先介绍AUTOSAR CanNm协调算法的三种操作模式:
Network Mode 网络模式
Prepare Bus-Sleep Mode准备总线睡眠模式
Bus-Sleep Mode总线睡眠模式
当本节点的操作模式发生变化的时候,需要通知上层Nm。
Network Mode
Network Mode下包括三种内部状态:
Repeat Message State重复消息状态
Normal Operation State正常运行状态
Ready Sleep State就绪睡眠状态
下面对这三种状态分别说明:
Repeat Message State
当节点配置为Passive Mode的节点,意味着该节点只能接受报文而不能传输任何报文,关于Passive Mode具体的将在下面章节中进行说明。
对于非Passive Mode的节点,Repeat Message State可确保从Bus-Sleep或Prepare Bus-Sleep到Network Mode的任何过渡对于网络上的其他节点都是可见的。此外,它确保所有节点在CanNmRepeatMessageTime(配置参数)内保持活动状态。当CanNmRepeatMessageTime配置为0,表示未配置Repeat Message State。这意味着Repeat Message State是瞬态的,在进入后立即离开,因此无法保证启动稳定性,并且无法执行节点检测过程。当CanNmRepeatMessageTime超时后,节点将离开Repeat Message State而切至其他状态。若当前网络状态为请求,切换到Normal Operation State,若当前网络状态为释放,切换到Ready SleepState。
当非Passive Mode的节点从Bus-SleepMode, Prepare-Bus-Sleep Mode,Normal Operation State或Ready Sleep State进入Repeat Message State时,传输功能应该被重启,为了防止总线数据爆发,降低负载,每次进入Repeat Message State时,都要延迟CanNmMsgCycleOffset(配置参数)段时间后,再开始传输数据,若配置CanNmImmediateNmTransmissions并且网络被请求则不需要延迟CanNmMsgCycleOffset时间。
Normal Operation State
Normal Operation State可确保只要需要网络功能,任何节点都可以使NM集群保持唤醒状态。当处于Normal Operation State,节点按照CanNmMsgCycleTime周期发送报文,当网络释放后,CanNm进入ReadySleep state。
Ready Sleep State
Ready Sleep State可确保NM群集中的任何节点都在等待过渡到Prepare Bus-Sleep Mode。
当进入Ready Sleep State,本节点就不再发送网络管理报文。当节点接收到其他节点传输的网络管理报文时,会将NM-Timeout定时器重置,当NM-Timeout定时器超时且处于Ready Sleep State时,网络管理进入Prepare Bus-Sleep Mode。其中NM-Timeout定时器的时间是由CanNmTimeoutTime(配置参数)决定的。
Prepare Bus Sleep Mode
Prepare Bus Sleep state目的是确保所有节点都有时间在进入总线休眠状态之前停止其网络活动,使总线活动平静下来,最后在“准备总线睡眠模式”下总线上没有任何活动。
当本节点进入Prepare Bus-Sleep Mode,CanNmWaitBusSleepTime(配置参数)定时器被启动,当CanNmWaitBusSleepTime定时器超时,当前状态将由Prepare Bus-Sleep Mode切换至Bus-Sleep Mode。
如果在Prepare Bus-Sleep Mode接收到其他节点传输的网络管理报文时,当前CanNm状态将由Prepare Bus-Sleep Mode切换至Network Mode,默认情况下,将进入Repeat Message State。
如果在Prepare Bus-Sleep Mode接收到网络请求时,当前状态将由Prepare Bus-Sleep Mode切换至Network Mode,默认情况下,将进入Repeat Message State。如果CanNmImmediateRestartEnabled(配置参数)被设置为TRUE,那么在这种情况下会立刻触发一次传输,这样做的理由是:集群中的其他节点仍处于Prepare Bus-Sleep Mode,在这种特殊情况下,应避免过渡到Bus-Sleep Mode,并应尽快恢复总线通信。由于CanNm中网络管理PDU的传输偏移导致,处于Repeat Message State的第一个网络管理PDU的传输可能会大大延迟。为了避免延迟重新启动网络可以立即请求发送网络管理PDU。
Bus-Sleep Mode
Bus-Sleep state的目的是在不交换任何消息时降低节点的功耗。将通信控制器切换到睡眠模式,激活相应的唤醒机制,最后将功耗降低到总线睡眠模式下的适当水平。
当CanNm处于Bus-Sleep Mode接收到网络管理报文时,此时CanNm不会切换至Network Mode,而是通知Nm模块,由上层模块做决策。
当CanNm处于Bus-Sleep Mode接收到被动请求或网络请求时,当前状态将由Bus-Sleep Mode切换至Network Mode,默认情况下,将进入Repeat Message State。
PDU格式
网络管理的报文有特定的格式要求,报文数据段格式如图:
image3
图 NM PDU默认格式
其中CBV(ControlBitVector)字节对应的bit位标识如下
image4
图 CBV格式
对于CBV中的bit说明如下:
Bit 0重复消息请求
0:未请求进入Repeat Message State
1:请求进入Repeat Message State
Bit 1,2:保留位,当配置项CanNmCoordinatorEnabled使能时,该位等于配置的CanNmCoordinatorId的值
Bit 3 NM协调器休眠位
0:主协调器不要求启动同步休眠
1:主协调员请求启动同步休眠
Bit 4主动唤醒位
0:节点尚未唤醒网络
1:节点唤醒了网络
Bit 6局部网络信息位(PNI)
0:NM消息不包含局部网络请求信息
1:NM消息包含局部网络请求信息,该位由配置决定,运行阶段不改变
Bit5 Bit7为保留位
NmPdu中的UserData可以通过CanNm的配置引用EcuC中的Pdu。未使用的情况下默认全0xFF,通过Nm的接口去抓取当前接收与发送的UserData。
可选功能
CanNm可以通过使能配置参数来使用以下可选功能。
检测远程睡眠指令功能
远程睡眠指示应用于一种情况,当处于NormalOperation State的节点发现集群中的所有其他节点都准备睡眠,但处于Normal Operation State状态的节点仍将保持总线苏醒。为了避免这种情况,可以使能远程睡眠指示功能。
如果当前CanNm状态为Normal Operation State,并且在CanNmRemoteSleepIndTime(配置参数)定时器内未收到其他节点发送的网络管理报文,则通知上层Nm模块集群内的其他节点均已准备睡眠。
如果CanNm已通知上层Nm模块,而在Normal Operation State或Ready Sleep State下又收到了网络管理报文,或者CanNm从Normal Operation State切换至Repeat Message State,CanNm需要通知上层Nm模块集群中的某些节点不再准备睡眠。
用户数据功能
使用CanNmUserDataEnabled开关(配置参数)对NM用户数据的支持进行静态配置。
当用户数据功能使能,可以调用CanNm_SetUserData,该函数可以设置总线上接下来发送的NM数据包的NM用户数据。也可以调用CanNm_GetUserData,该函数可以提供包含在最近接收到的NM PDU的有效载荷中的NM用户数据。
如果CanNmComUserDataSupport(配置参数)配置为使能,CanNm将在每次请求发送相应的NM消息之前从引用的NM I-PDU收集NM用户数据,并将用户数据与其他NM字节合并。此时就不能再通过CanNm_SetUserData函数设置用户数据。
被动模式功能
在被动模式下,节点仅接收NM消息,但不发送任何NM消息。被动模式应使用CanNmPassiveModeEnabled开关(配置参数)进行静态配置。
NM PDU Rx指示功能
若CanNmPduRxIndicationEnabled(配置参数)使能,在成功接收NM PDU时,CanNm应通过调用Nm_PduRxIndication通知上层。
状态变化通知功能
如果CanNmStateChangeIndEnabled(配置参数)使能,则CanNm需要将CanNm状态的所有更改通知上层Nm。
通讯控制功能
使用CanNmComControlEnabled开关(配置参数),可以静态配置通信控制。当CanNm_DisableCommunication函数被调用,CanNm模块NM报文的传输能力将被停止,直到调用CanNm_EnableCommunication,CanNm的nm报文传输能力被恢复。
当CanNm_DisableCommunication函数被调用,CanNm的NM-Timeout定时器将被停止,调用函数CanNm_EnableCommunication,NM-Timeout定时器将被恢复。若一直未调用CanNm_EnableCommunication,CanNm会一直处在Ready Sleep State中无法进入休眠状态,在这种情况下,AutoSar规定,当网络被释放后,CanNm将从Ready Sleep State切换至Prepare Bus-Sleep Mode。
NM协调器同步支持功能
当有多个协调器连接到同一条总线时,在CBV中,NmCoordinatorSleepReady位用于指示主协调器请求启动关闭,有关CBV的概念见2.2章。
当CanNm处于网络模式,接收网络管理报文的CBV中NmCoordinatorSleepReady=1,则CanNm通知上层协调睡眠功能被请求。
当CanNm已通知上层协调睡眠功能被请求,接收网络管理报文的CBV中NmCoordinatorSleepReady=0,则CanNm通知上层协调睡眠功能请求被取消。
减负载功能
当CanNmBusLoadReductionEnabled参数配置为TRUE时,CanNm应该支持总线负载降低机制,当从其他状态进入Repeat Message State状态时,关闭总线负载降低机制,当从其他状态进入Normal Operation State状态时,打开总线负载降低机制。
当总线负载降低机制启动后,CanNm_RxIndication()被调用后,使用CanNmMsgReducedTime参数重装CanNm Message Cycle Timer,当总线负载降低机制启动后,当成功发送NM PDU后,用CanNmMsgCycleTime参数重装CanNm Message Cycle Timer。
PN功能
Autosar4.x版本开始支持PN功能,Pn功能的目的是基于功能划分网络,形成局域网;这种功能的划分由整车设计完成,对于各节点只需要关心自身存在的网段。只有在CanNmGlobalPnSupport(配置参数)和各通道下的CanNmPnEnabled(配置参数)使能的情况下,Pn功能才能正常工作。
如果CanNmPnEnabled(配置参数)为FALSE,则CanNm将执行正常的Rx指示处理,并且应禁用Pn功能。如果CanNmPnEnabled为TRUE,接收到的NM-PDU CBV中的PNI位为0,则CanNm模块应执行常规的Rx指示处理,从而省去了Pn功能的扩展。如果CanNmPnEnabled为TRUE并且接收到的NM-PDU CBV中的PNI位为1,则CanNm模块处理NM-PDU的Pn信息。
如果CanNmPnEnabled为TRUE,则CanNm模块应将CBV中发送的PNI位的值设置为1,要使用Pn,则必须使用CBV。
如果CanNmPnEnabled为FALSE,则CanNm模块应将CBV中已发送的PNI位的值始终设置为0。
Pn信息的位置位于网络管理报文的用户数据部分中,具体的位置通过CanNmPnInfoOffset和CanNmPnInfoLength来确定。
例如当CanNmPnInfoOffset = 3,CanNmPnInfoLength = 2,代表NM消息只有字节3和字节4包含PN请求信息。
PN过滤
PNC是Partial Network Cluster的缩写,它是指为了在车辆网络中支持一个或多个车辆功能而由多个ECU构成的集群。PNC的编号我们称为PNC ID,范围8~63,整车网络统一编号,关于PNC id与CanNmPdu映射关系说明:PNC ID对应CanNmPdu中的一个bit,例如PNC ID=8,对应CanNmPduByte1的bit0;PNC ID=63,对应Byte7的bit7;PNC ID对应的bit数值为1,则表示当前PN网络被请求,为0则表示网络释放。
通过配置参数CanNmPnFilterMaskByte,CanNm可以检测到哪个PN与ECU相关,而哪个与PN不相关。
CanNmPnFilterMaskByte的每个位具有以下含义:
0 PN请求与本ECU无关。如果接收的NM PDU中将该位置设置为1,也无法使ECU的通讯栈处于唤醒状态,因为该位的请求与本ECU是无关的。
1 PN请求与本ECU有关。如果已在接收的NM-PDU中将该位置设置为1,则ECU的通信堆栈将保持唤醒状态。
如果至少有一位与本ECU相关的PN请求,那么这条Nm PDU对于CanNm来说就是有用的,需要进行处理,如果没有一位与本ECU相关的PN请求,那么这条NM PDU将被忽略。
ERA与EIRA
ERA是指ECU外部的PN请求的聚合,当CanNmPnEraCalcEnabled使能(配置参数),表示支持ERA功能。而EIRA是指ECU内部和外部Pn请求的聚合,当CanNmPnEiraCalcEnabled使能(配置参数),表示支持EIRA功能。
ERA是在网关节点才使用,此时没有内部的请求,只有不同的Channel对Pn的外部请求,ERA会为每个channel的每个PN位都设置一个监测的定时器,当CanNmPnResetTime(配置参数)时间内未请求PN,则将该PN的请求状态设置为未请求,每次请求状态有变化的时候都会通知上层PduR,由PduR模块进行转发。
EIRA体现了当前节点与网络上其他节点对某一个PNC的请求与释放情况;EIRA不区分物理Channel,只针对不同的PN。EIRA会为每个PN位都设置一个监测的定时器,当CanNmPnResetTime(配置参数)时间内未请求PN,则将该PN的请求状态设置为未请求,每次请求状态有变化的时候都会通知上层PduR,由PduR模块进行转发。
自发传输
如果网络被请求并且CanNmPnHandleMultipleNetworkRequest(配置参数)设置为TRUE,无论CanNm处于Ready Sleep State,Normal Operation State或Repeat Message State,CanNm应更改为或重新启动为Repeat Message State。并且,CanNm会传输CanNmImmediateNmTransmissions(配置参数)数量的报文,其中第一条报文立即传输,其他报文按CanNmImmediateNmCycleTime传输(配置参数)。
车辆唤醒功能
当CanNmCarWakeUpRxEnabled(配置参数)使能时,车辆唤醒功能被启用,目前暂时没有使用场景。如果任何接收到的NM-PDU中的Car Wakeup位为1,都会通知上层Nm。
当CanNmCarWakeUpRxEnabled(配置参数)使能,CanNmCarWakeUpFilterEnabled(配置参数)也使能时,只有收到NodeId等于CanNmCarWakeUpFilterNodeId的报文时,才会通知上层。
源文件描述
表 CanNm组件文件描述
文件
说明
CanNm_Cfg.h
定义CanNm模块预编译时用到的配置参数。
CanNm_Cfg.c
定义CanNm模块生成的配置参数。
CanNm.h
CanNm模块头文件, 包含了API函数的扩展声明并定义了配置的数据结构。
CanNm.c
CanNm模块源文件,包含了API函数的实现。
CanNm_Cbk.h
包含CanNm供CanIf调用的API函数的声明
CanNm_Internal.h
包含CanNm内部的变量和数据结构的定义
CanNm_MemMap.h
CanNm编译抽象文件
静态接口函数定义