OSEK-NM直接网络管理一:概念部分
前言:
之前有处理过OSEK直接网络管理的项目,但是想要系统的把它阐述表达出来时,还是做不到。
准备从概念和行为两个部分对OSEK直接网络管理做一个总结,这样才能加深自己对OSEK直接网络管理的理解。其中概念部分包括OSEK直接网络管理的功能、PDU数据协议单元、逻辑环、OSEK直接网络管理的状态等内容;行为部分则阐述OSEK直接管理如何建立逻辑环及其实现算法、OSEK直接网络管理如何协调总线上的节点同步进入休眠及其实现算法、OSEK直接网络管理的状态调转机制(超时机制)及其实现算法。
本部分内容是OSEK直接网络管理的概念部分。
1:背景
随着整车网络中由不同制造商提供的电控单元日益增长,一个旨在避免开发过充中不必要的变体和节省开发时间的基础、非竞争机制的基础结构标准就尤为必要了。
网络管理的首要任务是确保通信的安全性和可靠性。
2:功能
网络管理为了实现确保通信安全性和可靠性的首要任务,提供如下的功能:
- 初始化ECU资源(网络接口)
- 启动网络
- 提供网络配置功能
- 管理不同的节点监控机制
- 检测、通知和处理网络节点的工作状态
- 读取设置网络和节点指定的参数
- 协调全局的工作模式(协调网络节点同步进入休眠功能)
- 支持诊断
3:OSEK直接网络管理的硬件基础
直接网络管理要求ECU的电源由KL30(永久电源)提供,K15作为ECU的唤醒信号或者CAN网络的唤醒信号。
直接网络管理:ECU在KL15为 OFF状态 时可进行 CAN 通信,并遵循 OSEK 直接网络管理进行同步休眠和唤醒;
4:OSEK直接网络管理的功能
- 协调各ECU同时进入网络睡眠状态
- 检测和监控网络的配置
- 提供系统的状态
- 网络BUSOFF处理
5:NM协议数据单元(PDU)
- Address Field:NM 地址场
Source Id:源地址,CAN 报文标识符场,可分解为基地址和 ECU 地址;
Dest. Id:目标地址,CAN 报文数据场第 1 个字节 Byte(0)。 - Control Field:NM 控制场
Opcode:操作码,CAN 报文数据场第 2 个字节 Byte(1)。 - Data Field:NM 数据场
Data:特定应用数据(可选),CAN 数据场第 3-8 个字节 Byte(2)-Byte(7)。
5.1: 地址
5.2 操作码
网络管理报文类型分为以下3种类型:
- Alive报文
ECU 上电或唤醒后,如果需要请求网络通信则发送 Alive 报文声明自身在线并建立逻辑环;
在逻辑环运行过程中,若 ECU 检测到自己被跳过,则发送 Alive 报文以重新加入并建立逻辑环。 - Ring报文
正常运行状态,所有 ECU 依次发送 Ring 报文形成逻辑环通信。 - LimpHome报文
若节点连续发生发送或接收故障则进入 NMLimphome 状态,发送LimpHome 报文。
5.3:数据
数据字节是由 NM 报文数据场第 3-8 个字节 Byte(2)-Byte(7)组成,用以存储特殊的应用数据。系统配置信息、总线故障信息、总线唤醒原因、保持唤醒原因、逻辑环稳定状态等信息可以在数据字节中存储。
本平台不使用数据字节,必须将 NM 报文 3-8 字节置为默认值 0x00。
6:逻辑环
逻辑环,通俗的来说,就是由若干个节点组成的环状结构,每个节点都有一个逻辑上的后继节点,而最后一个节点的后继节点又是第一个节点,这样就组成了一个环状的结构,有点类似于数据结构里面的循环链表那种结构。
OSEK直接网络管理通过发送和接收两种类型的消息来建立逻辑环:Alive message和Ring message。其中,Alive message是一个节点要加入逻辑环时要发送的消息,Ring message是网络正常工作时的环消息,是从一个节点传递给下一个节点,依次在逻辑环中传递,以表示网络中的节点正常工作。当某一节点功能不正常时,就会周期性的向网络中发送LimpHome message。
7:OSEK直接网络管理的状态
OSEK直接网络管理分为如下三种状态,在这三种状态下又分为各种子状态。
- NMOFF
- NMON
- NMInit
- NMAwake
- NMReset
- NMNormal
- NMLimpHome
- NMBusSleep
- NMActive
- NMPassive
- NMShutDown
7.1:OSEK直接网络管理主状态
ECU上电以后处于NMOff状态,通过任务调用StartNM,启动NM,这时候NM进入NMON状态开始运行,直到调用StopNM接口,状态又会跳到NMShutDown,进而进入NMOFF状态。如下图所示:
7.2:NMON子状态
在NMON状态下,首先是进行初始化,进行一些网络配置,然后在有通信请求的时候处于NMAwake的状态,没有通信请求的时候就进入NMBusSleep的状态。
当应用程序不再需要 CAN 通信,通过“GotoMode(BusSleep)”服务进入NMBusSleep状态去释放网络,同时,在下次发送 NM 报文时会将其睡眠指示位置位,即 Sleep.Ind=1,此时 ECU睡眠条件满足。
如果应用程序需要 CAN 通信,通过调用“GotoMode(Awake)”服务来请求网络重新进入NMAwake状态,如果此时 ECU 不在网络激活状态,该 ECU 将向总线发送 Alive 报文。睡眠指示位将被复位,即 Sleep.Ind=0,此时 ECU 睡眠条件不满足。
(注:NMActive(主动状态)和NMPassive(被动状态)为这NMON状态下三种状态的内部状态,由于NMBusSleep和NMInit状态下本身不存在通信,我们这里将这两种状态理解为NMAwake状态下的内部状态。
其中NMActive理解为可以收发报文的主动状态,NMPassive理解为只可以监听报文的被动状态。)
如下图所示:
7.3:NMAwake子状态
在NMAwake状态中,首先进入NMReset状态,没有错误跳入NMNormal状态,在NMNormal下逻辑环上就开始进行周期性发送和接收消息,并且同时对网络的配置进行管理,如果Ring message发送(接收)超时又会跳回NMReset状态。当没有NM消息传输的时候或者总线错误时会进入NMLimpHome状态,如果错误解除则跳转回NMReset状态。
7.4: OSEK直接网络管理状态图
8:OSEK直接网络管理参数
8.1:定时参数
如下表所示:
OSEK直接网络管理的四种典型的时间参数+一种节点内部的时间参数
8.2:计数器
- NMrxcount
接收功能失败计数器 - NMtxcount
发送功能失败计数器
8.3:单节点状态时序
如下图所示:
在单节点状态下时,tType、tMax、tError的状态显示。
(注:这里有两个疑问:
1:为什么tType的状态显示为Alive msg到Ring msg的时间间隔?
2:为什么tMax的状态显示为Ring msg到Alive msg的时间间隔?
关于这两个问题,我们在下一个专题“行为部分”对单节点工况下的状态跳转进行单独的讲解)