时间同步核心概念:主时钟选择、偏移测量、延迟测量、邻居速率比
做时间同步,说白了就是让网络里所有节点对时。但谁当老大?怎么测偏差?链路延迟怎么算?速率不准怎么办?这四个问题搞不定,同步就是空中楼阁。我最早接触 IEEE 802.1AS 时,被一堆术语绕晕了,后来才发现——核心就这四个东西。
主时钟选择
时钟域里必须有个权威——谁是老大,由 BMCA(Best Master Clock Algorithm)说了算。它比较每个节点的时钟质量、优先级、标识符,谁综合分高谁当 Grandmaster。我当年第一次调 BMCA,以为选完就完了,结果角色飘忽不定。一查,原来报文里携带的 clockClass 值没配好。
- priority1(用户可配,越小越优先)
- clockClass(时钟等级,如温度补偿晶振 vs 原子钟)
- clockAccuracy(精度等级)
- priority2(次优先级,常用于冗余设计)
- clockIdentity(全局唯一,数值小优先)
实际上,车载网络里 Grandmaster 通常是 TSN 桥或网关。你想想看,如果传感器级别比桥还高,BMCA 会让传感器当主,那整个域都得跟着传感器跑。我建议把 priority1 固定在网关侧,省得漂移。
偏移测量
偏移就是主从时钟之间的瞬时差值。你说同步,不知道差多少怎么对?IEEE 802.1AS 用 Sync 和 Follow_Up 报文算偏移。主时钟发 Sync 时记下精确发送时间 t1,Follow_Up 把 t1 捎给从节点。从节点收到时记下 t2。偏移 = t2 - t1,不考虑延迟时这是一个粗估值。
偏移测量假设传播延迟对称且固定。实际上,布线长度、温度、电磁干扰都会引入不对称。所以你还需要配合延迟测量做修正。
延迟测量
延迟测量有两个主流模式:两步骤端到端延迟(用于 GM 到边界时钟)和点对点延迟(用于相邻桥之间)。我接触最多的就是 Pdelay 机制——用 Pdelay_Req、Pdelay_Resp、Pdelay_Resp_Follow_Up 三个报文来回一算,就能得到链路往返平均延迟。
| 参数 | 含义 | 是否含速率修正 |
|---|---|---|
| meanDelay | 往返平均单向延迟 | 否(原始) |
| neighborPropDelay | 使用邻居速率比修正后结果 | 是 |
邻居速率比(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 告诉你速率差异。最后本地时钟把这三个修正量全用上,才能跟上 Grandmaster 的节奏。我习惯把这四个步骤叫做“时间同步发动机的四个气缸”,缺一个发动机都抖个不停。
刚开始做一致性验证时,我建议先把这四个项单独拆开测:
- BMCA:看主从选举策略能不能在规定时间收敛
- 偏移测量:看 Sync/Follow_Up 时间戳精度
- 延迟测量:看 Pdelay 报文交换是否合规,延迟对称性是否满足
- NRR:看频率补偿误差是否在 ±0.01% 以内(汽车级通常要求 ±100 ppm)
分开测完再合起来跑自动化场景。别一上来就跑全集成,出问题都不知道怪谁。嗯,这就是核心四个要点,后面章节会每个再展开细讲工具和操作。