功能概述
- 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模块应将网络状态更改为 “已释放”。