时间同步核心概念:主时钟选择、偏移测量、延迟测量、邻居速率比

做时间同步,说白了就是让网络里所有节点对时。但谁当老大?怎么测偏差?链路延迟怎么算?速率不准怎么办?这四个问题搞不定,同步就是空中楼阁。我最早接触 IEEE 802.1AS 时,被一堆术语绕晕了,后来才发现——核心就这四个东西。

IEEE 802.1AS 时间同步核心概念框架 IEEE 802.1AS 时间同步四大核心 主时钟选择 (BMCA) 偏移测量 (Offset Measurement) 延迟测量 (Delay Measurement) 邻居速率比 (Neighbor Rate Ratio) 同步数据生成与消费 (sync/follow_up/pdelay) 主时钟决定时间参考源头 偏移+延迟+速率修正本地时钟

主时钟选择

时钟域里必须有个权威——谁是老大,由 BMCA(Best Master Clock Algorithm)说了算。它比较每个节点的时钟质量、优先级、标识符,谁综合分高谁当 Grandmaster。我当年第一次调 BMCA,以为选完就完了,结果角色飘忽不定。一查,原来报文里携带的 clockClass 值没配好。

BMCA 选主依据(按优先级排序)
  1. priority1(用户可配,越小越优先)
  2. clockClass(时钟等级,如温度补偿晶振 vs 原子钟)
  3. clockAccuracy(精度等级)
  4. priority2(次优先级,常用于冗余设计)
  5. clockIdentity(全局唯一,数值小优先)

实际上,车载网络里 Grandmaster 通常是 TSN 桥或网关。你想想看,如果传感器级别比桥还高,BMCA 会让传感器当主,那整个域都得跟着传感器跑。我建议把 priority1 固定在网关侧,省得漂移。

偏移测量

偏移就是主从时钟之间的瞬时差值。你说同步,不知道差多少怎么对?IEEE 802.1AS 用 Sync 和 Follow_Up 报文算偏移。主时钟发 Sync 时记下精确发送时间 t1,Follow_Up 把 t1 捎给从节点。从节点收到时记下 t2。偏移 = t2 - t1,不考虑延迟时这是一个粗估值。

小技巧——我习惯在从节点抓两个时间戳:t2(接收中断时刻)和 t2'(软件读取时刻)。如果中断响应抖动大,偏移计算会带进额外误差。后来我改用硬件时间戳直接捕获,问题才搞定。

偏移测量假设传播延迟对称且固定。实际上,布线长度、温度、电磁干扰都会引入不对称。所以你还需要配合延迟测量做修正。

延迟测量

延迟测量有两个主流模式:两步骤端到端延迟(用于 GM 到边界时钟)和点对点延迟(用于相邻桥之间)。我接触最多的就是 Pdelay 机制——用 Pdelay_Req、Pdelay_Resp、Pdelay_Resp_Follow_Up 三个报文来回一算,就能得到链路往返平均延迟。

参数 含义 是否含速率修正
meanDelay 往返平均单向延迟 否(原始)
neighborPropDelay 使用邻居速率比修正后结果 是
注意——我曾经在一个项目里发现 Pdelay 测量结果反复跳动,后来发现是 802.1AS 时间戳数据没有加锁,主从同时发送请求造成死锁。解决办法是错开测量周期,或者在驱动层加互斥。

邻居速率比(Neighbor Rate Ratio, NRR)

你说主从时钟频率完全一样?不可能。晶振有温漂,有初始偏差,用着用着就会跑偏。NRR 就是用来补偿频率差的。它通过持续跟踪相邻两台设备的 Sync/Follow_Up 时间差,算出本地时钟相对于邻居时钟的速率比。

// NRR 简化计算逻辑(伪代码)
uint64_t rateRatioNumerator = (t2B - t2A);  // 从节点两次接收时间差
uint64_t rateRatioDenom    = (t1B - t1A);  // 主节点两次发送时间差
uint64_t nrr               = (rateRatioNumerator << 32) / rateRatioDenom;
// 实际标准里还有 scaling 和滤波

注意 NRR 是 无量纲比例,用 41 位整数加 23 位小数表示。车载环境下,我见过最离谱的一次是装车后 NRR 初始化出错导致整网时间跑飞。后来我们强制在链路建立后先发 5 个 Sync 报文做预热,把 NRR 稳定下来再投入同步。

避坑指南——如果你发现同步误差随时间线性增长,多数是 NRR 没更新或更新率太低。802.1AS 要求每个 Sync 间隔至少更新一次,但我会在调试阶段拉高到每 10ms 更新,确认稳定后再调回业务周期。

四个概念怎么串起来?

你看图上那条虚线——主时钟选出来之后,它提供时间基准。偏移测量告诉你现在差多少,延迟测量告诉你链路走了多久,NRR 告诉你速率差异。最后本地时钟把这三个修正量全用上,才能跟上 Grandmaster 的节奏。我习惯把这四个步骤叫做“时间同步发动机的四个气缸”,缺一个发动机都抖个不停。

刚开始做一致性验证时,我建议先把这四个项单独拆开测:

  • BMCA:看主从选举策略能不能在规定时间收敛
  • 偏移测量:看 Sync/Follow_Up 时间戳精度
  • 延迟测量:看 Pdelay 报文交换是否合规,延迟对称性是否满足
  • NRR:看频率补偿误差是否在 ±0.01% 以内(汽车级通常要求 ±100 ppm)

分开测完再合起来跑自动化场景。别一上来就跑全集成,出问题都不知道怪谁。嗯,这就是核心四个要点,后面章节会每个再展开细讲工具和操作。