AUTOSAR通信篇 - CAN网络通信(六:CanNm)

文章目录

  • 功能介绍
    • 协调算法
    • 工作模式
      • 网络模式
        • Repeat Message State(重复消息状态)
        • Normal Operation State(正常运行/工作状态)
        • Ready Sleep State(就绪睡眠状态)
      • Prepare Bus Sleep Mode(预休眠模式)
      • Bus Sleep Mode(休眠模式)
    • 网络状态
    • 初始化
    • 执行
      • 处理器架构
      • 时间参数
    • 网络管理PDU结构
    • 通信调度
      • 发送
      • 接收
    • 总线负载降低机制
    • 其他功能
      • 远程休眠指示检测
      • 用户数据
        • COM用户数据
      • 被动模式
      • 网络管理PDU Rx提示
      • 状态改变提醒
      • 通信控制
      • 协调器同步支持
    • 车辆唤醒
      • Rx路径
      • Tx路径
    • 部分网络
      • NM PDUs的Rx处理
      • NM PDUs的Tx处理
      • 处理内部请求的部分网络集群
      • 通过CanNm_NetworkRequest实现NM PDUs的自发传输
    • 发送错误处理
    • CanNm 算法状态机UML图
    • 时序图
      • CanNm发送
      • CanNm接收
      • CanNm 协调

CanNM的一个通道只能关联到网络上的一个网络管理cluster。同样,一个网络管理cluster,在CanNM节点上只有一个通道。即CanNM通道和网络管理cluster是1:1的关系。

CAN网络管理(CanNM)主要使用Can接口(CanIf)的服务,为通用网络管理接口(NmIf)提供服务。Autosar CanNM是硬件无关的协议,主要用于在网络上协调节点在正常运行和总线休眠之间的切换。
AUTOSAR通信篇 - CAN网络通信(六:CanNm)_第1张图片

功能介绍

协调算法

AUTOSAR CanNM是基于去中心化直接网络管理策略,这意味着每个网络节点仅依赖于在通信系统上接收或发送网络管理PDUs,来执行自给自足的活动。
AUTOSAR CanNM算法基于周期的网络管理PDUs,这些PDUs周期地被cluster上所有节点接收。接收的网络管理PDUs表明发送节点期望保持该网络管理cluster为唤醒状态。若任一节点已准备好进入Bus-Sleep模式,它将停止发送网络管理PDUs,但是会接收其他节点发送的网络管理PDUs,推迟转换到总线睡眠模式。最后,如果由于不再接收到网络管理PDUs而导致专用定时器超时,则每个节点都开始转换到总线睡眠模式。
如果网络管理cluster上任一节点请求总线通信,它可通过发送网络管理PDUs将唤醒网络管理节点从Bus-Sleep模式唤醒。
AUTOSAR网络管理算法的主要特点由以下两个方面:

  • 在CanNM cluster上的每个网络节点,只要它需要总线通信,它应周期发送网络管理PDUs。否则不发送网络管理PDUs;
  • 如果CanNmStayInPbsEnabled被禁止,CanNM cluster上的总线通信被释放,且在配置的时间(CanNmTimeoutTime + CanNmWaitBusSleepTime,都是配置参数)其间总线上无网络管理PDUs,那么执行切换到Bus-Sleep模式的动作。

AUTOSAR CanNM状态机算法整体上由以下组成:
从网络管理集群中单个节点的角度来看,AUTOSAR CanNm状态机应包含AUTOSAR CanNm算法所需的状态、转换和触发器。状态切换最晚要在下一个main函数执行周期内完成。

工作模式

下面详细介绍AUTOSAR CanNM算法的运行模式。在模块的接口上,可见的AUTOSAR CanNM有3种运行模式:

  • 网络模式(Network Mode)
  • 预休眠模式(Prepare Bus-Sleep Mode)
  • 休眠模式(Bus-Sleep Mode)

CanNM运行模式的改变,会通过回调函数的方式通知到上层;当调用函数CanNm_GetState,CanNM返回当前的NM状态和模式。

网络模式

网络模式包含3个自状态:

  • Repeat Message State
  • Normal Operation State
  • Ready Sleep State

当从Bus-Sleep模式进入Network模式,默认情况下CanNM进入Repeat Message State.
当从Prepare Bus-Sleep模式进入Network模式,默认情况下CanNM进入Repeat Message State.
当进入了Network模式,CanNM启动NM-Timeout定时器。当进入了Network模式CanNM调用回调函数Nm_NetworkMode通知上层当前新的运行模式。
在网络模式下成功接收到网络管理PDU(调用CanNm_RxIndication)时,如果PDU传输能力已启用,则CanNm模块应重启Nm超时定时器。
在网络模式下成功传输网络管理PDU(调用CanNm_TxConfirmation返回E_OK)时,CanNm模块应重启Nm超时定时器。
如果使能CanNmImmediateTxConfEnabled,就认为每次网络管理PDU发送请求,都能成功发送网络管理PDU。
当CanNM模块启动或重启时,复位NM-Timeout定时器。
如果在网络模式下调用CanNm_PassiveStartUp,则CanNm模块不应执行此服务,并应返回E_NOT_OK。
如果在CanNmDynamicPncToChannelMappingEnabled设置为TRUE且CanNm处于网络模式的通道上调用函数CanNm_PnLearningRequest,则CanNm模块应在该通道上将CBV中的重复消息位和部分网络学习位设置为1,并更改或重启Repeat Message状态。
如果在CanNmDynamicPncToChannelMappingEnabled设置为TRUE且CanNm处于网络模式的通道上接收到位部分网络学习和重复消息请求值都为1,则CanNm应在该通道上将CBV中的部分网络学习位设置为1,并更改或重启Repeat Message状态。
这里重启的意思是CanNM已经处在Repeat Message状态,那么将执行一次重新进入Repeat Message状态的操作。

Repeat Message State(重复消息状态)

对于不处于被动模式的节点,重复消息状态确保节点任何从总线睡眠或准备总线睡眠到网络模式的转变对网络上的其它节点变得可见。此外,它确保任何节点在一小段时间内保持活动状态。它可以用于检测当前节点。
当进入重复消息状态时,除非启用被动模式和/或禁用通信,否则CanNm模块应(重新)开始传输网络管理PDU。
当Nm超时定时器在重复消息状态下到期时,CanNm模块应(重新)启动NM超时定时器。
当NM超时定时器在重复消息状态下到期时,CanNm模块应向DET报告CANNM_E_NETWORK_TIMEOUT。
网络状态机应该在重复消息状态停留由配置参数CanNmRepeatMessageTime决定的时间,然后CanNM离开重复消息状态。
当已经离开重复消息状态,如果网络被请求,CanNM模块应进入正常运行状态。
当已经离开重复消息状态,如果网络被释放,CanNM模块应进入Ready Sleep状态。
如果CanNmNodeDetectionEnabled设置未TRUE,CanNM离开重复消息状态时,清除重复消息位。
如果服务CanNm_RepeatMessageRequest在重复消息状态、准备总线睡眠模式或总线休眠模式下被调用,则CanNm模块不执行该服务并返回E_NOT_OK。
如果CanNmDynamicPncToChannelMappingEnabled设置位TRUE,CanNM离开重复消息状态时,清除部分网络学习位。

Normal Operation State(正常运行/工作状态)

正常运行模式确保只要网络被请求,任何节点可以保持网络管理cluster处于唤醒的状态。
当从准备休眠状态进入正常运行状态,CanNM模块应开始发送网络管理PDUs。
若使能了被动模式或网络管理PDU发送能力被禁止,那么将不会发送NM PDUs,因此不要求任何动作。
当在正常运行状态下NM-Timeout定时器超时,CanNM模块应重启NM-Timeout定时器。
当在正常运行状态下NM-Timeout定时器超时,CanNM模块应向DET报告CANNM_E_NETWORK_TIMEOUT。
当网络被释放,且当前状态是正常运行状态,CanNM模块应进入Ready Sleep状态。
如果CanNmNodeDetectionEnabled设置为TRUE,且在正常运行状态下收到重复消息请求位,CanNM模块应进入重复消息状态。

Ready Sleep State(就绪睡眠状态)

Ready Sleep状态确保只要任何其他节点保持网络管理cluster唤醒,网络管理cluster中的任何节点等待转换到准备总线睡眠模式。
当从重复消息状态或正常运行状态进入Ready Sleep状态,CanNM模块停止发送网络管理报文。若使能了被动模式,不会发送NM PDUs,因此不要求任何动作。若被动模式被禁止,在某些情形下,必须在Ready Sleep状态下发送NM PDUs,以保证网络同步关闭。例如PN关闭消息的重新传输。
当在Ready Sleep状态下,NM-Timeout定时器超时,CanNM模块进入预休眠模式。
当在Ready Sleep状态下网络被请求,CanNM模块进入正常运行状态。
若CanNmNodeDetectionEnabled设置为TRUE,且在Ready Sleep状态下,收到重复消息请求位,CanNM模块进入重复消息状态。
若CanNmNodeDetectionEnabled设置为TRUE,且在Ready Sleep状态下调用函数CanNm_RepeatMessageRequest,CanNM模块进入重复消息状态,并设置重复消息位。

Prepare Bus Sleep Mode(预休眠模式)

预休眠模式的目的是保证所有节点在进入休眠模式前都有时间主动停止网络。在预休眠模式,总线活动平静下来(如,缓存的报文被发送,以清空Tx-Buffer),最终没有任何活动。
当进入预休眠模式,CanNM模块通过调用函数Nm_PrepareBusSleepMode通知上层。
如果CanNmStayInPbsEnabled被禁止,CanNM应在预休眠模式停留一段时间,这段时间是由配置参数CanNmWaitBusSleepTime决定。之后,离开预休眠模式,进入休眠模式。
如果启用了CanNmStayInPbsEnabled,CanNm将不会由于超时而离开预休眠模式,即CanNm将保持在预休眠模式,直到ECU断电或任何原因重启。
在预休眠模式,成功接收到网络管理PDU后,CanNM模块应进入网络模式;默认情况下,CanNM进入到网络模式的重复消息状态。
当在预休眠模式下网络被请求,CanNM模块应进入网络模式;默认情况下,CanNM进入到网络模式的重复消息状态。
当在预休眠模式下网络被请求,CanNM模块已进入网络模式,且CanNmImmediateRestartEnabled设置为TRUE, CanNM应发送网络管理PDU。cluster中的其他节点仍处于准备总线睡眠模式;在上述异常情况下,应避免转换到总线睡眠模式,并应尽快恢复总线通信。由于CanNm中网络管理PDU的传输偏移,在重复消息状态的第一个网络管理PDU的发送可能被显著延迟。为了避免网络重启的延迟,可以立即请求发送网络管理PDU。
如果CanNmImmediateRestartEnabled设置为TRUE,且使用唤醒线。如果所有节点在预休眠模式收到网络请求,可能会发生网络管理PDUs突增的情形。

Bus Sleep Mode(休眠模式)

休眠模式的目的是在节点不交换信息时节约能源消耗。通信控制器被切换到睡眠模式,相应的唤醒机制被激活,并且最终功耗被降低到总线睡眠模式中的适当水平。
如果CanNmStayInPbsEnabled被禁止,由配置参数CanNmTimeoutTime + CanNmWaitBusSleepTime决定的时间,网络管理 cluster中所有节点都保持一致的配置。网络管理cluster中的所有节点,在AUTOSAR NM算法的协调下,几乎在相同时刻执行进入休眠模式的动作。
在一个网络管理cluster中,所有结点的参数CanNmTimeoutTime和CanNmWaitBusSleepTime应保持一致。根据具体的实施方式,转换到总线休眠模式恰好或大约同时发生;此转换的时间抖动取决于以下因素:

  • 内部时钟精度
  • NM-task周期时间(如果任务与全局时间不同步)
  • 在Tx-queue中网络管理PDU等待的时间(若在发送请求后立即做出发送确认)

在最佳情况下,由CanNmTimeoutTime + CanNmWaitBusSleepTime决定的配置时间配置时,仅考虑晶振漂移的影响。
当进入总线休眠模式,除了初始化默认进入该状态,其余情况CanNM都应调用回调函数Nm_BusSleepMode通知上层。
当CanNM模块在总线休眠模式成功接收到网络管理PDU,CanNM模块通过回调函数Nm_NetworkStartIndication通知上层,且CanNM应向DET报告错误CANNM_E_NET_START_IND。
为了避免竞争条件和网络与模式管理之间状态的不一致,CanNM将不会自动执行从总线休眠模式到网络模式的切换。CanNM将只通知做唤醒决定的上层。总线睡眠模式下的网络管理PDU接收必须根据ECU关闭/启动过程的当前状态进行处理。
如果在总线休眠模式或总线预休眠模式中调用了CanNm_PassiveStartUp,CanNM模块应进入网络模式;默认情况下,CanNM应进入网络模式下的重复消息状态。
在总线预休眠模式和总线休眠模式时,认为网络已经被释放,除非明确要求总线通信。
当在总线休眠模式中,网络被请求,CanNM模块应进入网络模式。默认情况下,CanNM进入网络模式的重复消息子状态。

网络状态

网络状态(即“已请求”和“已释放”)是AUTOSAR CanNm状态机的两个附加状态,与状态机并行存在。网络状态表示软件组件是否需要在总线上通信(然后网络状态被‘Requested’);或者软件组件是否不在总线上通信(总线网络状态然后被‘Released’);注意,如果网络被释放,ECU可能仍然通信,因为一些其他ECU仍然请求网络。
调用函数CanNm_NetworkRequest请求网络,CanNM模块应将网络状态改变为Requested;
调用函数CanNm_NetworkRelease请求网络,CanNM模块应将网络状态改变为Released;

初始化

CanNM成功初始化完成后,CanNM设置网络管理状态为总线休眠模式。CanNM模块需要在CanIf初始化之后、任何其他网络管理服务被调用前进行初始化。初始化完成后,默认情况下,CanNM设置网络状态为Released。函数CanNM_Init接收通过配置指针传递的主动配置集为传参。
如果CanNmGlobalPnSupport设置为TRUE,且CanNM已经完成初始化,那么CanNM应停止NM报文发送超时定时器。
在初始化过程中,CanNM应 deactive bus load reduce。初始化完成后CanNM模块通过停止报文周期定时器,停止网络管理PDUs的发送。
如果CanNmPassiveModeEnabled设置为TRUE,不需要CanNM报文周期,因为节点不需要发送网络管理PDUs。
在初始化过程中,CanNM模块使用0xFF填充user data数据域,使用0x00填充CBV域。
若CanNmPnEnabled设置为TRUE,在初始化过程中,CanNM模块应使用0x00填充PNC 位向量数据域。
如果CanNmSynchronizedPncShutdownEnabled设置为TRUE,CanNm模块初始化后,应将PN关闭消息的传输视为无效(我理解这里指的是初始化后会发出一帧,但这初始化后的第一帧其实是无效的)。

执行

处理器架构

AUTOSAR CanNM算法独立于处理器,这意味着它不依赖于任何特定处理器硬件的支持,因此可用于AUTOSAR架构内的任何架构的处理器上。

时间参数

配置参数CanNmTimeoutTime决定AUTOSAR CanNM的NM超时时间;
配置参数CanNmRepeatMessageTime决定AUTOSAR CanNM的Repeat Message 时间;
配置参数CanNmWaitBusSleepTime决定AUTOSAR CanNM的等待总线休眠时间;
配置参数CanNmRemoteSleepIndTime决定AUTOSAR CanNM的远程休眠指示时间;

网络管理PDU结构

下图所示为长度为8字节,Source Node Identifier(SNI)位于第一个字节,Control Bit Vector(CBV)位于第二字节,user data和部分网络使能的网络管理PDU结构示例。User data位于系统字节(SNI+CBV)和PNC bit Vector之间:
AUTOSAR通信篇 - CAN网络通信(六:CanNm)_第2张图片
SNI的位置由CanNmPduNidPosition配置,位于Byte0、Byte1或不使用。设置CanNmPduNidPosition为off意味着NM PDU中没有SNI。因此对user data或PNC bit vector来说就多了一个字节可用空间;
CBV的位置由CanNmPduCbvPosition配置,位于Byte0、Byte1或不使用。设置CanNmPduCbvPosition为off意味着NM PDU中没有CBV。因此对user data来说就多了一个字节可用空间。
PNC bit vector的位置由相应NM通道的配置参数NmPncBitVectorOffset和NmPncBitVectorLength决定。PNC bit vector放置在NM PDU结构内的系统字节(SNI+CBV)后边;
NM PDU结构内剩余未被分配给系统字节或PNC bit vector的数据域就是可用的User Data数据域。
User Data的使用与否以及如果使用User Data其放置位置都是可配置的。如果使用User Data,那么它被放置到NM PDU内,且不与系统字节或PNC bit vector重叠。如果使能部分网络功能(CanNmPnEnabled设置为TRUE),且使用User Data,User Data范围位于系统字节和PNC位向量之间或PNC位向量和NM-PDU的末尾之间。User Data范围是由以下限制计算的:

  • 如果User Data范围位于系统字节和PNC位向量之间,则User Data范围的长度由PNC位向量偏移和系统字节长度之差决定;
  • 如果User Data范围位于PNC位向量和NM PDU结束之间,则User Data范围的长度由NM PDU长度和PNC 位向量最后一个字节位置(PNC bit offset+PNC bit vector length)之差决定;

如果部分网络功能未使能(CanNmPnEnabled设置为FALSE),但使用了User Data,User Data的范围是由NM PDU的长度和系统字节的长度只差决定。
网络管理PDU的长度由“全局”ECUC模块中的PduLength参数定义。
下图所示为CBV格式的描述:
AUTOSAR通信篇 - CAN网络通信(六:CanNm)_第3张图片

  • Bit0,重复消息请求位:
    • 0,未请求重复消息状态;
    • 1,请求重复消息状态;
  • Bit1,PN关闭请求位:
    • 0,NM报文不包含PN同步关闭请求;
    • 1,NM报文包含PN同步关闭请求;
  • Bit3,NM协调器休眠位:
    • 0,主协调器未请求开始同步关闭;
    • 1,主协调器请求开始同步关闭;
  • Bit4,主动唤醒位:
    • 0,节点不唤醒网络(被动唤醒);
    • 1,节点唤醒网络(主动唤醒)
  • Bit5,部分网络学习位:
    • 0,部分网络学习未请求;
    • 1,部分网络学习已请求;
  • Bit6,部分网络信息位:
    • 0,NM PDU不包含部分网络请求信息;
    • 1,NM PDU包含部分网络请求信息;
  • Bit2和Bit7保留用于以后扩展:
    • 0,Disable/Reserved for future usage;

CanNM模块设置SNI为配置的CanNmNodeId,除非CanNmPduNidPosition设置为off(未使用)。
如果CanNmActiveWakeupBitEnabled设置为TRUE,CanNM从总线休眠模式或预总线休眠模式中调用CanNm_NetworkRequest,跳转进入网络模式, CanNM应设置CBV中的ActiveWakeupBit位;CanNM离开网络模式,应清除CBV中的ActiveWakeupBit位。

通信调度

发送

CanNmPassiveModeEnabled参数配置影响到网络管理PDUs的发送能力,只有CanNmPassiveModeEnabled配置为FALSE时,节点才具备NM报文发送能力。
CanNM模块提供NM报文周期发送的模式,在该模式中CanNM周期地发送网络管理PDU。CanNM还可提供总线负载降低的周期发送模式,在此传输模式下,CanNm模块应根据特定算法发送网络管理PDU。周期发送模式应用于重复消息状态和正常运行状态,总线负载降低的周期发送模式只应用于正常运行模式。
通过参数CanNmImmediateTxConfEnabled配置立即发送确认机制,立即发送确认机制用于那些不想使用来自CanIf真实发送确认的情况。
如果总线的访问是完全通过离线系统设计工具控制的,则通知Nm成功传输的实际传输确认可视为多余。因为最大仲裁时间是已知的,所以在传输请求时间立即发起确认是可以接受的。此外,在这种系统中仅针对一个NM消息实现多余的实际传输确认将意味着关于整个CAN接口/驱动器层的执行时间的显著性能损失,使得计算的时间表效率低下。
如果重复消息状态不是通过CanNm_NetworkRequest进入或者CanNmImmediateNmTransmissions为0,再进入重复消息状态后,NM PDU的发送应该延迟CanNmMsgCycleOffset的配置时间。
当由于CanNm_NetworkRequest()(主动唤醒),节点从总线休眠模式或预总线休眠模式进入重复消息状态,且CanNmImmediateNmTransmissions大于0,NM报文应该以CanNmImmediateNmCycleTime为周期发送。第一帧NM PDU的发送应尽快进行,发出第一帧NM PDU后CanNmImmediateNmCycleTime装载到报文周期定时器。在该场景下,CanNmMsgCycleOffset不被使用。
如果从就绪睡眠状态进入正常运行状态,应立即开启发送NM PDUs。
如果CanNmPnHandleMultipleNetworkRequests配置为TRUE,CanNm_NetworkRequest应触发从网络模式到消息重复状态的切换。如果使能PDU的发送,将以CanNmImmediateNmCycleTime为周期发送NM PDUs。第一帧NM PDU的发送应尽快进行,发出第一帧NM PDU后CanNmImmediateNmCycleTime装载到报文周期定时器。在该场景下,CanNmMsgCycleOffset不被使用。
在以上场景下,CanNmImmediateNmTransmissions配置应大于0。
如果NM PDU以CanNmImmediateNmCycleTime为周期进行发送,CanNm应确保使用该定时的CanNmImmediateNmTransmissions传输(包括第一次立即传输)请求成功。如果向CanIf发送请求失败(返回E_NOT_OK),CanNm应在下一个主函数中重试发送请求。
快发(以CanNmImmediateNmCycleTime为周期进行的发送)之后,NM PDUs以CanNmMsgCycleTime为周期发送。当使用CanNmImmediateNmCycleTime为周期进行NM PDUs发送时,停止以CanNmMsgCycleTime为周期的发送。
如果网络管理PDUs的发送已开始,CanNm周期消息定时器超时,当CanNmSynchronizedPncShutdownEnabled设置为FALSE或设置为TRUE,并且PN关闭消息的发送未激活时,则CanNm模块应通过调用CanIf_Transmit发送网络管理PDU。
如果网络管理PDUs发送已经开始,CanNm周期消息定时器超时,当CanNmSynchronizedPncShutdownEnabled设置为TRUE,且PN关闭消息的发送激活,该NM PDU的传输应推迟到下一次CanNm_Mainfunction调用。

  • PN关闭消息的NM-PDU必须立即发送,因此必须延迟使用CanNmMsgCycleTime发送的循环NM-PDU的处理。在极少数情况下,这可能导致不止一个主功能周期时间的延迟。
  • NM定时必须考虑到使用CanNmMsgCycleTime传输的NM消息可能会延迟不仅一个主函数周期时间。因此,必须满足以下条件,以容许这些NM消息的多周期延迟: (NmPnResetTime – CanNmMsgCycleTime) > n * CanNmMainFunctionPeriod ,n为在NmPnResetTime到期之前可容忍的没有接收到NM报文的周期数。

如果CanNm已请求发送NM-PDU,CanNmSynchronizedPncShutdownEnabled被设置为TRUE,PN关闭消息发送被激活,CanNm_TxConfirmation调用的返回为E_NOT_OK或NM-PDU的发送请求没有被接受(CanIf_Transmit返回E_NOT_OK),那么CanNm模块应为此NM 通道再下一次主函数调用中重新发送该NM-PDU。
注意:

  • 如果PN关闭消息发送被激活,且 该NM-PDU的发送没被接受或没被底层确认,CanNm必须在主函数调用的上下文中执行NM-PDU的重新发送。重新传输请求应该覆盖错误情况:较低层不能传输Nm消息。
  • 底层指示的挂起的传输确认的依赖应该支持可靠的通信,例如,如果例如底层配置了队列,确保PN关闭消息在总线上传输或者避免过时的PN关闭消息的传输

接收

如果NM PDU被成功接收,CanIf调用回调函数CanNm_RxIndication。在CanNm_RxIndication被调用时,CanNm拷贝网络管理PDU的数据。

总线负载降低机制

网络管理PDUs的发送周期是由参数CanNmMsgCycleTime定义。在同一个网络管理集群中,所有网络管理节点,该参数必须保持一致。如果不采取任何措施,这将导致总线负载取决于网络管理集群成员数量。即使通过称为CanNmMsgCycleOffset的节点特定定时参数来防止总线负载突发,也需要一种机制来减少总线负载,而与网络管理集群的大小无关。为了达到如上要求,考虑以下两个方面:

  • 如果接收到网络管理PDU,则用节点特定的定时参数CanNmMsgReducedTime重新加载CanNm消息周期定时器。特定于节点的时间CanNmMsgReducedTime应大于CanNmMsgCycleTime的1/2且小于CanNmMsgCycleTime。
  • 如果网络管理PDU已被发送,则用网络管理集群特定的定时参数CanNmMsgCycleTime重载CanNm消息周期定时器。

通过以上操作,将会导致如下行为:
只有具有最小CanNmMsgReducedTime时间的两个节点在网络上传输交替的网络管理PDU。如果其中一个节点停止传输,下一个最小CanNmMsgReducedTime时间的节点将开始传输网络管理PDU。如果网络上只有一个节点需要总线通信,则每个CanNmMsgCycleTime发送一个网络管理PDU。该算法确保总线负载限制在每个CanNmMsgCycleTime最多两个网络管理PDU。
总线负载降低机制是通过参数CanNmBusLoadReductionEnabled静态配置的。
当从总线休眠模式、预总线休眠模式、正常运行或就绪休眠状态,进入重复消息状态,CanNm模块应禁用总线负载降低机制。
当从重复消息状态或就绪休眠状态进入正常运行状态,当CanNmBusLoadReductionEnabled配置为TRUE时,CanNm模块应激活总线负载降低机制。
如果总线负载减少机制被全局启用(CanNmBusLoadReductionEnabled为真),对于激活的特定网络,PDU传输能力被启用,并且为该网络调用函数CanNm_RxIndication,则CanNm模块应使用节点特定时间CanNmMsgReducedTime重新启动CanNm消息周期定时器。

其他功能

远程休眠指示检测

“远程睡眠指示”表示一种情况,其中处于正常操作状态的节点发现群集中的所有其他节点都准备好休眠(处于就绪睡眠状态)。处于正常操作状态的节点仍将保持总线唤醒。
远程休眠指示的检测功能是通过静态配置参数CanNmRemoteSleepIndEnabled配置的。
如果CanNm模块在正常运行状态,在CanNmRemoteSleepIndTime(配置参数)时间内没接收到网络管理PDUs,CanNm模块应调用回调函数Nm_RemoteSleepIndication。通过调用Nm_RemoteSleepIndication,CanNm通知Nm模块集群上所有节点都已准备好休眠(因此称为远程休眠指示)。
如果先前已经检测到远程睡眠指示,并且如果在正常操作状态或就绪睡眠状态下再次接收到网络管理PDU,则模块CanNm应调用回调函数Nm_RemoteSleepCancellation。
如果先前已检测到远程睡眠指示,且从正常运行状态或就绪睡眠状态进入重复消息状态,模块CanNm应调用回调函数Nm_RemoteSleepCancellation。
通过调用Nm_RemoteSleepCancellation,CanNm通知模块Nm集群中的一些节点不再准备休眠(所谓的“远程休眠取消”)。
当调用服务CanNm _ CheckRemoteSleepIndication且状态为总线休眠模式、预总线休眠模式或重复消息状态时,CanNm模块不应执行该服务,并应返回E_NOT_OK。

用户数据

NM用户数据的支持是通过静态配置参数CanNmUserDataEnabled配置的。
当调用CanNm_SetUserData时,CanNm模块应设置总线上下一个传输的网络管理PDU的网络管理用户数据。
当调用CanNm_GetUserData时,CanNm模块应返回最近收到的网络管理PDU的网络管理用户数据。
如果配置了用户数据,它肯定会在重复消息状态下发送。在正常操作状态下,是否发送用户数据取决于总线负载减少的配置。在就绪睡眠状态下,不会发送用户数据。

COM用户数据

除了使用CanNm APIs来设置和获取用户数据,CanNm还可以使用COM来检索其用户数据。
如果启用了CanNmComUserDataSupport,则API CanNm_SetUserData应不可用。
如果使能CanNmComUserDataSupport,且在CanIf中,NM-PDU未配置为触发传输(CanIfTxPduTriggerTransmit配置为FALSE),CanNm应通过调用PduR_CanNmTriggerTransmit从引用的Nm I-PDU中收集NM用户数据,并在每次请求传输相应的NM PDU之前将用户数据与其他NM字节相结合。当配置为触发发送时,在传输请求时不需要数据,只需要长度。数据将会在CanNm_TriggerTransmit中收集。
如果CanNmComUserDataSupport使能,PduR_CanNmTriggerTransmit返回E_NOT_OK, NM将使用NmUserData的上一个传输值。
通过不停止用于NmUserData传输的COM中的IPdu,可以避免过时NM数据的传输。
如果使能了CanNmComUserDataSupport,调用了CanNm_TxConfirmation时,CanNm应通过调用PduR_CanNmTxConfirmation将传输确认结果转发给PduR。
如果使能了CanNmComUserDataSupport,可用用户数据字节数与参考I-PDU的长度不匹配,则应在生成时报告错误。

被动模式

处于被动模式的节点只接收网络管理PDUs,但不发送任何网络管理PDUs。
被动模式是通过参数CanNmPassiveModeEnabled静态配置的。在一个ECU内,所有NM网络,必须全部使能被动模式或全部不不使能被动模式。

网络管理PDU Rx提示

只有当配置参数CanNmPduRxIndicationEnabled设置为TRUE时,调用回调函数CanNm_RxIndication时,CanNm模块调用Nm模块的回调函数Nm_PduRxIndication。

状态改变提醒

如果启用了回调Nm_StateChangeNotification(配置参数CanNmStateChangeIndEnabled配置为TRUE),则应通过调用Nm_StateChangeNotification将AUTOSAR CanNm状态的所有更改通知给上层。

通信控制

通信控制是静态配置的,由配置参数CanNmComControlEnabled决定。
如果服务CanNm_DisableCommunication被调用,CanNm应禁用网络管理PDU的发送。
此行为也应适用于重复消息状态,但通信控制功能不影响重复消息状态的持续时间。
当网络管理PDU传输能力被禁用时,CanNm模块应停止CanNm消息周期定时器,以停止网络管理PDU的传输。
当网络管理PDU传输能力被禁用时,CanNm模块应停止Nm超时定时器。
当网络管理PDU传输能力被禁用时,CanNm模块应停止远程睡眠指示检测。
当网络管理PDU传输能力使能时,NM PDUs的传输最晚在下一个NM主功能内开始。
当网络管理PDU传输能力启用时,CanNm模块应重启Nm超时定时器。
如果CanNmRemoteSleepIndEnabled配置为TRUE,且网络管理PDU传输能力已启用,则CanNm模块应重新启动远程睡眠指示检测。
如果网络管理PDU传输能力被禁用,服务CanNm _ RequestBusSynchronization应返回E_NOT_OK。

协调器同步支持

当有多个协调器连接到同一总线时,CBV中的一个特殊位NmCoordinatorSleepReady用于指示主协调器启动关闭流程的请求。
当CanNmCoordinatorSyncSupport设置为TRUE,第一次接收到NmCoordinatorSleepReady为1的NM PDU,在CanNm调用Nm_CoordReadyToSleepIndication通知Nm之前, CanNm已经进入网络模式或调用了Nm_CoordReadyToSleepCancellation。
如果CanNmCoordinatorSyncSupport配置为TRUE,且CanNm调用了Nm_CoordReadyToSleepIndication,并且仍然在网络模式,在第一次接收到NmCoordinatorSleepReady为0的NM PDU时,CanNm应通知Nm。
如果CanNmCoordinatorSyncSupport配置为TRUE,且API CanNm_SetSleepReadyBit已被调用,CanNm应设置“NM Coordinator Sleep ready Bit”到传递值中,并出发单个网络管理PDU。

车辆唤醒

Car Wakeup bit在NM-PDU中的位置是由配置参数CanNmCarWakeUpBytePosition和CanNmCarWakeUpBitPosition决定。

Rx路径

如果任一接收到的NM-PDU,其中车辆唤醒位为1,CanNmCarWakeUpRxEnabled配置为TRUE,CanNmCarWakeUpFilterEnabled配置为FALSE,CanNm应调用Nm_CarWakeUpIndication执行标准的接收之时处理。
如果在Nm_CarWakeUpIndication上下文调用了CanNm_GetPduData,且如果CannNmNodeDetectionEnabled 或CanNmUserDataEnabled 或 CanNmNodeIdEnabled配置为TRUE,那么CanNm应返回触发调用Nm_CarWakeUpIndication的PDU的PDU数据。这是使ECU能够识别汽车唤醒请求发送者的详细信息所必需的。
如果CanNmCarWakeUpFilterEnabled设置为TRUE,任意接收到的NM-PDU中车辆唤醒位为1,且CanNmCarWakeUpRxEnabled配置为TRUE,且接收到的NM-PDU的Node ID等于CanNmCarWakeUpFilterNodeId,那么CanNm模块应调用Nm_CarWakeUpIndication,执行标准的Rx指示处理。
车辆唤醒过滤器对实现只考虑中央网关的车辆唤醒的子网关是必要的,以避免误唤醒。

Tx路径

车辆唤醒位的传输应由应用程序使用CanNm模块提供的NM用户数据机制进行处理。

部分网络

NM PDUs的Rx处理

如果CanNmPnEnabled配置为FALSE,CanNm不从进一步的Rx指示处理中丢弃NM PDUs,但应禁用部分网络扩展。
如果CanNmPnEnabled配置为TRUE,在接收到的NM-PDU中PNI为0,且CanNmAllNmMessagesKeepAwake配置为TRUE,CanNm模块不应从进一步的Rx指示处理中丢弃NM PDUs,但忽略部分网络的扩展。这是使网关在任何类型的NM-PDU上保持唤醒所必需的。
如果CanNmPnEnabled配置为TRUE,在接收到的NM-PDU中PNI为0,且CanNmAllNmMessagesKeepAwake配置为FASLE,CanNm模块忽略接收到的NM PDU。
如果CanNmPnEnabled配置为TRUE,在接收到的NM-PDU中PNI为1,且以下前置条件中有一个是满足的:
• CanNmSynchronizedPncShutdownEnabled配置为FALSE;
• CanNmSynchronizedPncShutdownEnabled配置为TRUE,且PNSR位设置为0;
然后,CanNm模块应根据部分网络配置(相应Nm通道的NmPncBitVectorOffset和NmPncBitVectorLength)从接收的NM-PDU中提取PNC位向量,并通过调用Nm_PncBitVectorRxIndication转发PNC位向量。仅当CanNmSynchronizedPncShutdownEnabled设置为TRUE时,PNSR位才生效。
如果CanNmPnEnabled设置为TRUE,并且调用了Nm_PncBitVectorRxIndication,则接收到的NM PDU应仅在以下条件下进行进一步处理:
• CanNmAllNmMessagesKeepAwake设置为TRUE,或;
• CanNm_ConfirmPnAvailability还未被调用,或;
• RelevantPncRequestDetectedPtr的输出值设置为TRUE
CanNmAllNmMessagesKeepAwake是使网关在任何类型的NM-PDU上保持唤醒所必需的。
如果CanSM没有确认PN可用性,所有PNC请求都被认为是相关的,因此NM在接收到NM-PDU时重新启动Nm超时定时器。这是允许故障的部分网络依赖硬件(例如支持PN的CAN收发器)与其余网络同步关闭所必需的。
如果不是所有的消息都应该保持ECU唤醒,并且PN可用性被确认,但是没有检测到相关的PNC位向量,则NM PDU不被考虑用于进一步处理。
例如:
• CanNmPduCbvPosition = 0
• CanNmPduNidPosition = 1
• NmPncBitVectorOffset = 4
• NmPncBitVectorLength = 4
• Calculated length of user data range = 2
NM PDU的Byte2和Byte3包含的是用户数据,Byte4到Byte7包含的是PNC Bit Vector:
在这里插入图片描述
在本例中,定义了4字节的NmPnFilterMaskBytes,根据部分网络设计使用PN滤波器掩码的值,如:
• NmPnFilterMaskByteIndex = 0 with NmPnFilterMaskByteValue = 0x01
• NmPnFilterMaskByteIndex = 1 with NmPnFilterMaskByteValue = 0x97
• NmPnFilterMaskByteIndex = 2 with NmPnFilterMaskByteValue = 0x00
• NmPnFilterMaskByteIndex = 3 with NmPnFilterMaskByteValue = 0x00

PNC位向量的偏移量来自Nm模块(NmPncBitVectorOffset)。PNC位向量长度由每个NM通道的Nm模块(NmPncBitVectorLength)得出。PN过滤器掩码(NmPnFilterMaskByteIndex和NmPnFilterMaskByteValue)位于Nm模块中并在其中使用。
如果CanNmSynchronizedPncShutdownEnabled设置为TRUE,当接收到一个NM PDU,其中PNI位和PNSR位都为1,且相应的通过CanNmComMNetworkHandleRef配置的ComM通道设置为主动协调(ComMPncGatewayType配置为COMM_GATEWAY_TYPE_ACTIVE),CanNm模块应报告该运行时错误CANNM_E_INVALID_PN_SYNC_SHUTDOWN_REQUEST到DET,忽略PNSR位,把该NM PDU当作通常NM PDU处理。
如果ECU的NM出现故障,处理应支持PN关于同步关闭处理的鲁棒性。
如果CanNmSynchronizedPncShutdownEnabled配置为TRUE,在接收到的NM-PDU中PNI位为1,PNSR位为1,CanNm模块应根据部分网络配置(相应NM通道的NmPncBitVectorOffset和NmPncBitVectorLength)从接收到的NM-PDU中提取PNC位向量,并通过调用Nm_ForwardSynchronizedPncShutdown转发PNC位向量。
只有在请求同步PNC关断时,PNSR位才能置1。同步的PNC关断应该为整个PN拓扑来处理。因此,假设要么所有协调器都启用了同步PNC关闭,要么所有协调器都禁用了同步PNC关闭。两者的混合将导致PNC非同步关闭,这是必须要避免的。

NM PDUs的Tx处理

如果CanNmPnEnabled配置为TRUE,CanNm模块应设置发送的PNI位为1。使用部分网络功能时,必须使用CBV。
如果CanNmPnEnabled为FASLE,CanNm设置发送的PNI位为0。
如果CanNmGlobalPnSupport设置为TRUE,则每次通过调用Nm_PncBitVectorTxIndication从Nm模块获取PNC位向量时,CanNm模块应存储每个NM通道的最新PNC位向量。
如果CanNmGlobalPnSupport设置为TRUE,一个NM-PDU已经被发送到一个NM通道,并且CanNm_TxConfirmation调用返回E_OK,然后,CanNm应通过调用Nm_PncBitVectorTxConfirmation将确认转发给Nm,并为该Nm通道存储PNC位向量,结果设置为E_OK。
对Nm的确认总是被执行,与NM-PDU发送的原因无关(例如,以CanNmMsgCycleTime为周期发送的NM-PDU或作为PN关闭消息发送的NM-PDU)。
如果CanNmGlobalPnSupport设置为TRUE,一个NM-PDU已经被发送到一个NM通道,且调用CanNm_TxConfirmation返回E_NOT_OK或该NM-PDU的发送请求未被接受(CanIf_Transmit 返回E_NOT_OK), CanNm应通过调用Nm_PncBitVectorTxConfirmation将确认转发给Nm,并为该Nm通道存储PNC位向量,结果设置为E_NOT_OK。
Nm模块使用E_NOT_OK调用Nm_PncBitVectorTxConfirmation来执行同步PNC关闭处理(如果配置了PNC关闭处理)。
如果CanNmPnEnabled为TRUE,且必须发送NM-PDU(以CanNmMsgCycleTime为周期发送的NM-PDU或PN关闭消息),则在请求发送NM-PDU之前,CanNm模块应通过调用Nm_PncBitVectorTxIndication获取PNC位向量,并将PNC位向量(满足相应NM通道的NmPncBitVectorOffset和NmPncBitVectorLength)复制到NM-PDU。
注意:

  • 如果配置使用用户数据,NM-PDU的发送必须考虑用户数据;
  • PNC位向量总是在发送请求之前提取,与CanIfTxPduTriggerTransmit设置为TRUE或FALSE无关。这将确保在发送请求时重启Nm中受影响的PNC 的PN重置定时器;

如果CanNmSynchronizedPncShutdownEnabled设置为TRUE,该NM通道激活PN关闭消息的发送,且该NM通道的前一个调用发送PN关闭消息的NM-PDU的传输确认未完成,则CanNm模块应在下一个主函数中,通过调用CanIf_Transmit,请求发送PN关闭消息的NM-PDU。
PN关闭消息的发送优先级更高,由于同步PN关闭消息,周期发送的NM报文在同个主函数中不会被发送。只要有PNC关闭请求存在挂起,周期NM报文就会被推迟到下一个主函数发送。

处理内部请求的部分网络集群

所有内部PNC请求由ComM维护。ComM将每个通道的内部PNC请求聚合作为PNC位向量,转发给NmIf。这个PNC位向量携带了被称为“Internal Request Array”(IRA)的信息。每次发送NM PDU时,CanNm必须从NmIf提取最近的IRA。NmIf提供给CanNm模块IRA信息,并更新PNC复位定时器(每次相关PNC被发送,PNC复位定时器就重启一次)
对于所有CanNmPnEnabled配置为TRUE的NM通道,CanNm将调用Nm_PncBitVectorTxIndication(, < buffer to store the unfiltered PNC bit vector of aggregated internal PNC requests>)去指示发送和提取当前内部PNC请求作为PNC位向量,其长度满足配置参数NmPncBitVectorLength的要求。CanNm将会将接收到的内部PNC请求拷贝到NM-PDU的PNC位向量字节。

通过CanNm_NetworkRequest实现NM PDUs的自发传输

如果CanNm_NetworkRequest被调用,CanNmPnHandleMultipleNetworkRequests配置为TRUE,且CanNm在就绪睡眠状态、正常运行状态或消息重复状态,CanNm应切换到或重启消息重复状态。
如果CanNmPnHandleMultipleNetworkRequests配置为TRUE,必须使能CanNm的“立即传输”功能。
如果PNC请求位改变,PNC控制模块(如,ComM)负责调用CanNm_NetworkRequest。

发送错误处理

根据配置,CanNm将会评估确认函数,判断网络管理PDU已经被成功发送或者没有被成功发送。CanNm将会监测这些确认,并当确认函数返回E_NOT_OK或者在指定的时间内没接收到确认函数的返回时通知上层。部分网络功能必须要超时监测,确保当网络上的所有ECU使用部分网络收发器时,第一条消息得到确认。否则,通知CanSM并重启CAN驱动。
如果CanNmPassiveModeEnabled配置为TRUE或者CanNmImmediateTxConfEnabled设置为TRUE,CanNm不进行发送错误处理,省略相关处理要求。
发送错误处理只在节点允许发送网络管理PDU且有来自于CanIf的真实确认才有意义。
如果CanNmGlobalPnSupport设置为TRUE,且CanNmMsgTimeoutTime有定义,CanNm请求了NM PDU发送,CanNm应启动NM报文Tx超时定时器,超时周期为CanNmMsgTimeoutTime。
如果CanNmGlobalPnSupport设置为TRUE,且CanNmMsgTimeoutTime有定义,CanNm_TxConfirmation被调用后,CanNm停止NM报文Tx超时定时器。
如果CanNm_TxConfirmation返回结果为E_NOT_OK,或者CanNmGlobalPnSupport设置为TRUE,且NM报文Tx超时定时器发生超时,CanNm应调用函数Nm_TxTimeoutException。

CanNm 算法状态机UML图

下图所示为一个UML状态机图。模式改变的切换标准为绿色,错误处理相关的切换标注为红色,可选的节点检测/动态PNC-to-channel-mapping相关的切换标注为蓝色。
AUTOSAR通信篇 - CAN网络通信(六:CanNm)_第4张图片

时序图

CanNm发送

AUTOSAR通信篇 - CAN网络通信(六:CanNm)_第5张图片

CanNm接收

AUTOSAR通信篇 - CAN网络通信(六:CanNm)_第6张图片

CanNm 协调

AUTOSAR通信篇 - CAN网络通信(六:CanNm)_第7张图片

你可能感兴趣的:(AUTOSAR软件开发理论,AUTOSAR,CanNm)