OSEK NM 2.53 之学习报告
1 概述
在报告中我首先说明一下通过学习 OSEK NM 过后,我现在对 OSEK NM 的认识;然后
我会列举在学习的过程中我所遇到的和提出的问题,有的问题在后续学习过程中已经解决,
有的还在继续探索中。当然我很希望您在看到这篇报告后,对于我所罗列的问题,对于我作
答的问题,希望您能帮我看看回答的是否正确,对于我没有解决的问题,希望您能给我点指
示或者解答,让我能尽快解决对 OSEK NM 的疑问。同时也很谢谢您让我做学习报告,督
促我学习,并能让我在学习之后能对自己学习的知识进行一次整理,很谢谢您。
2 OSEK NM
网络管理具体的功能有保证网络同步进入睡眠状态、网络启动后确定网络配置、运行过
程中监控网络配置、提供网络状态信息、网络故障的处理,而网络管理的重要任务就是确保
ECU 之间交流的安全和可靠。
OSEK NM 提供了两种可选的监控机制,直接网络管理和间接网络管理。直接 NM 通
过令牌环实现网络状态的监控,通过发送网络管理报文每一个节点被其它节点监控。间接网
络管理是通过监控应用报文监控间接监控节点与网络的状态,网络中的每个节点必须周期性
发送报文。
3 直接网络管理
3.1 令牌环
在环中每个节点都有一个后继节点,按照节点地址的大小,从小地址节点向大地址节点
依次传送令牌(Ring 报文),最小地址节点是最大地址节点的后继节点,即如果没有地址再
大的节点,令牌将传递至地址最小的节点。
在令牌传递的过程中,令牌会被网络中所有节点接收,但只有地址匹配的节点(即后继
节点)会得到令牌。
3.2 网络管理协议数据单元
任何的网络管理报文都应该包含网络管理协议数据单元(NMPDU),NMPDU 包括源地
址、目标地址、操作码、特定应用数据(可选的)。其中操作码中会有 Alive、Ring、LimpHome、
Sleep Indication、Sleep Acknowledge 的标识。通过操作码中的标识位状态来确定当前报文是
什么报文以及所处的睡眠状态。
为了标识网络管理报文与其他报文的不同(或者说为了识别出网络管理报文),使用了
IdBase 和 WindowMask,硬件接收报文以后,进行 IF(Id_of_Frame&WindowMask==IdBase)
判断,为真,则该报文是网络管理报文。具体的逻辑过程可以参考附录图 1,该图是基于
CAN 报文的。
图 1 :基于 CAN 报文的 NM 报文的发送和接收过程
3.3 节点的状态
节点有三个状态:NMOff、NMOn、NMShutDown(执行一系列清除工作,清除定时器、
标志位等)。
两个核心服务(应用层):StartNM( ),StopNM( )。
3.3.1 NMOn
3.3.1.1 NMOn 子状态
NMOn 存在两组并行状态,一组是 NMInit、NMAwake、NMBusSleep;另一组是
NMActive、NMPassive。
对五中状态的解释:
NMInit——完成初始化(主要是硬件初始化),此状态短暂
NMAwake——一般情况,节点长期保持的状态,网络管理通信正常进行
NMBusSleep——睡眠状态,网络管理通信停止
NMActive——节点参与网络管理
NMPassive——节点不参与网络管理,但仍会监视网络活动
其中 NMInit 和 NMActive 是 NMOn 的初始化状态。
3.3.1.2 NMOn 子状态间的转换
NMInit 到 NMAwake 的转化是在初始化完毕,自然完成。
当节点睡眠条件满足(即所有节点都不请求通信的时候)NMAwake 转化到 NMBusSleep。
当接收到网络管理报文时,NMBusSleep 转化到 NMInit。
每个节点都有自己的 silent 标志,当应用程序调用 SilentNM()时,设置 silent 标志位,
NMActive 转化到 NMPassive;应用程序调用 TalkNM()时,清除 silent 标志位,NMPassive
转化到 NMActive。
3.3.1.3 NMAwake 子状态
其子状态包括 NMReset、NMNormal、NMLimpHome 三个状态:
NMReset:软件初始化,发送 Alive 报文
NMNormal:周期性发送/接收 Ring 报文,检测节点状态和网络配置的变化,向应
用程序提交 Normal 配置和 LimpHome 配置
NMLimpHome:此状态为跛行状态,此状态下节点不能正常发送/接收网络管理报
文,同时节点会周期性的发送 LimpHome 报文
各子状态间的转换:
NMReset→NMNormal:NM 报文能正常发送和接收
NMNormal → NMReset:Ring 报文接收超时
NMReset → NMLimpHome:NM 报文多次不能正常发送和接收
NMLimpHome → NMReset:LimpHome 报文发送成功且收到其他节点 NM 报文
NMNormal → NMLimpHome:NM 报文多次发送失败
3.3.2 节点各状态间的转换图
节点各状态间的转换图如图 2:
图 2:节点各状态间的转换图
图 3:节点各状态间的转换图细节
3.4 NM 报文
在创建逻辑环时,直接 NM 会传输两种网络管理报文,Alive 报文和 Ring 报文。Alive
报文是在一个新节点要加入逻辑环时发送,Ring 报文是各节点向后继节点传递“令牌”的报
文。还有一种 LimpHome 报文,这是在节点不能正常收发报文时,节点进入跛行 LimpHome
状态后节点就会周期性发送此报文。
3.4.1 Alive 报文
在 ECU 初始化完成后以及节点发现自己被跳过时发送 Alive 报文。
其他节点接收到 Alive 报文后,会处理报文中携带的地址信息,来更新网络配置,标识
出处于在线状态的节点,并判断在逻辑环中自己的后继节点。
3.4.2 Ring 报文
当节点接收到 Ring 报文后,更新网络配置,标识处于在线状态的节点,判断逻辑环中
的后继节点。如果目标地址是本地节点,则经过 TTyp 时间后向后继节点发送 Ring 报文,
发送 Ring 报文后在数据链路层返回发送确认之前,接收到一个 Ring 报文,节点将忽略该报
文;如果目标地址不是本地节点,则判断自己是否被跳过,若被跳过,则发送 Alive 报文表
明自己的存在。若未被跳过,则重置 Tmax 定时器,等待接收下一条报文。
3.4.3 LimpHome 报文
处于 LimpHome 模式下的 ECU 周期发送 LimpHome 报文,LimpHome 报文的周期是
TError。接收到 LimpHome 报文后,接收节点更新网络配置,标识处于 LimpHome 状态的节
点。
其中是否进入 LimpHome 状态,是通过 NMtxcount、NMrxcount 这两个 NM 错误计数器
来判断的;进入 LimpHome 状态判断条件为 NMtxcount>tx_limit 或 NMrxcount>rx_limit,其
中计数器阈值一般推荐为 tx_limit=8,rx_limit=4。
两个 NM 错误计数器的具体计数过程
NMtxcount、NMrxcount 这两个 NM 错误计数器的具体计数过程,可以在图 3 中看出计数的
过程。
在 Reset 初始化时将 NMtxcount、NMrxcount 计数器清零,在 Reset 中将 NMrxcount 计
数器加 1,在发送 Alive 报文后,将 NMtxcount 计数器加 1;正常进入 Normal 后,接收到任
何 NM 报文后,对 NMrxcount 计数器清零,在传输要发送的报文时,将将 NMtxcount 计数
器加 1(注意在数据链路层拒绝发送报文时,重发报文时对 NMtxcount 计数器无影响),在
成功传输报文后,对 NMtxcount 计数器清零。
由图 3 理解的如果要使 NMrxcount 计数器达到阈值进入 LimpHome 状态,则再进入
Normal 后总 Tmax 时间内没有接收到报文,而后重新进入 NMReset 状态,重复 Reset 中将
NMrxcount 计数器加 1,在发送 Alive 报文后,将 NMtxcount 计数器加 1 过程;此过程一直
重复,直至 NMrxcount 计数器达到阈值后进入 LimpHome 状态。(不知道我这样的理解的过
程对不对,望给予指导)
3.5 睡眠
3.5.1 进入睡眠的过程
调用 GotoMode(BusSleep),在下一次 Ring 报文中 Sleep.Ind 设置为 TRUE;在 LimpHome
模式,下一次 LimpHome 报文中 Sleep.Ind 设置为 TRUE,当 Ring 报文已经在逻辑环中完成
传输,并且所有网络管理报文的 Sleep.Ind 均被设置为 TRUE 时,发出 Ring 报文的第一个节
点将 Sleep.Ack 置为 TRUE,之后所有节点进入等待睡眠状态。
3.5.2 等待睡眠状态
停止传输 Ring 报文,启动 TWaitBusSleep 定时器,当 TWaitBusSleep 定时器到时,停止
所有总线上的传输,并切换到 NMBusSleep 状态;等待睡眠过程中,它继续监听网络上的报
文,任何网络管理报文被接收时,若其 Sleep.Ind 为 FALSE,那么节点进入 NMReset 状态重
新启动。
3.5.3 节点进入睡眠状态的过程图
在图 4 中展示了正常节点要进入睡眠状态的整个过程。
对于 LimpHome 状态的节点,进入的睡眠过程见图 5。
图 4:Normal 状态下进入睡眠状态过程
图 5:Normal 状态下进入睡眠状态过程
3.6 网络管理报文——时间参数
表 1 中列出了网络管理中相关的时间参数
表 1 时间参数
描述
重传一个 Alive/Ring 报文之前等待的时间
两个 Limp Home 报文传输之间的时间
定时器
TTyp
TMax
TTx
TError
两个 Ring 报文传输之间典型的时间
两个 Ring 报文传输之间最大的时间
典型值/ms 范围
100 全局
260 全局
25
局部
1000 全局
1500 全局
备注:TTx 的重传的情况,我理解的就是当总线忙,发送请求被 DLL 拒绝的时候,会
TWaitBusSleep 总线睡眠请求被确认到总线进入睡眠模式之间的时间
设置 TTx 的定时器,等定时到后进行报文重传。
3.7 细节说明
3.7.1 建环过程说明
当所有节点被唤醒后,所有节点都会发送 Alive 报文,Alive 报文的源地址和目标地址
都是节点自己的地址,首先发送 Alive 消息成功的节点将成为逻辑环中的第一个节点,若有
多个节点同时发送 Alive 报文,会通过总线竞争出来一个。发送完 Alive 报文后,发送 Ring
报文,进行建环。
3.7.2 新节点加入稳定的令牌环
逻辑环稳定后,当有新节点加入时,首先初始化配置表,将自己的逻辑后继节点设置为
自己,同时向总线网络上发送一条 Alive 报文。当网络上其他节点收到此 Alive 报文,就认
为此节点为在线状态,确定新节点是否为自己的逻辑后继节点,并立即更新配置表;新节点
在接收到网络上的 NM 消息后,根据收到的消息来更新自己的配置表。在新节点发送 Alive
消息的同时,NM 系统启动 TTpy 定时器,该定时器到时,向后继节点发送 Ring 报文,逐步
构建成逻辑环。
3.7.3 Tmax 未收到报文
如果某节点离线,Tmax 时间到后在线节点没有收到消息,本节点判定自身离线或有其
他节点离线,本节点重新初始化。此时,节点会向总线发送 Alive 消息,重新建立逻辑环并
将离线节点排除在外。
其中 2.7.2 和 2.7.3 中的情况可以通过图 6 来说明。