2014-08-30 1 views
2

Я пишу некоторый тестовый код, где мне нужно разрешение наносекунд. Когда я использую clock_gettime с CLOCK_MONOTONIC, я получаю значение, которое я ожидаю: 3327.874384321. Когда я использую clock_gettime с CLOCK_MONOTONIC_RAW, я получаю значение, которое я не ожидал: 3327.875723000CLOCK_MONOTONIC vs CLOCK_MONOTONIC_RAW усеченные значения

Я запускать это в цикле, и все значения, возвращаемые имеют разрешение наносекунд «усеченный», 000.

Выход из uname -a: Linux raspberrypi 3.12.22+ # 691 PREEMPT Ср июн 18 18:29:58 BST 2014 armv6l GNU/Linux

Мысли о том, что происходит? Как обратиться? В настоящее время я рассматриваю возможность отключения NTP, поэтому я могу использовать CLOCK_MONOTONIC

+0

Что делает NTP? Зачем вам нужны часы RAW? –

+0

Основываясь на различных показаниях, CLOCK_MONOTONIC можно настроить с помощью NTP, создавая тем самым возможность загрязнения любого образца с помощью регулировки часов. Возможно, я неправильно понял ... Heres the stackoverflow ref: http://stackoverflow.com/questions/14270300/what-is-the-difference-between-clock-monotonic-clock-monotonic-raw – Nick

+0

Как ответы на это заданный вопрос, 'CLOCK_MONOTONIC' ** не отражает разрывов ** от установки времени или от корректировок NTP. Скорее, его скорость продвижения просто корректируется, чтобы исправить неточность аппаратной тактовой частоты по отношению к реальному времени. –

ответ

2

Я думаю, что ваш вывод о том, что CLOCK_MONOTONIC_RAW является «усеченным», является неправильным. Скорее, разрешение источника аппаратных часов, вероятно, всего лишь микросекунды. Ненулевые разряды, которые вы видите в CLOCK_MONOTONIC, связаны с тем, что временные метки из источника аппаратных часов масштабируются, за корректировки, сделанные с помощью adjtime/NTP, для исправления неточности в тактовой частоте оборудования, которая в противном случае сделала бы ее дрейфом относительно реального времени ,

Чтобы проверить эту гипотезу, вы должны взять большое количество образцов таймера с CLOCK_MONOTONIC и искать шаблон в разрядах. Я подозреваю, что вы обнаружите, что все ваши временные метки отличаются кратным некоторым количеством наносекунд близко, но не точно 1000, например. может быть, 995 или 1005 или около того.

+0

Я вижу, что вы говорите, поэтому я сделал это: \t clock_getres (CLOCK_MONOTONIC, &res); \t Е ("Монотонный разреш.:.% LLD% 9ld \ п", (длинный длинный) res.tv_sec, res.tv_nsec) ; \t clock_getres (CLOCK_MONOTONIC_RAW, &res); \t Е ("монотонна Рез сырье:% LLD% 9ld \ п..", (длинный длинный) res.tv_sec, res.tv_nsec); монотонный разреш: 0,000000001 монотонного разреша сырья: 0,000000001. Оба показывают одинаковое значение. Линусы лежат на getres? (Извините за плохое форматирование) – Nick

+0

@Nick: Похоже, что Linux лжет о разрешении ... –

+0

Еще одна возможность, хотя и не документирована, заключается в том, что 'CLOCK_MONOTONIC_RAW' может показывать не скорректированные значения для 'CLOCK_MONOTONIC_COARSE', а не для' CLOCK_MON OTONIC'. Вероятно, вам нужно будет прочитать прекрасный источник, чтобы узнать наверняка. –