Как я могу сделать паузу на 100+ миллисекунд в модуле драйвера Linux?

Я пишу драйвер ядра для устройства, которое периодически производит регулярные объемы данных для чтения. Программа пользовательского пространства идеально подходит для того, чтобы сделать этот блокирующий драйвер.

Какие методы доступны для приостановки драйвера на время от 4 до 100 мс (т. е. выполнение "блокировки")? В пользовательском пространстве я бы сделал что-то вроде:

tv.tv_sec  = microsecond_delay / 1000000ul;
tv.tv_usec = microsecond_delay % 1000000ul;
(void)select(0, NULL, NULL, NULL, & tv);

or

gettimeofday(tv,NULL);

и сравните конструкции.

[Изменить - мой собственный ответ]

Я буду использовать следующий код в своем драйвере:

#include <linux/jiffies.h>
...
schedule_timeout(file->private_data->my_driver_struct.read_pause_jiffies);

Вуаля! сейчас буду тестить...


person Jamie    schedule 09.09.2011    source источник
comment
Ответы приветствуются, но я только что нашел это   -  person Jamie    schedule 10.09.2011
comment
На самом деле это не то, что я ищу: я хочу спать в определенное время, а не создавать событие асинхронного таймера.   -  person Jamie    schedule 10.09.2011
comment
Нашел: extern signed long schedule_timeout(signed long timeout);   -  person Jamie    schedule 10.09.2011
comment
Возможный дубликат Как спать в ядре Linux?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 16.06.2017
comment
@CiroSantilli709大抓捕六四事件法轮功 Проверьте дату. Я первый спросил.   -  person Jamie    schedule 21.06.2017
comment
привет, текущий консенсус заключается в том, чтобы закрыть по качеству: -much-newer-and-ha" title="следует ли мне проголосовать за закрытие повторяющегося вопроса, даже если он намного новее и ha">meta.stackexchange.com/questions/147643/ Поскольку качество не поддается измерению, я просто проголосуйте за. ;-) Скорее всего, все сводится к тому, какой вопрос попал в лучшие ключевые слова Google для новичков в заголовке.   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 21.06.2017


Ответы (1)


Использование schedule_timeout НЕ засыпает в течение указанного времени, а в течение минимального указанного времени. Если вы действительно хотите блокировать на определенное время, вам придется использовать блокировки. Сон гарантирует вам только минимальное время — это может не иметь значения для вас, в зависимости от того, какая степень детализации вам нужна. Но лучший водитель в любом случае будет спать, пока читатель не запросит больше данных.

person adrianmcmenamin    schedule 09.09.2011
comment
Ладно... замки, поищу. Но детализация будет, какая? +- 10 мс? (Кстати: ваш ответ больше похож на комментарий, чем на ответ) - person Jamie; 10.09.2011
comment
... и указатель на что-то, касающееся моего вопроса, и ваше предложение использовать блокировки будут очень признательны. Или, что лучше (гораздо лучше :)), ответ с тремя-четырьмя строками соответствующего API-кода! - person Jamie; 10.09.2011