【问题标题】:How to periodically synchronize NTP time with local timer-based time如何定期将 NTP 时间与本地基于计时器的时间同步
【发布时间】:2017-01-18 15:09:10
【问题描述】:

我有一个带 WiFi 的嵌入式系统(基于 80MHz ESP8266,使用 Arduino IDE 开发),我希望它使用以下两种工具保持相当准确的时钟时间(到一秒):互联网,以及它自己的内部计时器。

挑战:

  • 处理器时钟可能会随着时间的推移而漂移,表面上是在一个 可预测的方式。
  • NTP 使用 UDP,因此不保证返回的数据包带有时间 按顺序返回,或在任何设定的时间间隔内返回,或返回 完全没有。
  • 返回 NTP 数据包的延迟随时间变化很大,从低于 100 毫秒到(可能)几秒钟。
  • DNS 的延迟随时间变化很大,从 100 毫秒以下到 几秒钟(我无法控制超时)。需要DNS来查看 增加 NTP 服务器池的 IP 地址。
  • 系统会根据特定时间和 间隔,所以我不想过度控制时间,设置它 不断前进和后退,导致动作不必要 遗漏或重复(或者,使程序复杂化 处理所有这些条件的逻辑 - 偶尔错过或 副本不是关键任务)。
  • 有时 NTP 服务器会返回错误的时间(例如, pool.ntp.org 自 1900 年以来偶尔会返回 0 秒,这很容易 检测)
  • 有时一个带有旧时间的杂散返回数据包会刚刚到达 在当前请求的返回数据包之前。

目前的方法:

  • 使用每 0.1 触发的 ISR 保持本地设备时间递增 第二。
  • 定期轮询(目前每 6 分钟一次,但实际上没有 经常这样)一个 NTP 服务器(池)。
  • 如果在短时间内(当前为 1 第二,比典型的要短,但大多数请求返回 150 毫秒以下)。
  • 在每次尝试时改变 NTP 服务器(池),以分散负载并 平均响应时间和任何服务错误。
  • 将时间提取到最接近的 0.1 秒(并针对典型值进行调整) 接收延迟)。
  • 如果 NTP 时间与本地设备时间相差超过一 其次,更新本地设备时间(在关键部分)。
  • 超时、重试和重新初始化(在适当的情况下),失败 过程的网络元素。最希望后放弃请求 丢失了,下次再试。

是否有更好的、规范的或最佳实践方法来执行此时间同步?我还缺少其他因素或方法吗?

【问题讨论】:

    标签: time arduino clock esp8266 ntp


    【解决方案1】:

    对于来自 Internet 或 GPS 系统的自动更新时间来说,廉价的 arduino 项目可能会过大,因为您可能需要以太网屏蔽并编写一个 TSR 程序,该程序会定期向 arduino 发送更新时间。相反,您可以购买更准确的 RTC 时钟(这些天有些变得更准确)并使用与 arduino 结合的键盘和 LED 显示屏不时手动更新时钟。如果您的项目对时间非常紧迫,那么对您来说最好是一些基于晶体的廉价解决方案。

    【讨论】:

    • 我当然考虑过 RTC,但我有很多这样的设备,而且这不是一个商业项目,所以我想最小化单位成本。我可以获得一个 ESP8266(带 WiFi),它几乎是任何其他具有内置或外部互联网功能的处理器的一小部分。这些是嵌入式数据收集设备,因此一旦部署,提取它们并手动执行任何操作都非常不方便。我认为大多数相同的设计约束都适用于任何尝试从两个不同时间源同步的系统。
    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多