稳定时钟稳定系统范围宽吗?

时间:2019-06-20 17:14:00

标签: c++ c++11 time

我正在使用FastRTPS在单个Linux系统上的多个进程之间进行通信。他们正在交换数据包中的信息。每个数据包都有一个独立于其发送或接收时间的时间戳。这样,可以正确使用所传达的信息。

我正在考虑使用:

uint64_t time_in_microseconds = std::chrono::duration_cast
          <std::chrono::microseconds>(std::chrono::steady_clock::now()
          .time_since_epoch()).count(); 

获取数据包的时间戳。

但是,单个系统上各个进程之间的稳定时钟是否稳定?还是仅在单个过程中?

如果没有,正常情况下系统时钟变化多少?它会“移回”多少时间? (不手动调整,没有互联网连接,没有时间更改等)

谢谢

编辑:

这些数据包将用于状态估计和控制算法。传感器数据将例如从传感器读取过程移至状态估计过程。状态信息将从估计过程转移到控制过程。这就是为什么我需要能够在整个系统中一致地测量间隔。 system_clock和stable_clock似乎都不能提供我需要的东西。 System_clock是一致的,但不是单调的。而且稳定时钟在一个进程中是单调​​且一致的,但是据我所知,它在整个系统中不一致吗?还是?

2 个答案:

答案 0 :(得分:4)

steady_clock更适合于测量间隔。

  

std :: chrono :: steady_clock表示单调时钟。时间   随着物理时间向前移动,此时钟的点数不会减少   并且此时钟的滴答声之间的时间是恒定的。这个时钟是   与挂钟时间无关(例如,它可能是自上次以来的时间   重新启动),最适合测量间隔。

system_clock是系统范围的,可能是您需要的,但可能不是单调的:

  

std :: chrono :: system_clock类表示系统范围的实时   挂钟。它可能不是单调的:在大多数系统上,系统时间   可以随时调整。这是唯一具有   能够将其时间点映射到C风格的时间,因此   显示 [直到C ++ 20]

时期将从更改为c++20

  

system_clock测量Unix时间(即从00:00:00开始的时间   1970年1月1日,星期四,世界协调时间(UTC),   计算leap秒)。 [自c ++ 20起]

答案 1 :(得分:1)

您可以使用内核数据包时间戳,请参见SO_TIMESTAMP family

  

用于接收网络软件包时间戳记的接口是:

     
      
  • SO_TIMESTAMP

         

    为每个传入的数据包生成时间戳(不一定是   单调)系统时间。通过recvmsg()报告时间戳   控制消息的使用分辨率。   SO_TIMESTAMP定义为SO_TIMESTAMP_NEW或SO_TIMESTAMP_OLD   基于libc的体系结构类型和time_t表示形式。   控制消息格式在结构__kernel_old_timeval中,用于   SO_TIMESTAMP_OLD和结构__kernel_sock_timeval中的   分别是SO_TIMESTAMP_NEW选项。

  •   
  • SO_TIMESTAMPNS

         

    时间戳机制与SO_TIMESTAMP相同,但会报告   时间戳作为以nsec分辨率表示的struct timespec。   SO_TIMESTAMPNS定义为SO_TIMESTAMPNS_NEW或SO_TIMESTAMPNS_OLD   基于libc的体系结构类型和time_t表示形式。   控制消息格式在SO_TIMESTAMPNS_OLD的struct timespec中   并在结构__kernel_timespec中使用SO_TIMESTAMPNS_NEW选项   

  •   
  • IP_MULTICAST_LOOP + SO_TIMESTAMP [NS]

         

    仅适用于多播:   读取循环的数据包接收时间戳。

  •   
  • SO_TIMESTAMPING

         

    生成接收,传输或两者的时间戳。支持   多个时间戳记源,包括硬件。支持生成   流套接字的时间戳。

  •