我正在使用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是一致的,但不是单调的。而且稳定时钟在一个进程中是单调且一致的,但是据我所知,它在整个系统中不一致吗?还是?
答案 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
生成接收,传输或两者的时间戳。支持 多个时间戳记源,包括硬件。支持生成 流套接字的时间戳。