我已经看过大量有关如何使用 GPS 及其 PPS 信号以及 NTP 包(例如ntpd
或chrony
)来同步计算机时钟的文档。
我有与此类似的需求,但又足够不同,以至于很难找到一个简单的解决方案。
限制条件
请注意,我的环境本质上没有互联网接入或 GPS 信号,并且正常运行时间将非常短暂,一次可能只有几个小时。请注意,在这种情况下,我们有一个板外微控制器和一个基本的 Linux 机器(可能是一些单板计算机类型的东西),最终目标是使它们同步。
微控制器连接到该 RTC(通过 I2C)和计算机(通过 USB),并将处理一些外部传感器的计时和同步。计算机从传感器获取信息并用它来做各种其他事情。 Linux机器和MCU之间的以太网连接通常是不可能的,否则我会更直接地使用PTP或NTP之类的东西。
与GPS PPS的区别
与 GPS PPS 的主要区别在于,除了同步之外,计算机还需要从微控制器串行通信中读取数据以达到我们的目的。根据我的理解,这意味着我们需要对标准gpsd
+ ntpd
/进行修改chrony
,因为这两个源(我们的应用程序和gpsd
)无法同时从同一个 USB 串行读取。
局限性
请注意,我知道这不会达到 GPS 漂移水平。我需要的是我的 MCU 和计算机之间的同步时间源,精确到一定毫秒数。我可以接受整个系统以 1-3PPM(RTC)漂移,只要一切都一起漂移。
解决方案的想法
到目前为止我的想法是基于来自外部 RTC 的 PPS 信号
- MCU 和 Linux 机器 GPIO 引脚捕获的 RTC PPS
- MCU 将(通过串行)相应的 unixstamp 发送到我们的应用程序节点(在 Linux 机器上)
然后,我们的应用程序使 PPS 信号和 unixstamp 可供使用chrony
。此时应该能够将其视为 GPS。所以我基本上是在规避,gpsd
这样我就不必共享串行端口访问权限。
这有道理吗?我几乎没有发现其他人做过类似的事情
答案1
我不确定我完全理解你的解决方案,但通常ntpd
可以工作,因为在 PC 等上。Linux 理解如何设置硬件 RTC 时钟。所以你可以
- 为 I2C 连接的 RTC 编写驱动程序,
ntpd
开箱即用 - 采用用户空间方法:当您有互联网时,为其编写挂钩脚本以便
ntpd
运行。然后ntpd
将同步内核(仅软件)时钟,然后在第二步中您可以将 I2C 连接的 RTC 与某些软件同步。反之亦然,在启动时且没有互联网时,您可以将 RTC 中的内核时钟与启动脚本中的某些内容同步。
我对你提到的 PPS 有点困惑,因为你说你没有任何 GPS。或者您的 I2C 连接 RTC 是否提供某种 PPS?仅读取时钟并不时同步内核(通过 cron 等)可能会更容易。