【发布时间】: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