Newsgroup: it.comp.os.linux.sys
Titolo: Sleep in un kernel thread

Salve a tutti
Sono nuovo del mondo Linux. Sto sviluppando un driver per controllare
un particalore segnale che varia molto rapidamente. Per fare questo ho
bisogno di creare un thread dedicato che ogni 20 millisecondi
controlli se questo segnale è cambiato o meno. Ho letto il libro su
come fare un Kernel driver e cercando in Internet ho trovato un
esempio per creare un thread a livello kernel:
static pid_t khubd_pid = 0;
static DECLARE_COMPLETION(khubd_exited);
static int input_check_thread(void* arg)
{
	daemonize("khubd");
	allow_signal(SIGKILL);
	do 
	{
		// SIGNAL CHECKING CODE
		// SLEEP FOR 20 MILLISECOND
	} while(!signal_pending(current));
	complete_and_exit(&khubd_exited, 0);
}
init_module()
{
	khubd_pid = kernel_thread(input_check_thread, NULL,
CLONE_KERNEL));
}
cleanup_module()
{
	kill_proc(khubd_pid, SIGKILL, 1);
	wait_for_completion(&khubd_exited);
}
E' corretto questo metodo? Il mio problema comunque è che non riesco a
trovare una funzione che forzi il thread a "dormire" per il tempo
necessario. Inizialmente ho provato con la funzione msleep(20) ma non
sembra funzionare all'interno del thread. Qualcuno sa come fare?
Grazie a tutti
P.S. Tanto per sapere, qualcuno conosce un libro o un sito web dove è
possibile trovare una lista organizzata di tutte le funzioni
disponibili a livello kernel (tipo MSDN per capirsi)?

 disponibili a livello kernel (tipo MSDN per capirsi)?
Non stile MSND. C'e` Linux Kernel Development di R. Love che da
un'overview. Oppure LDD3 (Rubini, Corbet, Kroah-Hartman), più centrato
sullo sviluppo di driver e disponibile gratuitamente (e legalmente :P)
in rete.
Oltre ovviamente a tutta la documentazione che accompagna il kernel
(make htmldocs o make pdfdocs).
Luca
-- 
Home: 
http://kronoz.cjb.net

Fabio wrote:
[...]
Interessante problema, io pero` mi attaccherei ad un qualche
timer, credo che sia piu` affidabile.
bye,
-- 
piergiorgio

 controlli se questo segnale è cambiato o meno. Ho letto il libro su
sparo : e' un controller ASI ? :P

 esempio per creare un thread a livello kernel:
stai facendo polling. è il male :)
non riesci a sfruttare gli interrupt?

(make htmldocs o make pdfdocs).
Ecco, questo č gia piu utile :-)
Grazie

non riesci a sfruttare gli interrupt?
Purtroppo no. Devo fare un driver che gira su un hardware embedded. A
questo hardware è attaccata una pulsantiera, quando un tasto viene
premuto l'hardware notifica la pressione con un cambiamento di stato
di un bit (diverso a seconda dei tasti) leggibile attraverso
un'operazione di input da una porta (_inp()), quindi io devo
monitorizzare costantemente questa porta e segnalare eventuali
cambiamenti, praticamente simulo un piccolo controller di tastiera....
Io ho trovato questa soluzione, se qualcuno ha qualche altra idea ogni
consiglio è ben accetto.....  :-)

 gira in continuazione provocando l'impallamento... sbaglio?
msleep() non dovrebbe dare problemi. Usa sysrq-t per vedere dove e`
bloccato insmod.
Luca
-- 
Home: 
http://kronoz.cjb.net
"Sei l'unica donna della mia vita".
(Adamo)

 un'operazione di input da una porta (_inp())
Che brutto hardware! Non c'è proprio modo di fargli generare un interrupt?
Che controller usa? Chi l'ha progettato?
Ciao,
-- 
 Daniele Orlandi                                                        つづく

Che controller usa? Chi l'ha progettato?
L'hardware è stato progettato dall'azienda per cui lavoro. Questo
meccanismo viene generato da una logica inclusa nella scheda. Tuttavia
oggi ha fatto presente le vostre annotazioni riguardo al polling e li
ho convinti ad aggiungere la generazione di un interrupt che mi
segnali il cambio di stato dei bit. Io sono un programmatore Windows
che si sta lentamente orientando verso Linux e quindi è probabile che
vi farò altre domande in futuro. Se posso cerco di non disturbare e
fare da me però il mio problema, almeno per ora, è che non riesco a
trovare una lista di tutte le possibili chiamate disponibili in Linux,
sia per il livello user che per il livello kernel quindi non ho modo
di sapere cosa posso e non posso fare. Ho provato a generare la
documentazione con make htmldocs come mi era stato indicato in un post
precedente ma, per esempio, nella documentazione generata la parte
relativa ai thread a livello kernel non c'è. Cercando in internet si
trovano molte fonti, ma la maggior parte sono troppo vage dato che
danno per scontato che si conoscia gia l'ambiente di sistema e le
informazioni sono veramente troppo sparse. Nella fattispecie mi hanno
fatto molto comodo una sierie di articoli che ho trovato sul sito
della IBM che comparavano alcune API di Windows alle corrispondenti
funzioni di Linux mostrando due frammenti di codice che facevano la
stessa cosa in versione Windows e Linux. Questo genere di approccio mi
è molto servito, a questo proposito volevo chiedere se qualcuno
conosce un buon libro (anche in inglese) che spieghi la programmazione
Linux utilizzando proprio questo approccio.
Grazie

kthread_create() con kthread_run().
Per adesso sembra funzionare tutto bene, grazie per l'aiuto, spero di
poter riciambiare un giorno (che, mi sa, sarà parecchio lontano però)
:-)

 relativa ai thread a livello kernel non c'è.
"Linux Device Drivers"
"Inside Linux Kernel"
Sono quelli con cui sono partito e li sfoglio ogni tre per due :)
CIao,
-- 
 Daniele Orlandi                                                        つづく

"Inside Linux Kernel"
Questo non lo conosco e provvederò ad acquistarlo quanto prima :-)
Ciao e grazie per i consigli

 sistema, in attesa di avere l'interrupt faccio con questo.
Il timer è la soluzione che ti avrei consigliato. Occhio che non puoi
sleepare dentro il timer.
