我有一个带WiFi的嵌入式系统(基于80MHz ESP8266,使用Arduino IDE开发),我希望它能够保持合理准确的时钟时间(一秒钟),使用它可以使用的两个工具:互联网,以及它自己的内部计时器。
挑战:
- 处理器时钟可能会随着时间的推移而漂移,表面上是一个
可预测的方式。
- NTP使用UDP,因此无法保证返回数据包的时间
按顺序返回,或在任何设定的间隔内返回,或返回
完全没有。
- 返回的延迟NTP数据包随着时间的推移而变化很大
100毫秒到(可能)几秒钟。
- DNS的延迟随着时间的推移而变化很大,从100毫秒到100毫秒不等
几秒钟(我无法控制超时)。需要DNS来查看
up NTP服务器池的IP地址。
- 系统根据特定时间采取各种行动
间隔,所以我不想过度控制时间,设置它
不断前进和后退,导致行动不必要
错过或重复(或者,使程序复杂化)
逻辑处理所有这些条件 - 偶尔错过或
复制不是关键任务)。
- 有时NTP服务器会返回错误的时间(例如,
pool.ntp.org自1900年以来偶尔会返回0秒,这很容易
检测)
- 有时会出现带有旧时间的杂散返回数据包
在当前请求的返回数据包之前。
当前方法:
- 使用每0.1触发的ISR保持本地设备时间递增
第二。
- 定期投票(目前每6分钟一次,但实际上没有
经常这是一个NTP服务器(池)。
- 如果在短暂的间隔内没有响应,请再试一次(目前为1
第二,这比典型的短,但大多数请求返回
不到150ms)。
- 每次尝试改变NTP服务器(池),以分散负载
平均响应时间和任何服务错误。
- 将时间提取到最接近的0.1秒(并调整为典型值
接收延迟)。
- 如果NTP时间偏离本地设备时间超过a
第二,更新本地设备时间(在关键部分)。
- 超时,重试并重新初始化(如果适用),失败
网络元素的过程。最希望之后抛弃请求
迷路了,下次再试一次。
是否有更好的,规范的或最佳的实践方法来进行此时间同步?我还缺少其他因素或方法吗?