2012-09-22 11 views
8

Sto lavorando con gli interrupt di gpio. Ho un file in "/ sys/class/gpio/gpio38/value". Voglio una notifica ogni volta che c'è un cambiamento nel valore dell'attributo. Quindi, come posso ottenerlo nello spazio utente. Siccome ho già raccolto informazioni, posso usare select(), poll() o epoll(). Quindi quale è corretto per questa applicazione? Oppure, per favore suggeriscimi se posso usare/proc/irq o qualcosa del genere. Grazie :)select(), poll() o epoll()? per l'attributo sysfs

risposta

2

Ho trovato qualcosa here che può essere di aiuto:

segnali GPIO avere percorsi come/sys/class/GPIO/gpio42/(per GPIO # 42) e hanno i seguenti lettura/scrivere attributi:

"valore" ... legge come 0 (basso) o 1 (alto). Se GPIO è configurato come uscita, questo valore può essere scritto; qualsiasi valore diverso da zero viene considerato alto.

Se il perno può essere configurato come interrupt generatrice interrupt e se è stato configurato per generare interrupt (vedere la descrizione di "edge"), è possibile interrogare (2) su tale file e poll (2) ritornerà ogni volta che viene attivato l'interrupt. Se si utilizza il polling (2), impostare gli eventi POLLPRI e POLLERR. Se si utilizza select (2), impostare il descrittore di file in exceptfds. Dopo il il poll (2) ritorna, lseek (2) all'inizio del file sysfs e leggere il nuovo valore o chiudere il file e riaprirlo per leggere il valore.

Anche se si dice che è per "gpio42", immagino che questo possa applicarsi al tuo caso. In caso contrario, scrivi un commento nella mia risposta.

+0

grazie @ tony-the-leone, e 'significa che devo sondaggio per il file bordo o un file con valori –

1

È possibile utilizzare uno di essi. Il punto qui è che si apre il file sysfs per il valore della linea GPIO (ad esempio /sys/class/gpio/gpio42/value e poi bloccare su di esso.

Modif.stato linea vengono segnalati come una condizione di eccezione piuttosto che una scrittura (come potrebbe essere intuitivo).

Nel caso di selezionare:

fd_set exceptfds; 
int res;  

FD_ZERO(&exceptfds); 
FD_SET(gpioFileDesc, &exceptfds); 

res = select(gpioFileDesc+1, 
      NULL,    // readfds - not needed 
      NULL,    // writefds - not needed 
      &exceptfds, 
      NULL);    // timeout (never) 

if (res > 0 && FD_ISSET(gpioFileDesc, &exceptfds)) 
{ 
    // GPIO line changed 
} 
+1

Nota che non tutti i GPIO sono interrompono-capable Se il GPIO?. stai lavorando con non supporta gli interrupt (e questo dipenderà dall'esatto CPU/SoC che stai usando), dovrai leggerlo periodicamente y. – duskwuff

+0

Non vi sono dubbi sui casi in cui ciò è vero, specialmente quando la linea GPIO è implementata con una periferica I2C o un codec audio. Comunque, in quel caso, non chiameresti mai 'select()' 'pselect()', 'poll()' o 'epoll()' su di essi. ['poll()' ei suoi fratelli, in realtà non sondaggio affatto] – marko

+0

Ciao @Marko Grazie mille per la risposta. Puoi per favore darmi un codice di esempio per selezionare quale hai menzionato sopra? effettivamente come sto facendo è quando faccio echo 1> nome_file, quindi la notifica deve essere stampata. Sarebbe di grande aiuto. –