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
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.
È 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
}
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
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
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. –
- 1. select vs poll vs epoll
- 2. Win32 select/poll/eof/ANYTHING?
- 3. Utilizzo di select()/poll() nel driver di dispositivo
- 4. prestazioni epoll
- 5. Utilizzando select/poll/kqueue/kevent per guardare una directory per i nuovi file
- 6. monitoraggio GPIO con select
- 7. Modello Django Poll
- 8. Epoll su file regolari
- 9. Server UDP multithreading con epoll?
- 10. Come scrivere un'applicazione Android per fare sysfs lettura/scrittura.?
- 11. Perché LinkedBlockingQueue # poll() potrebbe riagganciare?
- 12. Java BlockingQueue take() vs poll()
- 13. MySQL INSERT o SELECT
- 14. Accesso al driver Linux tramite sysfs
- 15. Boost Asio su Linux non utilizza Epoll
- 16. Esiste epoll equivalente in Java?
- 17. "epoll" è la ragione principale per cui Tornadoweb (o Nginx) è così veloce?
- 18. Sistema di notifica con p: poll/push
- 19. Epoll e arresto a 1 via remoto
- 20. Async connessione e disconnessione con epoll (Linux)
- 21. SELECT richiede 100ms; CREATE table as select - o - INSERT in select take 15mins
- 22. OS X non supporta la funzione epoll?
- 23. JDK7 NIO.2 usa Epoll ecc. Su Linux?
- 24. abilita o disabilita l'opzione da select
- 25. SELECT SUM() FROM (SELECT (SELECT())
- 26. Android ottiene il tasso di addebito in milliampie tramite sysfs
- 27. SQL per SELECT
- 28. selenio web select select
- 29. select count (*) from select
- 30. Il metodo poll() di Kafka Consumer viene bloccato
grazie @ tony-the-leone, e 'significa che devo sondaggio per il file bordo o un file con valori –