稳定时钟系统范围是否稳定?



我正在使用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和steady_clock似乎都没有提供我需要的东西。System_clock是一致的,但它不是单调的。稳定的时钟在单个进程中是单调且一致的,但据我所知,它在整个系统中不一致?还是吗?

steady_clock

更适合测量间隔。

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

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

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

纪元将从 将更改为c++20

system_clock测量 Unix 时间(即自 00:00:00 以来的时间 协调世界时 (UTC),1970 年 1 月 1 日,星期四,不是 计算闰秒)。[自 C++20 起]

您可以使用内核数据包时间戳,请参阅SO_TIMESTAMP系列:

用于接收网络包时间戳的接口包括:

  • SO_TIMESTAMP

    为每个传入数据包生成时间戳(不一定 单调)系统时间。通过 recvmsg() 在 控制 USEC 解析中的消息。 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 分辨率中的结构时间规范。 SO_TIMESTAMPNS定义为SO_TIMESTAMPNS_NEW或SO_TIMESTAMPNS_OLD 基于 libc 的体系结构类型和time_t表示形式。 控制消息格式在结构时间规范中,用于SO_TIMESTAMPNS_OLD 和结构__kernel_timespec SO_TIMESTAMPNS_NEW选项 分别。

  • IP_MULTICAST_LOOP + SO_TIMESTAMP[NS]

    仅适用于组播:获得的近似传输时间戳 读取循环数据包接收时间戳。

  • SO_TIMESTAMPING

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

相关内容

最新更新