Я прочитал главу 7 в «Драйверы устройств Linux» (которую можно найти здесь) , что время можно измерить в «jiffies». Проблема с переменной stock jiffies заключается в том, что она используется довольно часто (особенно, если для CONFIG_HZ установлено значение 1000).
В моем модуле ядра я сохраняю значение jiffies, которое будет установлено на некоторое время в будущем, и сравниваю его позднее с текущим значением 'jiffies'. Я уже узнал, что есть функции, которые принимают во внимание 32-битную упаковку jiffy, поэтому для сравнения двух значений я использую это:
if (time_after(jiffies, some_future_jiffies_value))
{
// we've already passed the saved value
}
Вот мой вопрос: так что теперь я хочу установить 'some_future_jiffies_value' в значение "сейчас + 10 мс". Это может быть легко достигнуто следующим образом:
some_future_jiffies_value = jiffies + msecs_to_jiffies(10);
Это правильно? Что произойдет, если текущие jiffies находятся рядом с MAX_JIFFY_OFFSET и полученное значение msecs_to_jiffies (10) помещает some_future_jiffies_value за это смещение? Это происходит автоматически или я должен добавить код, чтобы проверить это? Существуют ли функции, которые избавляют меня от необходимости иметь дело с этим?
Обновление:
Чтобы избежать неприятностей, я переписал свой цикл сна:
// Sleep for the appropriate time
while (time_after(some_future_jiffies_value, jiffies))
{
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(1);
}
Полагаю, это более переносимо, верно?
Обновление 2:
Большое спасибо 'ctuffli' за то, что вы нашли время вернуться к этому вопросу, а также предоставили некоторые отзывы о моих комментариях. Мой драйвер ядра теперь работает нормально, и он намного менее уродлив по сравнению с ситуацией до того, как вы предоставили мне все эти советы. Спасибо!