繁体   English   中英

将linux时间设置为毫秒精度

[英]Set linux time to millisecond precision

我有一个嵌入式Linux设备,通过串行通信协议与另一个“主”设备连接。 主设备定期将其日期传递给从设备,因为稍后从设备将向主设备返回需要准确加时间戳的信息。 但是,Linux'date'命令仅将系统日期设置为第二精度。 这对我们的用途来说还不够。

有谁知道如何设置Linux机器的时间比1秒钟更精确?

其他答案中给出的settimeofday(2)方法存在严重问题:它完全按照您的意思执行。 :)

直接改变系统时间的问题在于,如果调整结果为负,它可能会混淆在变更之前和之后获得时间的程序。 也就是说,他们可以感知时间倒退。

对此的修复是adjtime(3) ,它简单易用,或者adjtimex(2) ,它复杂,功能强大且特定于Linux。 这两个调用都使用复杂的算法在一段时间内缓慢调整系统时间,仅向前调整,直到达到所需的更改。

顺便问一下,你确定你不是在这里重新发明 轮子吗? 我建议您阅读Julien Ridoux和Darryl Veitch的ACM Queue论文“互联网上的稳健时序原理” 你正在研究嵌入式系统,所以我希望图5中的振铃可以让你感到寒冷。 你能说“阻尼振荡器吗?” adjtime()adjtimex()使用这个麻烦的算法,所以在某种意义上我反对我自己的建议,但Mills算法仍然比步调整非算法更好。 如果您选择实施RADclock,那就更好了。

settimeofday()系统调用采用并使用微秒精度。 你将不得不编写一个简短的程序来使用它,但这非常简单。

struct timeval tv;
tv .tv_sec = (some time_t value)
tv .tv_usec = (the number of microseconds after the second)
int rc = settimeofday (&tv, NULL);
if (rc)
        errormessage ("error %d setting system time", errno);
  • 您可以使用settimeofday(2)系统调用; 该接口支持微秒级分辨率。

     #include <sys/time.h> int gettimeofday(struct timeval *tv, struct timezone *tz); int settimeofday(const struct timeval *tv, const struct timezone *tz); struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ }; 
  • 您可以使用clock_settime(2)系统调用; 接口提供多个时钟,接口支持纳秒级分辨率。

     #include <time.h> int clock_getres(clockid_t clk_id, struct timespec *res); int clock_gettime(clockid_t clk_id, struct timespec *tp); int clock_settime(clockid_t clk_id, const struct timespec *tp); struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; CLOCK_REALTIME System-wide real-time clock. Setting this clock requires appropriate privileges. CLOCK_MONOTONIC Clock that cannot be set and represents monotonic time since some unspecified starting point. CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific) Similar to CLOCK_MONOTONIC, but provides access to a raw hardware-based time that is not subject to NTP adjustments. CLOCK_PROCESS_CPUTIME_ID High-resolution per-process timer from the CPU. CLOCK_THREAD_CPUTIME_ID Thread-specific CPU-time clock. 

    这个接口提供了clock_getres(2)调用的clock_getres(2) ,它可以准确地告诉你分辨率什么 - 只是因为接口接受纳秒并不意味着它实际上可以支持纳秒分辨率。 (我有一个模糊的内存,20 ns是关于许多系统的限制,但没有参考支持这个。)

如果您通过串行链路运行支持IP的网络协议(例如,ooh,PPP),您可以在“主”主机上运行ntpd,然后在嵌入式设备上使用ntpd或ntpdate同步时间。 NTP会照顾你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM