基于Kinetis K60与MQX RTOS实现IEEE 1588 V2亚微秒级时钟同步
1. 项目概述与核心价值
在工业自动化、智能电网、通信基站这些对时间极其敏感的领域,设备间的时钟哪怕只有几十微秒的偏差,都可能导致控制指令错乱、数据采集不同步,甚至引发严重的生产事故或系统故障。传统的网络时间协议(NTP)精度通常在毫秒级,对于这些场景来说,就像是拿一把米尺去测量芯片的引脚间距,完全不够用。这正是IEEE 1588精密时钟同步协议(PTP)大显身手的地方,它能将网络内设备的时钟同步精度推进到亚微秒甚至纳秒级别。
这次我们要聊的,就是如何在一块具体的嵌入式硬件——飞思卡尔(现恩智浦)的Kinetis K60微控制器上,基于MQX实时操作系统,亲手搭建一个符合IEEE 1588 V2标准的精密时钟同步节点。这不仅仅是一个理论验证,更是一个从芯片选型、操作系统适配、协议栈集成到最终测试的完整工程实践。K60内置的MAC-NET模块支持硬件时间戳,这是实现高精度的关键,它能将时间标记打在数据帧进出物理层的瞬间,极大消除了软件协议栈带来的不确定延迟。而MQX RTOS及其配套的MQX1588通信库,则为我们提供了一个稳定、高效的软件框架,让我们能专注于应用逻辑,而非底层协议的复杂实现。
如果你正在从事工业控制、电力监测或任何需要高精度时间基准的嵌入式网络设备开发,或者你对网络时间同步的底层原理充满好奇,那么这次基于Kinetis K60与MQX RTOS的IEEE 1588 V2实现之旅,将为你提供一份可直接参考的“实战手册”。我们将从协议原理拆解开始,一步步深入到硬件平台搭建、软件组件集成、任务调度设计,最后完成同步精度的实测与验证。
2. IEEE 1588 V2协议核心原理深度解析
在动手写代码之前,我们必须吃透IEEE 1588 V2协议的精髓。它之所以能实现亚微秒级同步,核心在于其精巧的主从(Master-Slave)架构和双向延迟测量机制。理解了这个,后续的所有配置和调试才有据可依。
2.1 主从同步与最佳主时钟算法
IEEE 1588网络中的设备并非平等关系,而是通过“最佳主时钟算法”(Best Master Clock Algorithm, BMC)动态选举出一台时钟质量最高的设备作为“主时钟”(Grandmaster Clock)。时钟质量由一系列属性决定,包括时钟的精度等级(Clock Class)、时间来源(如GPS、原子钟)、优先级1和优先级2等。网络启动或拓扑变化时,所有设备都会广播自己的时钟属性,通过BMC比较,最终确定唯一的主时钟。其余设备则自动成为“从时钟”(Slave Clock),并同步于主时钟。
这种动态选举机制带来了巨大的灵活性。例如,在一个系统中,如果原本作为主时钟的GPS授时设备发生故障,网络中另一台配备高稳晶振的设备会通过BMC自动晋升为新的主时钟,整个网络的时间同步得以维持,实现了高可用性。在我们的K60 demo中,可以通过cfgparam命令手动配置clkClass、prio1等参数,来模拟或固定设备的时钟角色。
2.2 两步法同步与延迟补偿机制
协议实现同步的核心过程,是一个包含“偏移测量”和“延迟测量”的循环。最经典的实现方式是“两步法”(Two-Step)。
第一步:偏移测量(Sync & Follow_Up)
- Sync报文发送:主时钟在时间t0时刻发送一个Sync报文。在纯软件时间戳方案中,t0是应用层准备发送报文的时间,这个时间点很不精确,因为报文还需要经过TCP/IP协议栈、驱动层才能进入网络。
- Follow_Up报文发送:紧接着,主时钟发送一个Follow_Up报文,这个报文里携带了Sync报文准确的发送时间戳t0。这个“准确时间戳”正是硬件时间戳的用武之地——K60的MAC-NET模块可以在Sync报文的物理层帧起始定界符(SFD)离开MAC的瞬间,将此时计数器值捕获为t0,这个时刻极其精确。
- 从时钟记录:从时钟在t1时刻收到Sync报文。同样,利用硬件功能,在SFD进入MAC的瞬间捕获时间戳t1。
- 计算偏移:此时,从时钟知道了t0(来自Follow_Up)和t1(自己捕获)。假设网络传输延迟是
delay,主从时钟偏移是offset(从时钟比主时钟慢offset),那么存在关系:t1 - t0 = delay + offset。这个公式里有两个未知数(delay和offset),所以仅靠这一步还无法解出offset。
第二步:延迟测量(Delay_Req & Delay_Resp)
- Delay_Req报文发送:从时钟在时间t2主动向主时钟发送一个Delay_Req报文。
- 主时钟记录并回应:主时钟在t3时刻收到该报文,并同样通过硬件捕获精确的t3。随后,主时钟通过Delay_Resp报文将t3告知从时钟。
- 计算延迟:对于这条反向路径,存在关系:
t3 - t2 = delay - offset。注意这里的delay我们假设双向路径的网络延迟是对称的(这是一个关键假设,在实际有线全双工以太网中基本成立)。
最终计算: 现在我们有了两个方程:
- 方程A:
t1 - t0 = delay + offset - 方程B:
t3 - t2 = delay - offset
将两式相加和相减,即可解出:
- 网络延迟:
delay = [(t1 - t0) + (t3 - t2)] / 2 - 时钟偏移:
offset = [(t1 - t0) - (t3 - t2)] / 2
从时钟根据计算出的offset值,调整自身的本地时钟,从而与主时钟同步。这个过程周期性地进行(周期由syncIntv参数配置),不断修正由于时钟晶振频率微小差异(漂移)带来的累积误差。
注意:硬件时间戳的价值对比软件时间戳,硬件时间戳将t0、t1、t2、t3的捕获点从“飘忽不定”的应用层/内核层,下移到确定的物理层/MAC层。这消除了操作系统调度、协议栈处理、中断延迟等带来的“噪声”(通常可达数十到数百微秒),使得
delay和offset的计算基础数据本身精度就达到了纳秒级,这是实现亚微秒同步的前提。
2.3 关键协议概念与配置参数
在配置我们的K60节点时,会遇到一系列协议参数,理解它们对调试至关重要:
- 时钟类型(Clock Type):可以是普通时钟(Ordinary Clock, 兼做主或从)、边界时钟(Boundary Clock, 作为中间节点,上游为从,下游为主)、透明时钟(Transparent Clock, 只转发报文并修正驻留时间,不参与同步)。Demo中通常配置为普通时钟。
- 域(Domain):PTP网络可以划分为不同的域,只有同一域内的设备才会相互同步。
domNmb参数用于设置域号,这在多协议共存的复杂网络中用于隔离。 - 报文间隔:
syncIntv(Sync报文间隔)、AnncIntv(宣告报文间隔)、dlrqIntv(延迟请求间隔)等参数都以2为底的对数值表示。例如,syncIntv设置为0表示1秒1次Sync,设置为-1表示0.5秒1次。更短的间隔能更快收敛但会增加网络负载。 - 单步与两步模式:如果硬件支持在发送Sync报文的同时,将时间戳t0直接嵌入该报文(即“一步到位”),则称为单步模式(One-Step),无需Follow_Up报文。K60的MAC-NET模块支持此模式,但Demo默认使用更通用、兼容性更好的两步模式(Two-Step)。
3. 硬件平台与软件栈选型解析
要实现一个稳定可靠的IEEE 1588节点,软硬件的协同设计是关键。飞思卡尔提供的TWR-K60N512套件和MQX软件生态,为我们搭建了一个近乎“开箱即用”的高起点。
3.1 核心硬件:Kinetis K60与TWR-K60N512开发套件
选择K60作为核心处理器并非偶然。其ARM Cortex-M4内核提供了足够的处理能力来运行MQX RTOS和TCP/IP协议栈,而它的独门绝技在于集成了支持IEEE 1588硬件时间戳的10/100M以太网MAC-NET模块。
MAC-NET模块的硬件时间戳工作流程:
- 发送时间戳:当驱动层识别出要发送的是一个PTP事件报文(Sync, Delay_Req)时,会在发送描述符中设置一个特殊标志。MAC硬件在监测到该报文的SFD字段离开芯片的精确时刻,将内部1588定时器的计数值锁存到特定寄存器,并产生一个中断通知CPU来读取这个发送时间戳t0或t2。
- 接收时间戳:对于所有接收到的报文,MAC硬件都会在检测到SFD的瞬间,自动将此时定时器值捕获,并直接附在接收描述符中。因此,当驱动收到一个PTP事件报文时,可以同时拿到报文数据和精确的接收时间戳t1或t3。
- 定时器同步:这个内部1588定时器是一个32位自由运行计数器,其计数频率通常与网络时钟(如25MHz)相关。主从同步的本质,就是让从设备的这个定时器的“秒脉冲”和计数值,都与主设备对齐。
TWR-K60N512开发套件采用模块化的塔式(Tower)设计,包含了核心的MCU模块、集成了以太网PHY芯片的串行接口模块(TWR-SER)以及电梯板。这种设计使得硬件连接极其简单,只需通过排线连接相应模块,并配置正确的跳线(例如,将以太网PHY的MII接口正确连接到K60的MAC),就完成了硬件搭建。它为快速原型开发提供了极大便利,让我们能聚焦于软件实现。
3.2 软件基石:MQX RTOS与MQX1588通信库
在资源受限的嵌入式设备上实现复杂的网络协议栈和时间同步,一个高效的实时操作系统是必不可少的。MQX RTOS是飞思卡尔为其微控制器深度优化的实时操作系统,其内核小巧、响应迅速,且提供了丰富的中间件,特别是我们需要的RTCS。
RTCS是一个功能完整的嵌入式TCP/IP协议栈,支持IP、UDP、TCP、DHCP、DNS等。IEEE 1588 PTPv2报文正是通过UDP协议(目标端口319和320)进行传输的。RTCS为PTP协议栈提供了稳定的网络报文收发基础。
MQX1588通信库是本项目的灵魂。它并非飞思卡尔从零开发,而是基于德国IXXAT公司成熟的IEEE 1588 V2协议栈软件,进行了针对MQX操作系统和K60硬件的移植与封装。这个库主要做了以下几件事:
- 协议引擎封装:将复杂的PTP状态机、BMC算法、报文解析与构造等逻辑封装成API,对上层应用提供简单的启动、停止、配置接口。
- 硬件抽象层:适配K60的MAC-NET驱动,提供读取/写入硬件时间戳的标准接口,实现了协议栈与具体硬件的解耦。
- 与RTCS集成:库会向RTCS注册一个RAW Socket(或使用特定的UDP Socket),直接捕获和发送PTP报文,确保报文处理路径最短,延迟最低。
- 提供用户回调:例如,
MQX1588_ReadConfig和MQX1588_WriteConfig,允许应用程序将PTP配置(如时钟优先级、IP地址等)保存到非易失存储器中,实现掉电保存。
这种“成熟协议栈 + 硬件驱动适配 + 操作系统集成”的软件架构,极大地降低了开发难度和风险,保证了系统的稳定性和协议的标准符合性。
4. 软件架构设计与任务调度剖析
理解了核心组件,我们来看它们是如何在MQX RTOS的调度下协同工作的。Demo应用的软件架构是一个典型的多任务实时系统设计。
4.1 多任务划分与优先级设计
MQX是一个优先级驱动的抢占式RTOS。Demo中创建了多个任务,每个任务有明确的职责和优先级(数字越小,优先级越高)。这种设计确保了关键任务(如网络报文处理、时间同步计算)能及时响应。
- Shell任务(优先级12):这是唯一设置了自动启动属性的任务。系统上电后,它首先运行,初始化串口,提供命令行界面。它的一个重要职责是作为“启动器”,依次创建并启动其他应用任务(如RTCS任务、PTP任务)。你可以把它看作系统的“总指挥”。
- RTCS任务(优先级6):由Shell任务创建。它运行RTCS协议栈的主循环,负责处理所有网络接口的底层报文收发、ARP解析、IP路由等。这是网络通信的基础,优先级设置较高,以确保网络响应及时。
- PTPMain任务(优先级7):这是IEEE 1588协议栈的核心任务,同样由Shell任务创建。它内部运行着IXXAT的PTP引擎,周期性地处理Sync、Delay_Req等报文的发送、接收、时间戳处理以及偏移量计算和时钟校正。其优先级略低于RTCS任务,但高于大多数应用任务,保证了时间同步处理的实时性。
- Telnet服务器任务 & HTTP服务器任务(优先级8):这两个任务分别监听23端口和80端口,为系统提供网络远程访问能力。它们优先级适中,属于交互类任务。
- Telnet Shell任务 & Shell Log任务(优先级8, 11):它们是动态创建的。每当一个Telnet客户端连接,服务器任务就会创建一个对应的Telnet Shell任务来处理该连接的命令。Shell Log任务则在用户执行
show on命令时创建,负责以1秒为周期,向串口或Telnet终端打印当前的PTP同步状态(如时间、偏移量、延迟等)。
实操心得:优先级设置的考量将RTCS任务优先级设为最高之一(6)是合理的,因为所有网络报文(包括PTP报文)都需要它来搬运。PTP任务(7)必须紧随其后,以便能及时处理RTCS递送上来的PTP报文。如果PTP任务优先级过低,可能会因为其他任务长时间占用CPU而错过处理时间戳的关键窗口,导致同步精度下降。在你自己设计系统时,如果添加了其他高负载任务(如复杂算法计算),需要仔细评估其对PTP任务响应时间的影响。
4.2 非易失存储与配置管理
嵌入式设备上电后需要知道自己的身份(IP、MAC)和运行参数(时钟类型、同步间隔等)。Demo通过非易失存储(NAND Flash)来保存这些配置。
在MQX1588DEMO.h中定义了一个扩展的配置结构体MQX1588DEMO_CONFIG,它包裹了库自身的MQX1588_CONFIG结构,并增加了autorun(是否自动启动PTP)和checksum(校验和)字段。
系统启动时的流程如下:
- 初始化:应用启动后,会尝试从NAND Flash的特定位置读取保存的
MQX1588DEMO_CONFIG结构。 - 校验与恢复:计算读取数据的校验和,与存储的
checksum比对。如果校验失败或首次运行,则使用代码中定义的default_MQX1588DEMOCfg(在ptp_cfg.h中)作为默认配置,并将其写入Flash。 - 配置应用:将读取或默认的配置传递给MQX1588库和网络栈,完成初始化。
- 自动运行:如果
autorun标志为true,则Shell任务在创建PTPMain任务后会自动将其启动,设备开始尝试同步。
用户可以通过串口或网页的cfgparam命令,在运行时修改这些参数(如ip_addr0、syncIntv)。修改后,Demo会调用MQX1588DEMO_WriteConfig函数,将新的完整配置结构连同重新计算的校验和一起写回Flash,确保下次重启后生效。
注意事项:配置参数的风险修改网络参数(如IP地址)时要格外小心。如果错误地将设备IP设成了与网络中其他设备冲突的地址,或者网关设置错误,会导致网络通信中断,PTP同步自然也会失败。建议在修改前,先通过
netstat命令查看当前网络状态,并在修改后通过ping命令测试网络连通性。
5. 开发环境搭建与Demo工程详解
纸上得来终觉浅,绝知此事要躬行。让我们打开工程,看看具体的代码实现和编译选项。
5.1 工程结构与编译目标
Demo代码随MQX1588库安装包提供,通常位于mqx1588lib的demo目录下。它支持IAR Embedded Workbench和CodeWarrior(CW10)两种主流ARM开发环境。
工程通常包含四个编译目标,针对不同的开发调试阶段:
- Int. Flash Release:这是用于最终产品发布的目标。代码经过优化,被编译后直接烧录到K60的内部Flash中运行。变量存放在内部SRAM。系统复位后即直接启动应用程序。
- Int. Flash Debug:与Release类似,但使用调试库编译,包含调试信息。用于在硬件上进行调试。对于没有外部RAM的板子,这是调试大型应用的主要方式。
- Int. Ram Release:此目标将代码本身也加载到内部RAM中运行。由于RAM访问速度远快于Flash,且支持无限次擦写,这通常用于前期频繁调试和代码验证。调试器会自动将可执行文件加载到RAM。
- Int. Ram Debug:同上,但使用调试库。
开发环境配置关键点:
- MQX路径:你需要在工程设置中正确指定MQX RTOS 3.7(或相应版本)的根目录路径。编译器需要找到MQX的头文件和库。
- 预定义宏:确保在编译器预处理器选项中正确定义了芯片型号(如
MK60DN512ZVLQ10)和板卡类型(如TWR_K60N512)。 - 库文件链接:工程需要链接两个关键的MQX1588库文件:
mqx1588_common_two_step.a(Release) 或mqx1588_common_two_step_d.a(Debug):这是PTP协议栈的核心逻辑库。mqx1588_macnet.a(Release) 或mqx1588_macnet_d.a(Debug):这是针对K60 MAC-NET硬件的适配层库,负责硬件时间戳的读写。
5.2 核心代码流程剖析
让我们追踪一下系统从启动到开始同步的关键代码流:
- 入口与初始化:
main()函数通常很简单,调用_mqx()启动MQX内核。内核初始化后,自动启动优先级最高的就绪任务——Shell任务。 - Shell任务:在
shell_task.c中,该任务首先初始化串口,打印欢迎信息。然后,它调用demo_init()进行应用层初始化。 - 应用初始化:在
demo_init()中,会进行以下关键操作:- 初始化LED、按钮等板级支持包(BSP)。
- 调用
MQX1588DEMO_ReadConfig()从Flash读取配置。 - 调用
RTCS_create()初始化TCP/IP协议栈,并根据配置设置网络接口(IP、掩码、网关)。 - 根据
autorun标志,决定是否立即创建并启动PTP任务。
- PTP任务启动:如果
autorun为真,Shell任务会创建ptp_task。在该任务函数中,会调用MQX1588库的初始化函数,并传入从Flash读取的配置结构。库内部会:- 初始化硬件(MAC-NET的1588定时器)。
- 根据配置设置时钟属性(角色、域等)。
- 启动PTP协议引擎,开始监听网络报文,参与BMC选举和同步过程。
- 时间戳中断服务:这部分的代码在驱动层。当MAC硬件捕获到PTP报文的发送或接收时间戳时,会产生一个中断。驱动层的中断服务程序(ISR)需要快速读取时间戳寄存器,并将这个时间戳和对应的报文描述符关联起来,传递给上层的PTP协议栈进行处理。这部分代码通常由MQX的BSP或驱动包提供,是保证精度的最底层关键。
5.3 用户接口与调试手段
Demo提供了丰富的交互方式,极大方便了开发和调试:
- 串口命令行(最基础):通过115200波特率的串口连接板卡,使用
ptp on/off控制同步,show on查看实时偏移,cfgparam修改参数。这是最直接、可靠的调试接口。 - Telnet:在
MQX1588DEMO.h中开启MQX1588DEMOCFG_ENABLE_TELNET_SERVER后,可以通过网络Telnet到设备IP,获得一个与串口完全相同的命令行界面。适合远程调试。 - HTTP网页服务器:开启
MQX1588DEMOCFG_ENABLE_WEBSERVER后,可以通过浏览器访问设备IP。网页提供了图形化的偏移量显示(需要安装ActiveX组件,现代浏览器可能不支持,但可查看数据)和配置界面。这对于展示和简单监控非常直观。 - IXXAT PTPManager(专业工具):这是一个运行在PC上的Windows软件,可以扫描网络中的所有PTP设备,并以图形化方式展示主从关系、偏移量、路径延迟等详细信息。它使用PTP的管理报文与设备通信,是进行深度协议分析和网络调试的利器。
6. 系统实测、问题排查与精度优化
硬件连接正确、软件编译下载后,真正的挑战才刚刚开始:让系统跑起来,并达到理想的同步精度。
6.1 硬件连接与基础测试
- 硬件连接:使用网线将TWR-K60N512板卡的以太网口与一台运行着PTP主时钟软件(可以是另一块K60板卡,或运行Linux with
ptp4l的PC)的设备连接到同一台二层交换机上。务必使用交换机而非集线器,且避免经过路由器,以减少网络不对称延迟。 - 上电与网络检查:给板卡上电,通过串口查看启动日志。使用
netstat命令确认网络接口已正确初始化并获取到IP地址(如果是DHCP)或使用了静态IP。尝试ping通你的主时钟设备。 - 启动PTP:在串口执行
ptp on。观察输出,看设备是否识别到网络中的主时钟。通过show on命令,可以持续观察offset(偏移)和delay(延迟)的值。
6.2 同步状态分析与常见问题排查
在理想情况下,你会看到offset的绝对值从一个大数(如几毫秒)迅速减小,并最终在正负几百纳秒甚至更小的范围内波动。delay值则相对稳定,反映了物理链路的传输时间(通常在几十到几百微秒量级,取决于交换机性能)。
以下是几种常见问题及排查思路:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
show命令无输出或offset为0 | PTP引擎未成功启动或未找到主时钟。 | 1. 确认已执行ptp on。2. 检查网络物理连接和IP连通性( ping)。3. 确认主时钟设备已启动并在发送PTP报文(可用Wireshark抓包验证)。 4. 检查 cfgparam中的domNmb是否与主时钟在同一域。 |
offset值巨大且不收敛 | 网络延迟不对称,或硬件时间戳未生效。 | 1.检查网络拓扑:确保主从设备直连或通过同一台低延迟交换机连接,避免复杂路由。 2.验证时间戳:检查代码中是否成功使能了MAC-NET的硬件时间戳功能,驱动中断是否正常触发。可以尝试在时间戳中断服务程序中添加调试输出。 3.检查时钟源:确认K60系统时钟和MAC-NET的1588定时器时钟配置正确。 |
offset在小范围内周期性跳动 | 这是正常现象,反映了时钟晶振的短期抖动和网络延迟的微小变化。 | 观察跳动的幅度(峰峰值)。如果能在±100纳秒以内,说明同步效果已经非常好。可以通过调整PTP协议栈内部的滤波算法参数(通常库中已优化)来进一步平滑。 |
同步后offset缓慢漂移 | 从时钟的本地晶振与主时钟频率存在长期漂移(drift)。 | PTP协议会持续计算频率偏差并进行补偿。show命令中的meanDrft项显示了当前的漂移率(皮秒/秒)。一个稳定的负值表示从时钟比主时钟慢,需要加速补偿。这是正常的工作过程。 |
| Telnet或HTTP无法连接 | 相应服务未启用或网络防火墙阻止。 | 1. 确认MQX1588DEMO.h中对应的ENABLE宏已定义为1并重新编译。2. 确认PC和板卡在同一子网,或路由可达。 3. 暂时关闭PC的防火墙进行测试。 |
6.3 精度优化实践
要达到最佳的亚微秒级同步,除了正确的硬件连接和软件配置,还有一些优化技巧:
- 中断与任务优先级优化:确保MAC接收中断和PTP任务具有足够高的优先级。避免低优先级任务长时间关中断或占用CPU,导致时间戳读取或协议处理被延迟。
- 网络优化:
- 使用专用网络:为PTP流量划分独立的VLAN或使用专用物理网络,避免其他大数据量业务(如文件传输)造成的网络拥塞和队列延迟。
- 选择支持PTP的交换机:普通交换机的存储转发(Store-and-Forward)机制会引入可变延迟。如果条件允许,使用支持PTP透明时钟(Transparent Clock)或边界时钟(Boundary Clock)的工业交换机,它们能测量并补偿报文在交换机内的驻留时间,大幅提升多跳网络的同步精度。
- 板级硬件优化:
- 时钟源:K60的1588定时器时钟通常由外部或内部PLL提供。使用更稳定、更低抖动的有源温补晶振(TCXO)作为系统时钟源,可以从根本上改善本地时钟的稳定性。
- PCB布局:确保以太网PHY芯片的时钟线、数据线走线规范,减少信号完整性问题和串扰,这有助于PHY更稳定地工作,减少误码和重传。
- 软件配置微调:
- 同步间隔:适当缩短
syncIntv(如设为-2,即250ms一次)可以加快收敛速度并对抗更快的时钟漂移,但会增加网络和CPU负载。需根据实际应用权衡。 - 滤波参数:IXXAT协议栈内部有滤波算法来处理时间戳数据。除非非常了解算法细节,否则不建议修改默认参数。不恰当的滤波会导致系统响应迟钝或不稳定。
- 同步间隔:适当缩短
在我实际调试一个多节点系统时,曾遇到一个棘手问题:其中一个从节点的offset始终比其它节点大1微秒左右,且非常稳定。使用PTPManager抓包分析,发现该节点与主时钟之间的delay值对称性很好。最终排查发现,是连接这个从节点的网线质量稍差,导致PHY芯片在协商速率/双工模式后,自身内部处理延迟(PHY latency)与其他节点存在微小差异。这种固定偏移可以通过PTP协议计算出的offset直接补偿掉,因此不影响同步精度,但提醒我们物理链路的均一性也很重要。
最后,验证精度最直接的方法是用示波器测量。将主时钟和从时钟的PPS(每秒脉冲)输出信号(如果硬件支持)接到示波器的两个通道,观察两个上升沿之间的时间差。一个稳定同步的系统,这个时间差应该被控制在数十纳秒的噪声范围内。通过这套基于K60和MQX的完整方案,在良好的实验室网络环境下,实现百纳秒级的长期同步精度是完全可行的。
