功能概述
- AUTOSAR CanNm基于分布式直接网络管理策略,这意味着每个网络节点仅根据通信系统内接收或传输的网络管理 PDU执行自给自足的活动。
 - AUTOSAR CanNm算法基于周期性的网络管理PDU,集群中的所有节点通过广播传输接收这些PDU。网络管理PDU的接收表明发送节点希望保持网络管理集群的唤醒状态。如果任何节点准备好进入总线睡眠模式,它将停止发送网络管理PDU,但只要收到其他节点的网络管理PDU就推迟向总线睡眠模式的转换。最后,如果由于不再收到网络管理 PDU而导致专用定时器超时,则每个节点都会启动向总线休眠模式的过渡。
 - 如果网络管理集群中的任何节点需要总线通信,它可以通过发送网络管理PDU将网络管理集群从总线休眠模式唤醒。
 
功能需求及实现
关键需求:
- 只要需要总线通信,CanNm集群中的每个网络节点都应定期传输网络管理PDU;否则不应传输任何网络管理 PDU。
 - 如果CanNm集群中的总线通信被释放,并且在由
CanNmTimeoutTime + CanNmWaitBusSleepTime(两个配置参数)决定的可配置时间内总线上没有网络管理PDU,则应过渡到总线休眠模式。 
运行模式(Operational Modes)
AUTOSAR CanNm 应包含模块接口可见的三种运行模式:
- 网络模式(Network Mode)
 - 预备总线休眠模式(Prepare Bus-Sleep Mode)
 - 总线休眠模式(Bus-Sleep Mode)
 
AUTOSAR CanNm运行模式的更改应通过回调函数通知上层。调用CanNm_GetState时,CanNm返回当前的NM 状态和模式。
网络模式(Network Mode)
网络模式由三个内部状态组成:
- 重复报文状态(Repeat Message State)
 - 正常运行状态(Normal Operation State)
 - 准备睡眠状态(Ready Sleep State)
 
- 从
Bus-Sleep Mode式进入Network Mode时,默认情况下 CanNm模块应进入Repeat Message State。 - 从 
Prepare Bus- Sleep Mode模式进入Network Mode时,默认情况下CanNm模块应进入Repeat Message State。 - 进入
Network Mode后,CanNm模块应启动网络管理超时定时器NM-Timeout。 - 进入
Network Mode后,CanNm应通过调用回调函数Nm_NetworkMode通知上层当前的新运行模式。 - 在
Network Mode下成功接收网络管理PDU时(调用CanNm_RxIndication),如果启用了PDU传输能力,CanNm模块应重新启动NM-Timeout定时器。 - 在
Network Mode下成功发送网络管理 PDU 时(调用CanNm_TxConfirmation时为E_OK),CanNm 模块应重新启动NM-Timeout定时器。 
重复报文状态(Repeat Message State)
对于非被动模式的节点,Repeat Message State可确保网络上的其他节点看到从Bus-Sleep或Prepare Bus-Sleep到Network Mode的任何转换。此外,它还确保任何节点在最短的时间内保持活动状态。它可用于检测当前节点。
 进入Repeat Message State后,CanNm 模块将(重新)开始传输网络管理PDU,除非启用了被动模式(passive mode)和/或禁用了通信。
- 在 
Repeat Message State下,当网络管理定时器NM-Timeout到期时,CanNm 模块应(重新)启动网络管理NM-Timeout超时定时器。 - 网络管理状态机应在
Repeat Message State下停留一定时间,该时间由CanNmRepeatMessageTime(配置参数)决定;之后,CanNm 模块应离开Repeat Message State。 - 离开
Repeat Message State后,如果已请求网络,CanNm模块将进入Normal Operation State。 - 离开
Repeat Message State状态后,如果网络已被释放,CanNm模块应进入Ready Sleep State。 - 如果
CanNmNodeDetectionEnabled设置为 “TRUE”,则CanNm应在离开Repeat Message State时清除"重复报文(Repeat Message Bit)"位。 - 如果在
Repeat Message State、Prepare Bus-Sleep Mode或Bus-Sleep Mode下调用CanNm_RepeatMessageRequest服务,CanNm模块将不执行该服务并返回E_NOT_OK 。 
正常运行状态(Normal Operation State)
正常操作状态确保只要网络被请求,任何节点都可以保持网络管理集群的唤醒状态。
- 从
Ready Sleep State状态进入Normal Operation State状态后,CanNm模块将开始传输网络管理PDU。注意: 如果启用了被动模式(passive mode)或禁用了网络管理PDU传输功能,则不会传输NM PDU,因此无需执行任何操作。 - 当
Ready Sleep State下的NM 超时定时器NM-Timeout到期时,CanNm 模块应(重新)启动NM超时NM-Timeout定时器。 - 当网络释放且当前状态为
Normal Operation State时,CanNm模块应进入Ready Sleep state。 - 如果
CanNmNodeDetectionEnabled设置为 “TRUE”,并且在Normal Operation State下接收到重复信息请求位,则 CanNm 模块将进入Repeat Message State。 - 如果
CanNmNodeDetectionEnabled设置为 “TRUE”,并且在Normal Operation State下调用函数CanNm_RepeatMessageRequest,则CanNm模块将进入Repeat Message State。 - 如果
CanNmNodeDetectionEnabled设置为 “TRUE”,并且在Normal Operation State下调用了函数CanNm_RepeatMessageRequest,则 CanNm模块应设置重复消息位(Repeat Message Bit)。 
准备睡眠状态(Ready Sleep State)
Ready Sleep State确保只要有其他节点保持网络管理群集中的唤醒状态,网络管理群集中的任何节点都会等待过渡到Prepare Bus-Sleep Mode的转换。
- 当从
Repeat Message State或Normal Operation State进入Ready Sleep State时,CanNm模块应停止传输网络管理 PDU。注意: 如果启用了被动模式(passive mode)或禁用了网络管理PDU传输功能,则不会传输NM PDU,因此无需执行任何操作。 - 在
Ready Sleep State下,当NM超时定时器NM-Timeout到期时,CanNm 模块应进入Prepare Bus-Sleep Mode。 - 当网络被请求并且当前状态为
Ready Sleep State时,CanNm模块应进入Normal Operation State。 - 如果
CanNmNodeDetectionEnabled设置为 “TRUE”,并且在Ready Sleep State下接收到重复信息请求位,则CanNm 模块应进入Repeat Message State。 - 如果
CanNmNodeDetectionEnabled设置为 “TRUE”,并且在Ready Sleep State下调用函数CanNm_RepeatMessageRequest,则CanNm模块将进入Repeat Message State。 - 如果
CanNmNodeDetectionEnabled设置为 “TRUE”,并且在Ready Sleep State下调用了函数CanNm_RepeatMessageRequest,则 CanNm模块应设置重复消息位(Repeat Message Bit)。 
预备总线休眠模式(Prepare Bus-Sleep Mode)
Prepare Bus-Sleep Mode的目的是确保在进入Bus-Sleep Mode之前,所有节点都有时间停止网络活动。在Prepare Bus-Sleep Mode下,总线活动将趋于平静(即传输队列报文,以使所有Tx 缓冲区为空),最终在 Prepare Bus-Sleep Mode下总线上没有任何活动。
- 当进入
Prepare Bus-Sleep Mode时,CanNm模块应通过调用Nm_PrepareBusSleepMode通知上层。 - CanNm模块应在
Prepare Bus-Sleep Mode中保持一段可配置的时间,该时间由CanNmWaitBusSleepTime(配置参数)决定;之后应退出Prepare Bus-Sleep Mode并进入Bus-Sleep Mode。 - 在
Prepare Bus-Sleep Mode下成功接收网络管理PDU后,CanNm模块应进入Network Mode;默认情况下,CanNm 模块应进入Repeat Message State。 - 在
Prepare Bus-Sleep Mode模式下请求网络时,CanNm模块应进入Network Mode;默认情况下,CanNm 模块应进入Repeat Message State。 - 在
Prepare Bus-Sleep Mode模式下请求网络且CanNm模块已进入Network Mode,并且CanNmImmediateRestartEnabled(配置参数)设置为 "true "时,CanNm模块应发送网络管理PDU。
理由依据:集群中的其他节点仍处于Prepare Bus-Sleep Mode;在上述特殊情况下,应避免过渡到Bus-Sleep Mode,并尽快恢复总线通信。
由于CanNm中网络管理PDU的传输偏移,Repeat Message State下第一个网络管理PDU的传输可能会严重延迟。为了避免延迟重启网络,可以立即请求传输网络管理PDU。
注意:如果将CanNmImmediateRestartEnabled设为 “TRUE”,并使用唤醒线路,则在Prepare Bus-Sleep Mode下,如果所有网络节点都收到网络请求,就会发生网络管理PDU突发。 
总线休眠模式(Bus-Sleep Mode)
Bus-Sleep Mode的目的是在不交换信息时降低节点的功耗。在Bus-Sleep Mode下,通信控制器进入休眠模式,启动相应的唤醒机制,最终将功耗降至适当水平。
 如果网络管理集群中的所有节点都配置了由CanNmTimeoutTime + CanNmWaitBusSleepTime(两个配置参数)决定的可配置时间,则网络管理集群中使用AUTOSAR NM算法进行协调的所有节点都会在大致相同的时间过渡到Bus-Sleep Mode。
 注意:在网络管理集群的所有网络节点中,参数CanNmTimeoutTime 和 CanNmWaitBusSleepTime的值应该相同。根据具体实施情况,进入Bus-Sleep Mode的时间会完全相同或大致相同;这一转换的时间抖动取决于以下因素:
- 内部时钟精度(振荡器漂移)
 - NM任务周期时间(如果任务未与全局时间同步)
 - 网络管理PDU在Tx队列中的等待时间(如果在传输请求后立即进行传输确认)
 
在最佳情况下,只需考虑振荡器漂移的可配置时间,该时间由 CanNmTimeoutTime + CanNmWaitBusSleepTime(两个配置参数)决定。
- 进入总
Bus-Sleep Mode时(初始化时的默认情况除外),CanNm模块应通过调用回调函数Nm_BusSleepMode通知上层。 - 当CanNm模块在
Bus-Sleep Mode下成功接收到网络管理PDU(调用CanNm_RxIndication)时,CanNm模块应通过调用回调函数Nm_NetworkStartIndication通知上层。
理由依据:为避免出现网络管理和模式管理之间的竞争条件和状态不一致,CanNm不会自动执行从Bus-Sleep Mode到Network Mode的转换。CanNm只通知必须做出唤醒决定的上层。总线休眠模式下的网络管理PDU接收必须根据 ECU关闭/启动过程的当前状态进行处理。 - 当CanNm模块在
Bus-Sleep Mode下成功接收到网络管理PDU(调用CanNm_RxIndication)时,CanNm模块应向 DET报告错误CANNM_E_NET_START_IND。 - 如果在
Bus-Sleep Mode或Prepare Bus-Sleep Mode下调用CanNm_PassiveStartUp,CanNm模块应进入Network Mode;默认情况下,CanNm 模块应进入Repeat Message State。
注意:在Prepare Bus-Sleep Mode和Bus-Sleep Mode中,假定网络已释放,除非明确请求总线通信。 - 在
Bus-Sleep Mode下请求网络时,CanNm 模块应进入Network Mode;默认情况下,CanNm模块应进入Repeat Message State。 
网络状态(Network states)
网络状态(即 "请求(requested)"和 “释放(released)”)是AUTOSAR CanNm状态机的两个附加状态,与状态机并行存在。网络状态表示软件组件是否需要在总线上通信(此时网络状态为 “请求”);或者软件组件是否不需要在总线上通信(此时总线网络状态为 “释放”);请注意,如果网络被释放,ECU 可能仍会通信,因为其他 ECU 仍会请求使用网络。
 网络状态(即“请求”和“释放”)是AUTOSAR CanNm状态机的两个附加状态,与状态机并行存在。网络状态表示软件组件是否需要在总线上通信(然后“请求(requested)”网络状态);或者软件组件是否不必在总线上通信(总线网络状态随后被“释放(released)”);请注意,如果网络被释放,ECU仍可能通信,因为其他ECU仍在请求网络。
- 函数调用
CanNm_NetworkRequest应请求网络。即CanNm模块应将网络状态更改为 “请求”。 - 调用函数
CanNm_NetworkRelease应释放网络。即CanNm模块应将网络状态更改为 “已释放”。 
