Как я вручную преобразовываю миг в миллисекунды и наоборот в Linux? Я знаю, что ядро 2.6 имеет функцию для этого, но я работаю над 2,4 (домашняя работа) и хотя я посмотрел на код, это использует много макро-констант, которые я понятия не имею, определяются ли они в 2,4.
Как сказано в предыдущем ответе, скорость, с которой 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 */
Не стоит ожидать ничего лучшего, чем миллисекундная точность.
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.