Как я могу сделать паузу на 100+ миллисекунд в модуле драйвера linux? - PullRequest
10 голосов
/ 10 сентября 2011

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

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

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

или

gettimeofday(tv,NULL);

и сравнил бы структуры.

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

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

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

Вуаля!Я сейчас проверю ...

Ответы [ 2 ]

21 голосов
/ 14 сентября 2011
#include <linux/delay.h>

...
msleep(100);
...
1 голос
/ 10 сентября 2011

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

...