GPIO Interrupts und poll()

Hallo,

ich arbeite gerade an einem neuen Projekt für meinen Raspberry Pi (Raspbian) und will hierzu auf die GPIOs mittels C/C++ lesend zugreifen. An die GPIOs sind letztendlich nur Taster angeschlossen, die das high-/lowsignal simulieren.

Der Zugriff auf die GPIOs ist relativ einfach, jedoch basieren im Moment die meisten Lösungen auf der stetigen Abfrage der GPIOs in einer Endloswhile-Schleife. Das ist natürlich ineffektiv wie sau. Deshalb würde ich das ganze gerne mit Interrupts oder über diese "poll()"-Funktion realisieren. Kann ich damit auch gleichzeitig auf eine Veränderung des Status an mehreren GPIOs warten oder immer nur auf einen ganz speziellen GPIO?

Grüße

Nimda05
 
Hey,
du kannst mit select oder poll auch auf mehrere, verschiedene Interrupts warten. Das geht in etwa so:
Code:
fd_set set;                                  // Menge der File-Deskriptoren

int fd_0 = open("/sys/class/gpio/gpio23/value", O_RDONLY);
FD_SET(fd_0, &set);
int fd_1 = open("/sys/class/gpio/gpio24/value", O_RDONLY);
FD_SET(fd_1, &set);
int fd_2 = open("/sys/class/gpio/gpio25/value", O_RDONLY);
FD_SET(fd_2, &set);

struct timeval timeout;                 // Kannst zusätzlich noch auf ein Timeout warten, wenn sonst nichts passiert
timeout.tv_sec = 1;
timeout.tv_usec = 0;

//max_fd ist der größte von den oberen FDs.
interrupt_ret = select(max_fd+1, NULL, NULL, &set, &timeout);

if (interrupt_ret > 0) {
		  // GPIO-Interrupt   
		  if(FD_ISSET(fd_0, &set)) {
                        //Pin 23 hat den Interrupts ausgelöst
                        //Tue irgendwas
                   }
}

Ich kann das gerade nicht testen, aber so in etwa sollte das funktionieren;) Mit poll ist es afaik das gleiche. Wenn nicht, oder du nocht etwas anderes willst:
Code:
man poll
bzw
Code:
man select
 
Zurück
Oben