2016-12-06 3 views
1

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

#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; 
} 

Вот образец раз:

[email protected]:~$ gcc clock.c -o clock_x86 -static -lrt 
[email protected]:~$ ./clock_x86 
0 s, 221 ns 


[email protected]:~$ mipsel-openwrt-linux-gcc clock.c -lrt -static -o clock_mips 
<...scp...> 
[email protected]:~# ./clock_mips 
0 s, 3000 ns 

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

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

ответ

2

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

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

В принципе, вам необходимо позвонить clock_getres(), чтобы определить, на что собственно разрешено исполнение. Не делайте ничего, что предполагает, что оно более зернистое, чем 20 мс.

+0

Это помогает. Когда вы упоминаете «спецификация реализации», ссылаетесь ли вы на ядро? То есть, если мне нужно лучшее разрешение, я сосредоточусь на поиске ядра, которое реализует эти таймеры по-разному? – djh

2

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

Позвоните по телефону clock_getres, чтобы запросить разрешение часов.

Смежные вопросы