2012-09-22 9 views
8

Ich arbeite mit gpio Interrupts. Ich habe eine Datei in "/ sys/class/gpio/gpio38/value". Ich möchte eine Benachrichtigung, wenn eine Änderung in Attribut Wert ist. Wie kann ich das im User-Space erreichen? Da ich bereits Informationen gesammelt habe, kann ich select(), poll() oder epoll() verwenden. Was ist also richtig für diese Anwendung? Oder schlage mir bitte vor, ob ich/proc/irq oder sowas benutzen kann. Thanks :)select(), poll() oder epoll()? für sysfs Attribut

Antwort

2

ich here etwas gefunden zu haben, die hilfreich sein können:

GPIO-Signale Pfade wie/sys/class/gpio/gpio42/(für GPIO # 42) und haben folgende Lese/Attribute schreiben:

"Wert" ... wird als 0 (niedrig) oder 1 (hoch) gelesen. Wenn der GPIO als Ausgabe konfiguriert ist, kann dieser Wert geschrieben werden; Jeder Wert ungleich Null wird als hoch behandelt.

Wenn der Stift als Interrupt-Erzeugungs Interrupt konfiguriert werden kann, und wenn es Interrupts konfiguriert wurde zu generieren (siehe Beschreibung von „edge“), können Sie poll (2) auf diese Datei und poll (2) wird immer dann zurückgegeben, wenn der Interrupt ausgelöst wurde. Wenn Sie poll (2) verwenden, legen Sie die Ereignisse POLLPRI und POLLERR fest. Wenn Sie auswählen (2), legen Sie den Dateideskriptor in exceptfds fest. Nach Poll (2) zurück, entweder lseek (2) an den Anfang der Datei sysfs und lesen Sie den neuen Wert oder schließen Sie die Datei und öffnen Sie es erneut , um den Wert zu lesen.

Obwohl es heißt, es ist für "gpio42", ich vermute, dass dies auf Ihren Fall zutreffen kann. Wenn nicht, machen Sie einen Kommentar in meiner Antwort.

+0

dank @ tony-the-Löwe, es bedeutet, dass ich für die Kanten Datei oder Wert Datei abzufragen haben –

1

Sie können alle von ihnen verwenden. Der Punkt hier ist, dass Sie die sysfs-Datei für die GPIO-Linie Wert öffnen (zB /sys/class/gpio/gpio42/value und dann wird der Block auf sie.

Veränderungen im Leitungszustand als Ausnahmezustand signalisiert werden eher als ein Schreib (wie man intuitiv sein).

im Fall wählen:

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

Beachten Sie, dass nicht alle GPIOs sind Interrupt-fähig Wenn die GPIO?. Sie arbeiten mit Interrupts nicht unterstützt (und dies hängt von der genauen CPU/SoC, die Sie verwenden) ab, müssen Sie es regelmäßig lesen y. – duskwuff

+0

Es gibt zweifellos Fälle, in denen dies zutrifft - besonders wenn die GPIO-Leitung mit einem I2C-Peripherie- oder Audio-Codec implementiert ist. In diesem Fall würden Sie '' select() '' pselect() ',' poll() 'oder' epoll() 'nicht auf ihnen aufrufen. ['poll()' und seine Brüder stimmen überhaupt nicht ab] – marko

+0

Hallo @Marko Vielen Dank für die Antwort. Können Sie mir bitte einen Beispielcode für die Auswahl, die Sie oben erwähnt haben, geben? eigentlich wie ich es mache ist wenn ich echo 1> dateiname, dann sollte die benachrichtigung drucken. Es wird sehr hilfreich sein. –