Преобразование мига к milli секундам

Как я вручную преобразовываю миг в миллисекунды и наоборот в Linux? Я знаю, что ядро 2.6 имеет функцию для этого, но я работаю над 2,4 (домашняя работа) и хотя я посмотрел на код, это использует много макро-констант, которые я понятия не имею, определяются ли они в 2,4.

43
задан Tim Post 28 April 2010 в 19:35
поделиться

2 ответа

Как сказано в предыдущем ответе, скорость, с которой jiffies увеличивается, фиксирована.

Стандартным способом задания времени для функции, принимающей jiffies, является использование константы HZ.

Это сокращение от Герц, или количество тиков в секунду. В системе с тиком таймера, установленным на 1 мс, HZ=1000. В некоторых дистрибутивах или архитектурах может использоваться другое число (раньше было принято 100).

Стандартный способ указания количества тиков для функции - это использование HZ, например, так:

schedule_timeout(HZ / 10);  /* Timeout after 1/10 second */

В большинстве простых случаев это работает нормально.

2*HZ     /* 2 seconds in jiffies */
HZ       /* 1 second in jiffies */
foo * HZ /* foo seconds in jiffies */
HZ/10    /* 100 milliseconds in jiffies */
HZ/100   /* 10 milliseconds in jiffies */
bar*HZ/1000 /* bar milliseconds in jiffies */

Последние два варианта имеют небольшую проблему, однако, поскольку в системе с таймером, тикающим 10 мс, HZ/100 равно 1, и точность начинает страдать. Вы можете получить задержку в диапазоне от 0,0001 до 1,999 тиков таймера (0-2 мс, по сути). Если вы попытаетесь использовать HZ/200 в системе с тиком 10 мс, целочисленное деление даст вам 0 джиффи!

Поэтому эмпирическое правило гласит: будьте очень осторожны, используя HZ для крошечных значений (приближающихся к 1 джиффи).

Чтобы преобразовать в другую сторону, вы должны использовать:

jiffies / HZ          /* jiffies to seconds */
jiffies * 1000 / HZ   /* jiffies to milliseconds */

Не стоит ожидать ничего лучшего, чем миллисекундная точность.

45
ответ дан 26 November 2019 в 22:59
поделиться

Jiffies жестко запрограммированы в Linux 2.4. Проверьте определение HZ , которое определено в архитектурно-зависимом param.h . Часто это 100 Гц, то есть один тик каждые (1 сек / 100 тиков * 1000 мс / сек) 10 мс.

Это верно для i386, а HZ определено в include / asm-i386 / param.h .

В include / linux / time.h есть функции, называемые timespec_to_jiffies и jiffies_to_timespec , где вы можете конвертировать туда и обратно между struct timespec и jiffies :

    #define MAX_JIFFY_OFFSET ((~0UL >> 1)-1)

    static __inline__ unsigned long
    timespec_to_jiffies(struct timespec *value)
    {
            unsigned long sec = value->tv_sec;
            long nsec = value->tv_nsec;

            if (sec >= (MAX_JIFFY_OFFSET / HZ))
                    return MAX_JIFFY_OFFSET;
            nsec += 1000000000L / HZ - 1;
            nsec /= 1000000000L / HZ;
            return HZ * sec + nsec;
    }

    static __inline__ void
    jiffies_to_timespec(unsigned long jiffies, struct timespec *value)
    {
            value->tv_nsec = (jiffies % HZ) * (1000000000L / HZ);
            value->tv_sec = jiffies / HZ;
    }

Примечание: Я проверял эту информацию в версии 2.4.22.

15
ответ дан 26 November 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: