2011-09-09 14 views
8

Piszę sterownik jądra dla urządzenia, które regularnie generuje dane do odczytu. Program przestrzeni użytkownika idealnie nadaje się do uczynienia tego sterownika blokującym.Jak mogę zatrzymać na ponad 100 milisekund w module sterownika Linux?

Jakie metody są dostępne dla zatrzymując się wszędzie od 4 do 100ms w sterowniku (to robi „blok”)? W przestrzeni użytkownika zrobiłbym coś w rodzaju:

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

lub

gettimeofday(tv,NULL); 

i porównać struktur.

[Edit - moja własna odpowiedź]

będę używał następujący kod w moim kierowcą:

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

Voila! Teraz przetestuję ...

+0

odpowiedzi są mile widziane, ale ja po prostu znaleźć [to] (http://makelinux.com/ldd3/chp-7-sect-4) – Jamie

+0

Właściwie nie to, czego szukam: Chcę spać w określonym czasie, nie tworzyć asynchronicznego zdarzenia licznika czasu. – Jamie

+0

Znaleziono: 'extern signed long schedule_timeout (signed long timeout);' – Jamie

Odpowiedz

18
#include <linux/delay.h> 

... 
msleep(100); 
... 
1

Korzystanie z funkcji schedule_timeout NIE spoczywa przez określony czas, ale przez określony minimalny czas. Jeśli naprawdę chcesz blokować przez określony czas, będziesz musiał użyć zamków. Spanie zagwarantuje ci tylko minimalny czas - to może nie mieć znaczenia w zależności od dużej ziarnistości, jakiej potrzebujesz. Ale lepszy sterownik będzie spał, dopóki czytelnik nie poprosi o więcej danych.

+0

Okay ... zamki, sprawdzą to. Ale co to będzie za ziarnistość? + - 10 ms? (BTW: twoja odpowiedź jest bardziej materiałem komentarzowym niż odpowiedzią) – Jamie

+0

... i wskazówka na coś odnośnie mojego pytania i twoja sugestia użycia zamków byłaby bardzo doceniana. Lub, lepiej (znacznie lepiej :)), odpowiedź z trzema lub czterema liniami odpowiedniego kodu API! – Jamie

Powiązane problemy