наносекунды от clock_gettime() на маршрутизаторе mips

Я пытаюсь получить наносекундное разрешение от CLOCK_REALTIME на маршрутизаторе MIPS с частотой 1 ГГц. Когда я компилирую приведенный ниже код для x86 и запускаю виртуальную машину с частотой 1 ГГц, я получаю наносекундное разрешение. Когда я компилирую для mips и запускаю на маршрутизаторе с частотой 1 ГГц, кажется, что он округляется до микросекунды.

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv, char **arge) {
  struct timespec tps, tpe;
  if ((clock_gettime(CLOCK_REALTIME, &tps) != 0)
      || (clock_gettime(CLOCK_REALTIME, &tpe) != 0)) {
    perror("clock_gettime");
    return -1;
  }
  printf("%lu s, %lu ns\n", tpe.tv_sec-tps.tv_sec,
     tpe.tv_nsec-tps.tv_nsec);
  return 0;
}

Вот примерное время:

vagrant@vagrant-ubuntu-trusty-64:~$ gcc clock.c -o clock_x86 -static -lrt
vagrant@vagrant-ubuntu-trusty-64:~$ ./clock_x86
0 s, 221 ns


vagrant@vagrant-ubuntu-trusty-64:~$ mipsel-openwrt-linux-gcc clock.c -lrt -static -o clock_mips
<...scp...>
root@OpenWrt:~# ./clock_mips
0 s, 3000 ns

Есть ли что-то, что я неправильно понимаю о часах, MIPS, процессорах и т. д.? Я ожидаю, что вызов CLOCK_REALTIME произведет наносекундную гранулярность/разрешение, независимо от архитектуры процессора.

Кроме того, если бы кто-нибудь мог пролить свет на то, как реализованы эти таймеры POSIX и как они получают свои измерения, я был бы признателен.


person djh    schedule 06.12.2016    source источник


Ответы (2)


Гарантированная гранулярность часов указана как минимум 20 мс в POSIX.1. -2008. Вот фрагмент, который является уместным:

Максимально допустимое разрешение для часов CLOCK_REALTIME и CLOCK_MONOTONIC и всех служб времени, основанных на этих часах, представлено {_POSIX_CLOCKRES_MIN} и должно быть определено как 20 мс (1/50 секунды). Реализации могут поддерживать меньшие значения разрешения для этих часов, чтобы обеспечить более точную временную базу детализации. Фактическое разрешение, поддерживаемое реализацией для конкретных часов, получается с помощью clock_getres(). функция. Если фактическое разрешение, поддерживаемое для службы времени на основе одного из этих часов, отличается от разрешения, поддерживаемого этими часами, реализация должна задокументировать это различие.

По сути, вам нужно вызвать clock_getres(), чтобы определить, какая реализация -указанное разрешение действительно есть. Не делайте ничего, что предполагает, что это более гранулярно, чем 20 мс.

person D.Shawley    schedule 06.12.2016
comment
Что помогает. Когда вы упоминаете конкретную реализацию, вы имеете в виду ядро? То есть, если мне нужно лучшее разрешение, должен ли я сосредоточиться на поиске ядра, которое по-другому реализует эти таймеры? - person djh; 06.12.2016

минимальное разрешение, поддерживаемое clock_gettime, составляет наносекунды. Но нет никакой гарантии, что разрешение системных часов (или реализация этой функции) будет выше или ниже этого значения.

Вызовите clock_getres, чтобы запросить разрешение часов.

person paddy    schedule 06.12.2016