2011-09-09 9 views
8

Sto scrivendo un driver del kernel per un dispositivo che produce regolarmente quantità di dati da leggere periodicamente. Il programma spaziale dell'utente è l'ideale per rendere questo un driver di blocco.Come posso sospendere per 100+ millisecondi in un modulo del driver linux?

Quali metodi sono disponibili per la pausa ovunque da 4 a 100ms in un driver (cioè fare il "blocco ")? Nello spazio utente avrei fatto qualcosa di simile a:

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

o

gettimeofday(tv,NULL); 

e confrontare le strutture.

[Edit - la mia risposta]

Userò il seguente codice nel mio autista:

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

Voila! Verificherò ora ...

+0

Le risposte sono i benvenuti, ma ho appena trovato [questo] (http://makelinux.com/ldd3/chp-7-sect-4) – Jamie

+0

In realtà, non è quello che sto cercando: Voglio dormire un tempo specificato, non creare un evento del timer asincrono. – Jamie

+0

Trovato: 'extern signed long schedule_timeout (timeout firmato lungo);' – Jamie

risposta

18
#include <linux/delay.h> 

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

L'utilizzo di schedule_timeout NON consente di dormire per un tempo specificato ma per un tempo minimo specificato. Se si desidera veramente il blocco per un tempo specificato, sarà necessario utilizzare i blocchi. Dormire ti garantirà solo un tempo minimo, questo potrebbe non essere importante a seconda della granularità di cui hai bisogno. Ma un autista migliore avrebbe dormito fino a quando il lettore non chiedesse più dati in ogni caso.

+0

Ok ... serrature, lo cercherò. Ma la granularità sarà, cosa? + - 10 msec? (A proposito: la tua risposta è più materiale di commento che risposta) – Jamie

+0

... e un puntatore a qualcosa riguardo la mia domanda e il tuo suggerimento di usare le serrature sarebbe molto apprezzato. Oppure, meglio (molto meglio :)), una risposta con tre o quattro righe di codice API pertinente! – Jamie

Problemi correlati