使用CLOCK_REALTIME的内核4.X的纳秒精度可变定时器

时间:2017-02-07 18:24:36

标签: c linux timer linux-kernel kernel

我一直在计时器上工作一段时间,但仍然无法为我的情况找到一个有希望的解决方案。

基本上,我想在特定时间发送数据包。 例如:

1st PACKET at 1486500720.000000000

- >等待 - >了nanosleep(1000000000)

2nd PACKET at 1486500721.000000000

- >等待 - >了nanosleep(1000000000)

3rd PACKET at 1486500722.000000000

- >等待 - >了nanosleep(1000000000)

4th PACKET at 1486500723.000000000

它们之间的时间间隔恰好是1.000000000秒,但是当我发送数据包时,每次都需要不同的时间。

例如对于第一个数据包,发送它然后纳米睡眠开始需要0.005025045秒。

所以,我的第二个数据包是在486500721.005025045而不是1486500721.000000000发送的。

因此,每次我必须通过使用clockgettime(CLOCK_REALTIME)通过减去包含getime命令开销偏移的剩余时间来调整nanosleep值。

因为我必须在一个具有纳秒精度的循环中(我知道这是不可能的,但我希望它尽可能具体),我使用简单的for循环。

我的问题是有更好的方法来更精确地做到这一点吗?我在内核4.4上,所以您是否知道任何适用于新内核的方法或任何其他可能比我更精确的方法?

1 个答案:

答案 0 :(得分:0)

你应该使用clock_nanosleep,它允许绝对时间等待,而不是nanosleep,它只使用相对时间。但是,你无法获得所要求的精确度。在时钟到期后返回用户空间即使不是一千个或更多,也将花费至少几百纳秒。然后,在你醒来之后发送数据包也会有不可预测的延迟。

充其量,你可能能够将你的唤醒时间调整到足够“足够接近”的目的。