gettimeofday и time() переходят на BeagleBone - timesyncd?
У меня есть задачи, которые должны выполняться с достаточно точными интервалами в пределах одной секунды.
Я использую gettimeofday(), чтобы установить start_usec. После выполнения задачи вызывается функция timedSleep(). timedSleep () вызывает gettimeofday() для вычисления времени ожидания в микросекундах, увеличивает переменную start_usec вызывающей функции, затем вызывает usleep().
Он работает отлично, за исключением того, что примерно раз в минуту он "пропускает" - функция timedSleep возвращается через одну секунду (насколько я могу судить), но gettimeofday возвращает значение, которое на три или четыре секунды впереди.
Вот фрагмент кода с последующим выводом. В последней строке время продвинулось примерно на четыре секунды, но фактическое прошедшее время составило всего одну секунду.
BeagleBone работает с дистрибутивом Debian, который использует timesyncd. Может ли это быть причиной такого поведения?
struct timeval now;
gettimeofday(&now,NULL);
printf("Start: %02d %06d Now: %02d %06d... ",(int)((start_usec / 1000000) %100), (int)(start_usec % 1000000), now.tv_sec %100, + now.tv_usec);
// Sleep for desired interval
shm.timedSleep(rule_id, &start_usec);
gettimeofday(&now,NULL);
printf("%02d %06d ",now.tv_sec %100, + now.tv_usec);
time(&curtime);
loctime = localtime(&curtime);
strftime(msgbuff, sizeof(msgbuff), "%Y-%m-%dT%H:%M:%S",loctime);
printf("%s\n",msgbuff);
Start: 78 117538 Now: 04 355933... 05 354979 2017-11-15T13:58:25
Start: 79 117538 Now: 05 355818... 06 354980 2017-11-15T13:58:26
Start: 80 117538 Now: 06 355816... 07 354981 2017-11-15T13:58:27
Start: 81 117538 Now: 07 355819... 08 354981 2017-11-15T13:58:28
Start: 82 117538 Now: 08 355819... 09 354979 2017-11-15T13:58:29
Start: 83 117538 Now: 09 355232... 10 354838 2017-11-15T13:58:30
Start: 84 117538 Now: 10 355776... 14 041276 2017-11-15T13:58:34
Этот BeagleBone имеет внешний RTC, который, кажется, хорошо:
root@vesta:/usr/local/vesta/bbb/src# timedatectl
Local time: Wed 2017-11-15 14:24:06 EST
Universal time: Wed 2017-11-15 19:24:06 UTC
RTC time: Wed 2017-11-15 19:24:06
Time zone: America/New_York (EST, -0500)
Network time on: yes
NTP synchronized: no
RTC in local TZ: no
1 ответ
ОК - это время синхронизации Системные часы BeagleBone мучительно медленны, а timesyncd сбивает их на несколько секунд каждую минуту или около того. Остановка timesyncd устраняет проблему. Сейчас исследуем ntp как альтернативу.