CLOCK_MONOTONIC与CLOCK_MONOTONIC_RAW截断值

时间:2014-08-30 14:35:06

标签: c linux raspberry-pi precision timing

我正在编写一些需要纳秒分辨率的测试代码。当我使用带有CLOCK_MONOTONIC的clock_gettime时,我得到一个我期望的值:3327.874384321。 当我使用带有CLOCK_MONOTONIC_RAW的clock_gettime时,我得到一个我不期望的值:3327.875723000

我在循环中运行它,并且返回的所有值都具有纳秒分辨率“截断”,000。

uname的输出-a:Linux raspberrypi 3.12.22+#691 PREEMPT Wed Jun 18 18:29:58 BST 2014 armv6l GNU / Linux

对正在发生的事情的想法?怎么解决? 我目前正在考虑禁用NTP,所以我可以使用CLOCK_MONOTONIC

1 个答案:

答案 0 :(得分:2)

我认为CLOCK_MONOTONIC_RAW被“截断”的结论是错误的。相反,硬件时钟源的分辨率可能只有几微秒。您在CLOCK_MONOTONIC中看到的非零低位数是因为通过adjtime / NTP进行的调整来缩放硬件时钟源的时间戳,以纠正硬件时钟速率的不精确性。否则让它相对于实时漂移。

要测试此假设,您应该使用CLOCK_MONOTONIC获取大量计时器样本,并查找低位数的模式。我怀疑你会发现你所有的时间戳都相差一些纳秒数的倍数接近但不完全 1000,例如可能是995或1005左右。