OSEK网络管理
设计目的
ECU的待机电流消耗(ECU睡眠模式)是汽车环境中一个非常重要的课题,ECU在切换至ECU睡眠模式时有不同的要求。
前人尝试
以前的人帮我们尝试了很多的方。
有这种链接KL15的,但是无法满足各个ECU的要求。其中Seat Control小阳台立即关机,Security Control需要持续工作以检测盗窃意图,Climate Control需要延迟一点时间再关机。
还有这种直接连接KL30的,功耗就会一直很高。
这种直接连接KL30+网络管理的方式就很接近正确答案了,能解决很多问题,但最核心的功耗问题还是没能解决。
经过了前人这么多的路,我们得到了一个很重要的结论,总线睡眠是ECU进入低功耗模式或关闭ECU的必要条件,于是引入了OSEK网络管理:
控制切换至总线睡眠模式
确定网络配置
运行期间的配置监控
准备状态信息
总线关闭处理
报文结构
令牌环机制
OSEK网络管理采用令牌环机制。令牌通过目标操作码传递给下一个更高编号的ECU。如果没有下一个更高编号,则令牌传递给编号最低的ECU。 环路根据各ECU的编号逐步构建而成。
每条消息都来自所有参与的ECU。只有目标ECU会解释NM消息并接收令牌。
唤醒和正常运行流程
每个 ECU 分配唯一的网络管理地址,NM 报文 ID 遵循基础ID(0x400) + 节点地址的命名规则:
表格
| 节点地址 | 模块名称 | NM 报文 ID |
|---|---|---|
| 0 | Climate Control(空调控制单元) | 0x400 |
| 7 | Security Control(安全控制单元) | 0x407 |
| 9 | Seat Control(座椅控制单元) | 0x409 |
- Byte 0:目标后继节点地址,标识令牌要传递给的下一个节点
- Byte 1:控制位向量(CBV),标识当前节点状态
0x01:ALIVE 状态,节点上线宣告0x02:RING 状态,令牌环稳定运行中
阶段 1:硬件唤醒,初始待机
KL15 由 OFF 切换为 ON,总线上 3 个 ECU 被硬件同时唤醒,进入WakeUp初始状态。此时仅完成底层硬件启动,尚未启动网络管理协议,总线无报文输出,令牌归属、逻辑拓扑均未确定。
阶段 2:首节点发送上线宣告
地址最小的 0 号空调单元率先启动 NM 状态机,持有初始令牌,发送第一帧ALIVE 报文(ID=0x400,数据 =00 01)。
- 作用:向全网宣告自身已上线,触发其他节点的 NM 状态机启动;
- 此时其余两个节点处于监听状态,识别到总线上已有节点在线。
阶段 3:7 号节点响应,确立第一跳路径
7 号安全单元监听到 ALIVE 报文后,经过自身配置的固定延迟T_Delay_7 = 12ms,发送自身 ALIVE 报文(ID=0x407,数据 =07 01)。
- 0 号节点识别到 7 号节点上线,将自身
Successor更新为 7,令牌第一跳逻辑路径0 → 7确立; - 延迟时间与节点地址绑定:地址越高,发送延迟越长,从机制上避免多节点同时发包造成总线冲突。
阶段 4:9 号节点响应,确立第二跳路径
9 号座椅单元经过累计延迟T_Delay_9 = 12ms + 19ms = 19ms后,发送自身 ALIVE 报文(ID=0x409,数据 =09 01)。
- 7 号节点识别到 9 号节点上线,将自身后继更新为 9,令牌第二跳逻辑路径
7 → 9确立; - 至此所有节点均完成上线宣告,逻辑环的正向链路全部打通。
阶段 5:环闭合,进入稳定 RING 状态
9 号节点确认无更晚上线的节点,将自身后继设回起点 0 号,令牌传递路径闭合为完整逻辑环:0 → 7 → 9 → 0。
- 0 号节点在典型周期
T_TYP = 100ms时刻发送RING 报文(ID=0x400,数据 =07 02),标志网络从 ALIVE 发现阶段进入稳定令牌环运行阶段; - 本次报文将令牌传递给 7 号节点,7 号获得下一轮令牌持有权。
阶段 6:稳定环运行 —— 令牌传递至 9 号
令牌按固定顺序在环内流转:7 号节点持有令牌后,发送 RING 状态报文(ID=0x407,数据 =09 02),将令牌传递给 9 号节点。
- 所有节点通过持续的令牌传递,确认彼此在线状态,维持总线唤醒;
- 100ms 为 OSEK NM 的典型令牌周期(Ttype),是网络稳定运行的基准节拍。
阶段 7:稳定环运行 —— 令牌回归起点
9 号节点持有令牌后,发送 RING 状态报文(ID=0x409,数据 =00 02),将令牌传回起点 0 号节点。
- 至此完成一个完整的令牌环周期,后续将以 100ms 为周期循环传递;
- 只要令牌持续正常流转,所有 ECU 保持唤醒;若节点超时(Tmax)未收到令牌,将触发环重建或进入跛行模式(LimpHome)。
后续正常运行就是循环5-7阶段。
分布式无主架构无需专门主控节点,所有节点地位平等,通过令牌自动完成拓扑发现、在线监控、休眠协同,单节点故障不会导致整个网络管理瘫痪。
休眠的反向流程
Prep Sleep、Sleep Ind对应休眠阶段:车辆下电后,令牌会携带休眠指示位在环内传递,逐个节点确认可进入休眠,所有节点一致应答后才统一进入低功耗模式,避免部分节点提前休眠导致总线通信异常。
休眠流程
一、第一次休眠尝试:部分节点未就绪,协商失败
阶段 1:KL15 下电,0 号节点发起休眠请求
- 触发条件:KL15 点火电源由 ON 切换为 OFF,0 号、7 号节点率先完成业务收尾,满足自身休眠条件,进入
Prep Sleep预休眠状态,置位Sleep Indication休眠指示位。 - 动作:0 号节点持有令牌,发送RING + SLEEPIND报文(ID=0x400,数据 =
07 12),将休眠请求随令牌传递给后继 7 号节点。 - 状态:9 号座椅节点仍有未完成业务,不满足休眠条件,未置位 SleepInd。
阶段 2:7 号节点接力传递休眠请求
- 7 号节点收到指向自身的休眠令牌,自身已就绪,保持 SleepInd 置位。
- 动作:发送RING + SLEEPIND报文(ID=0x407,数据 =
09 12),将令牌和休眠请求继续传递给后继 9 号节点。
阶段 3:9 号节点未就绪,中断休眠指示
- 9 号节点收到休眠请求,但自身应用层仍需总线通信,不满足休眠条件,因此清除 SleepInd 位。
- 动作:仅发送普通RING报文(ID=0x409,数据 =
00 02),令牌传回起点 0 号节点。 - 结果:休眠指示未能完整绕环一周,第一轮休眠协商失败。
阶段 4:令牌回到起点,第一轮协商终止
- 0 号节点收到 9 号传回的普通 RING 报文(无 SleepInd),判定全网未全部就绪,本轮休眠流程终止。
- 由于 0 号和 7 号节点仍保持休眠就绪状态,在下一个令牌周期会再次发起休眠请求,开始第二轮协商。
二、第二次休眠尝试:所有节点就绪,协商成功
阶段 5:9 号节点就绪,接力传递休眠请求
- 此时 9 号节点完成所有业务,满足休眠条件,置位 SleepInd,进入 Prep Sleep 状态。
- 7 号节点再次传递来带 SleepInd 的令牌,9 号节点确认自身就绪,保持 SleepInd 置位。
阶段 6:令牌完整绕环,全网休眠就绪确认
- 9 号节点发送RING + SLEEPIND报文(ID=0x409,数据 =
00 12),令牌传回 0 号节点。 - 关键判定:令牌携带 SleepInd 完整绕环一周,说明所有节点均同意休眠,休眠协商条件达成。
阶段 7:发送休眠应答,确认最终休眠
- 0 号节点作为首个检测到全网就绪的节点,发送RING + SLEEPACK报文(ID=0x400,数据 =
07 32,即 RING 位 + SleepInd 位 + SleepAck 位置位)。 - 作用:这是全网休眠的最终确认指令,所有节点收到该报文后,停止发送 NM 报文,进入总线休眠等待阶段。
阶段 8:超时等待,进入 Bus Sleep
- 最后一帧 NM 报文发出后,所有节点启动
T_WaitBusSleep计时器(典型值 500ms,图中 1.000s 发最后一帧,1.500s 总线完全静默)。 - 计时期间总线无任何报文,超时后所有节点关闭 CAN 收发器,正式进入Bus Sleep 总线休眠低功耗状态。
- 设计提示:若单个 ECU 内存在多个独立使用总线的应用,需做好内部休眠仲裁,避免部分应用仍需通信时总线已休眠,导致异常唤醒。
跛行状态
阶段 1:初始唤醒,发送首帧 ALIVE 上线宣告
节点上电唤醒后进入初始状态,向总线发送第一帧上线报文:
- 报文 ID = 0x403(基础 ID 0x400 + 节点地址 3)
- 数据场
03 01:第一字节03为后继节点地址(未发现其他节点,暂指向自身);第二字节0x01为 ALIVE 状态位,宣告节点上线、请求建立逻辑环 - 节点持有令牌,启动超时计时,等待其他节点响应;本场景无其他 NM 节点,因此无任何应答
阶段 2:反复重试建环,ALIVE 与 RING 交替循环
节点按标准时序反复尝试建立令牌环,始终失败:
- 按
T_Typ = 100ms周期尝试发送 RING 报文(数据03 02,0x02为 RING 状态位),模拟令牌传递,但无后继节点承接,令牌无法流转 - 达到
T_Max = 260ms令牌超时阈值后,判定令牌丢失,退回重新发送 ALIVE 报文重试 - Trace 呈现固定规律:100ms 发 RING → 260ms 超时发 ALIVE → 循环往复
- 图中标注的
4x Alive Ring,即指多次重复「ALIVE 上线→尝试 RING 传牌→超时重试」的建环流程
阶段 3:错误超时达标,正式进入 LimpHome 状态
连续建环失败持续达到T_Error = 1000ms故障阈值后,节点判定网络异常,正式切换到NMLimpHome 跛行状态:
- 发送 LimpHome 专属报文:数据
03 04(0x04为 LimpHome 状态位) - 核心行为发生本质变化:
- 彻底放弃逻辑令牌环机制,不再等待其他节点的令牌
- 改为自主按固定周期发送报文,仅用于宣告自身在线
- 后继节点固定指向自身,不再动态更新网络拓扑
阶段 4:LimpHome 状态下发起休眠申请
当应用层休眠条件满足(如 KL15 下电、无活跃业务),节点在跛行状态下自主启动休眠流程:
- 报文更新为
03 14(0x14 = 0x10 SleepInd休眠指示 + 0x04 LimpHome),同时携带跛行状态与休眠请求 - 对应操作
GotoMode(BusSleep),节点进入预休眠准备;因无其他节点,无需协同休眠应答,自主完成休眠协商
阶段 5:进入总线休眠 Bus Sleep
发送完带休眠指示的报文后,等待总线静默超时到期,节点停止所有报文发送:
- Trace 中 1.000s 为最后一帧 NM 报文,1.500s 后总线完全静默
- 节点关闭 CAN 收发器,进入Bus Sleep 低功耗休眠状态,整个状态机流程终止
LimpHome 的触发场景与设计意义
LimpHome 是 OSEK NM 的容错机制,触发场景包括:
- 总线上仅有单个 NM 节点(如台架单 ECU 调试)
- 其他 NM 节点全部离线、故障或未启动 NM
- 总线物理层故障导致令牌报文持续丢失
- 节点地址、NM 基础 ID 配置错误,节点间无法互相识别
其核心价值是:即使网络管理的协同功能失效,ECU 依然能独立完成在线宣告、自主休眠,不会因 NM 异常导致 ECU 无法下电、静态电流超标。
加入新节点
阶段 1:初始稳态 —— 三节点正常令牌环运行
- 现有三节点逻辑环稳定运行,令牌按
0 → 7 → 9 → 0循环传递。 - 当前 7 号节点持有令牌,发送 RING 报文(ID=0x407,数据 =
09 02),将令牌传递给后继 9 号节点。 - 新节点 3 号刚上电唤醒,处于初始状态,暂将后继指向自身,独立持有令牌,尚未接入现有逻辑环。
阶段 2:新节点上线宣告,环首节点更新后继
- 新节点 3 号超时未收到令牌,主动发送ALIVE 上线报文(ID=0x403,数据 =
03 01,时间 0.010s),向全网宣告自身存在。 - 0 号节点监听到该 ALIVE 报文,根据地址升序选举规则,发现地址 3 比原后继 7 更小,因此将自身后继从 7 更新为 3。
阶段 3:令牌传回起点,新节点暂设后继
- 9 号节点按原环路径发送 RING 报文(ID=0x409,数据 =
00 02,时间 0.090s),令牌传回 0 号节点。 - 3 号节点监听到 9 号的 RING 报文,识别到 9 号的后继是 0(9 为当前最大地址节点),结合自身地址 3,暂时将 9 号设为自身后继(此时尚未发现 7 号节点,属于过渡状态)。
阶段 4:令牌正式传递给新节点
- 0 号节点持有令牌,按照更新后的后继地址,发送 RING 报文(ID=0x400,数据 =
03 02,时间 0.100s),将令牌正式传递给 3 号节点。 - 3 号节点成功收到令牌,正式接入令牌环,此时其后继仍暂指向 9 号。
阶段 5:新节点首次传牌,7 号被临时跳过
- 3 号节点持有令牌,按当前后继 9 号发送 RING 报文(ID=0x403,数据 =
09 02),令牌直接传给 9 号。 - 由于地址排序
3 < 7 < 9,7 号节点在本轮令牌传递中被跳过,未收到前驱令牌,属于建环过程中的临时过渡现象,并非故障。
阶段 6:被跳过节点补发 ALIVE,新节点修正后继
- 7 号节点超时未收到令牌,判定自身被跳过,主动发送ALIVE 报文(ID=0x407,数据 =
09 01),重新宣告自身在线。 - 3 号节点监听到 7 号的 ALIVE,发现地址 7 介于自身地址 3 和原后继 9 之间,因此将自身后继从 9 更新为 7,修正令牌传递路径。
阶段 7:四节点稳定环建立完成
- 令牌沿修正后的路径完整流转一圈:
0 → 3 → 7 → 9 → 0,所有节点的后继地址均正确匹配。 - 最终形成 4 个 ECU 的稳定逻辑环,每个节点都拥有正确的后继节点,令牌按地址升序规则正常循环传递,新节点接入流程全部完成。
运行过程当中丢失一个节点
阶段 1:令牌发向离线节点,令牌开始丢失
- 正常背景:四节点逻辑环稳定运行,令牌传递到 0 号节点。
- 执行动作:0 号节点按原有拓扑配置,向其后继 3 号节点发送 RING 令牌报文(ID=0x400,数据
03 02,对应 Trace 中 0.100s 的帧)。 - 故障发生:3 号 ECU 已经物理离线(图中灰色淡化、总线处波浪符号表示物理链路断开),无法接收该令牌报文,也不能继续向下传递令牌,令牌在此处中断。
- 中间状态:7 号、9 号节点此时尚未感知故障,仍维持原有后继配置,等待令牌按序传递。
阶段 2:令牌传递中断,全网进入超时判定
- 总线现象:令牌在 3 号节点处彻底断流,总线上不再有新的 RING 报文,Trace 中 0.100s 之后没有出现预期的 0x403 报文。
- 节点行为:所有在线节点各自启动
Tmax超时计时器(本示例典型值 260ms):- 正常情况下,节点每收到一帧非指向自己的 RING 报文,都会重置 Tmax 计时器;
- 当超过 Tmax 时长仍未收到任何 RING 报文时,节点判定「令牌丢失、逻辑环断裂」。
阶段 3:Tmax 超时触发,全网复位重建逻辑环
- 触发条件:260ms 的 Tmax 超时到期,所有在线节点同步判定令牌丢失。
- 全网统一动作:
- 所有 ECU 复位自身 NM 状态机,回到 NMReset 初始状态;
- 清空原有拓扑配置,所有节点暂时将后继地址指向自身;
- 所有节点重新发送 ALIVE 上线报文(如 Trace 中 0.260s 的
400 00 01),重新启动拓扑发现流程。
- 最终结果:全网重新走完建环流程,自动排除已离线的 3 号节点,最终收敛形成新的三节点稳定环
0 → 7 → 9 → 0。
