功能概述
- AUTOSAR CanNm基于分布式直接网络管理策略,这意味着每个网络节点仅根据通信系统内接收或传输的网络管理 PDU执行自给自足的活动。
- AUTOSAR CanNm算法基于周期性的网络管理PDU,这些PDU通过广播传输被集群中的所有节点接收。接收到网络管理PDU表明发送节点希望保持网络管理集群处于唤醒状态。如果任何节点准备进入总线睡眠模式,它将停止发送网络管理PDU,但只要接收到来自其他节点的网络管理PDU,它就会推迟进入总线睡眠模式的转换。最后,如果由于不再接收到任何网络管理PDU而导致专用计时器超时,每个节点将启动向总线睡眠模式的转换。
- 如果网络管理集群中的任何节点需要总线通信,它可以通过发送网络管理PDU将网络管理集群从总线休眠模式唤醒。
功能需求及实现
关键需求:
- CanNm集群中的每个网络节点只要需要总线通信,就应发送周期性的网络管理PDU;否则,它不应发送任何网络管理PDU。
- 如果CanNm集群中的总线通信被释放,并且在由配置参数
CANNM_TIMEOUT_TIME
和CANNM_WAIT_BUS_SLEEP_TIME
确定的可配置时间内总线上没有网络管理PDU,则应执行向总线睡眠模式的转换。
注意:状态转换必须在下一个main function
调用之前完成。
操作模式(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
定时器。
注意:如果启用了CANNM_IMMEDIATE_TXCONF_ENABLED
,则假定每个网络管理PDU传输请求都会成功完成网络管理PDU的传输。
重复报文状态(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。
注意:如果启用了被动模式或网络管理PDU传输能力被禁用,则不会传输NM PDU,因此无需执行任何操作。 - 当
Normal Operation 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),则不会发送任何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模块应将网络状态更改为 “已释放”。
初始化(Initialization)
- 如果CanNm模块的初始化 (
CanNm_Init
) 成功,CanNm模块应将网络管理状态设置为Bus-Sleep Mode
。注:CanNm模块应在CanIf初始化之后、和调用任何其他网络管理服务之前进行初始化。 - 初始化时,默认情况下,CanNm模块应将网络状态设置为 “已释放”。
- 初始化时,默认情况下 CanNm 模块应进入
Bus-Sleep Mode
。 - 函数
CanNm_Init
通过传递配置指针参数来选择活动配置集。 - 如果
CanNmGlobalPnSupport
设置为 “true”,并且CanNm已初始化(调用CanNm_Init
),则CanNm应停止NM消息 Tx超时定时器。 - 在初始化过程中,CanNm模块应停用总线负载降低功能。
- 初始化后,CanNm模块应通过停止 "消息周期定时器 "来停止网络管理PDU的传输。注:如果
CanNmPassiveModeEnabled
设置为 “true”,则不需要CanNm消息周期,因为此类节点不会传输网络管理PDU。 - 如果CanNm没有初始化,任何CanNm函数(
CanNm_Init
除外)的调用都将被拒绝,如果API有返回值,则将返回 E_NOT_OK。如果启用了开发错误检测(CanNmDevErrorDetect
设置为TRUE),则应向DET报告 CANNM_E_UNINIT。 - 在初始化过程中,CanNm模块应将用户数据(user data)的每个字节设置为0xFF 。
10.在初始化过程中,CanNm 模块应将“Control Bit Vector”设置为 0x00。
具体实现
AUTOSAR CanNm算法应独立于处理器,这意味着;它不依赖于任何特定于处理器的硬件支持,因此可以在AUTOSAR范围内的任何处理器架构上实现。
时间参数(Timing parameters)
- 配置参数“CanNmTimeout Time”应确定AUTOSAR CanNm时许参数
NM-Timeout Time
。 - 配置参数“CanNmRepeatMessageTime”应确定AUTOSAR CanNm时序参数
Repeat Message Time
。 - 配置参数“CanNmWaitBusSleepTime”应确定AUTOSAR CanNm时序参数
Wait Bus-Sleep Time
。 - 配置参数“CanNmRemoteSleepIndTime”应确定AUTOSAR CanNm时序参数远程睡眠指示时间
Remote Sleep Indication Time
。
网络管理PDU结构
下图显示了8个字节的网络管理PDU的格式,其中源节点标识符位于第一个字节,控制位向量位于第二个字节:
- 源节点标识符的位置应可通过
CanNmPduNidPosition
配置为字节0、字节1或关闭(默认值:字节0)。注意:将CanNmPduNidPosition
设置为关闭意味着在NM PDU中没有空间被源节点标识符占用。因此,用户数据又多了一个字节。 - 控制位向量的位置应可通过
CanNmPduCbvPosition
配置为字节0、字节1或关闭(默认值:字节1)。注意:将CanNmPduCbvPosition
设置为关闭意味着在NM PDU中没有空间被源节点标识符占用。因此,用户数据又多了一个字节。
注意:网络管理PDU的长度由“全局”ECUC模块中的PduLength
参数定义,请参阅Ecu配置规范)。启用的系统字节数和D网络管理PDU的长度之间的差值是用户数据字节数。
下图描述了控制位向量的格式:
控制位向量应由以下部分组成
位 0:重复报文请求
\qquad
0:未请求重复报文状态
\qquad
1: 要求重复信息状态
位 3:NM 协调器睡眠位
\qquad
0:主协调器未请求开始同步关机
\qquad
1: 主协调器要求开始同步关机
位 4 主动唤醒位
\qquad
0:节点被动唤醒
\qquad
1:节点主动唤醒网络
位 6 部分网络信息位 (PNI)
\qquad
0:NM PDU 不包含部分网络请求信息
\qquad
1:NM PDU 包含部分网络请求信息
第 1、2、5、7 位保留用于未来扩展
\qquad
0:禁用/保留供将来使用
注意:在初始化过程中,控制位向量以0x00初始化。
- CanNm模块应使用配置参数
CanNmNodeId
设置源节点标识符,除非CanNmPduNidPosition
设置为关闭。 - 如果CanNm因调用
CanNm_NetworkRequest
而执行从Bus Sleep Mode
或Prepare Bus Sleep Mode
到Network Mode
的状态更改(即因主动唤醒),且CanNmActiveWakeupBitEnabled
为TRUE,则CanNm应在CBV中设置ActiveWakeupBit
。 - 如果CanNm模块离开
Network Mode
且CanNmActiveWakeupBitEnabled
为TRUE,则CanNm模块应清除CBV中的ActiveWakeupBit
。
通信调度
传输(Transmission)
传输机制仅在启用了网络管理PDU传输能力时才相关。
- 网络管理PDU的传输能力应可通过CanNmPassiveModeEnabled进行配置。
- CanNm模块应提供周期性传输模式。在这种传输模式下,CanNm模块应定期发送网络管理PDU。
- CanNm模块应可选择提供降低总线负载的周期性传输模式。在这种传输模式下,CanNm模块应根据特定算法传输网络管理PDU。
周期性传输模式用于Repeat Message State
和Normal Operation State
。带总线负载减少功能的周期性传输模式仅在Normal Operation State
下可用。
注:如果总线负载降低机制被禁用,则在Repeat Message State
和Normal Operation State
下使用周期性传输模式。
只有在启用总线负载降低机制的情况下,才会在Normal Operation State
下使用总线负载降低的周期性传输模式。 - 应通过
CanNmImmediateTxConfEnabled
配置即时传输确认机制。
注:即时传输确认机制适用于不想使用CanIf实际确认的系统。
理由依据:如果总线访问完全通过离线系统设计工具来调节,则CanIf的实际传输确认可视为冗余。由于假设已知最大仲裁时间,因此可以在传输请求时立即发出确认。
此外,在这样的系统中仅针对一条NM消息,执行多余的实际传输确认,将意味着与整个Can接口(CanIf)和Can驱动程序层的执行时间有关的重大性能损失,从而使计算的时间的效率低下。 - 如果不是通过调用
CanNm_NetworkRequest
,进入Repeat Message State
,或者CanNmImmediateNmTransmissions
为零,则在进入Repeat Message State
后,NM PDU的传输应延迟CanNmMsgCycleOffset
。 - 当由于
CanNm_NetworkRequest()
(主动唤醒)而从Bus Sleep Mode
或Prepare Bus Sleep Mode
进入Repeat Message State
时,如果CanNmImmediateNmTransmissions
大于零,则应使用CanNmImmmediateNmCycleTime
作为循环时间来传输NM PDU。应尽快触发第一个NM PDU的传输。传输后,消息周期定时器应重新加载CanNmImmediatenCycleTime
。在这种情况下,不应使用CanNmMsgCycleOffset
。 - 如果从
Ready Sleep State
进入Normal Operation State
,则应立即开始传输NM PDU。 - 如果
CanNmPnHandMultipleNetworkRequests
设置为TRUE,则CanNm_NetworkRequest
应触发从Network Mode
到Repeat Message State
的状态转换。如果启用了PDU传输能力,则应使用CanNmImmediateNmCycleTime
作为周期时间传输NM PDU。第一个NM PDU的传输应尽快触发。传输后,应使用CanNmImmediateNmCycleTime
重新加载信息周期定时器。在这种情况下,不应使用CanNmMsgCycleOffset
。
注:根据ECUC_CanNm_00056
,在这种情况下CanNmImmediateNmTransmissions
必须大于零。 - 如果NM PDU需使用
CanNmImmediateNmCycleTime
来进行传输,CanNm 应确保成功请求使用此定时的CanNmImmediateNmTransmission
(包括第一次立即传输)被成功请求。 如果对CanIf的传输请求失败(即:返回E_NOT_OK),CanNm将在下一个主函数中重试传输请求。 - 如果NM PDU需使用
CanNmImmediateNmCycleTime
来进行传输,CanNm 应确保成功请求使用此定时的CanNmImmediateNmTransmission
(包括第一次立即传输)被成功请求。 如果对CanIf的传输请求失败(即:返回E_NOT_OK),CanNm将在下一个主函数中重试传输请求。之后,CanN 应使用CanNmMsgCycleTime
继续传输NM PDU。
注意:在使用CanNmImmediateNmCycleTime
传输NM PDU时,不得传输其他Nm PDU(即CanNmMsgCycleTime
传输周期已经被停止)。 - 如果已开始传输网络管理PDU,且CanNm报文周期定时器到期,则CanNm模块应通过调用CanIf函数
CanIf_Transmit
传输网络管理 PDU。
注意: 如果CanIf_Transmit
函数调用失败,第 7.12 章所述的传输错误处理将通知CanNm模块。 - 如果NM PDU的传输已经开始,在下列的两种场景中,CanNm模块需通过调用CanIf_Transmit,发送NM PDU。
- 如果 CanNm 报文周期定时器过期,CanNm模块应使用
CanNmMsgCycleTime
重新启动。 - 如果网络管理PDU的传输已停止,CanNm模块应取消消息周期定时器。
接收(Reception)
如果成功接收到NM PDU,CanIf模块将调用回调函数CanNm_RxIndication
。
- 在调用回调函数
CanNm_RxIndication
时,CanNm模块应将函数参数中引用的网络管理PDU的数据复制到内部缓冲区。
UML状态图
下图显示了与API规范相关的UML状态图。与模式变化相关的转换用绿色表示,与错误处理相关的转换用红色表示,与可选节点检测相关的转换用蓝色表示。此外,假定总线负载减少功能已启用。