Raspberry Pi GPIO in C – WiringPi

Bisher hatte ich die GPIO-Pins des Raspberry Pi über dash-Skripte und das Dateisystem angesteuert (“echo 0 / 1 > /sys/class/gpio/gpioX/value…”), zum Ein- und Ausschalten von LED, Funksteckdosen und ähnlichem ist dieses Vorgehen auch absolut zufriedenstellend. Da ich nun aber eine LED-Matrix multiplexen und über ein Schieberegister steuern wollte, benötigte ich für die Ansteuerung jeder einzelnen LED-Zeile eine entsprechend hohe Schaltfrequenz auf den GPIO-Pins.

GPIO Schaltfrequenz

Über eine dash-for-Schleife

for i in `seq 1 10000`; do ... echo 0 / 1 > /gpioX/value ... done

prüfte ich die maximale Schaltfrequenz, die über das Dateisystem erreicht werden kann. Auf einem Pi 1 Modell B lag das Maximum bei rund 2.000 Schaltvorgängen pro Sekunde. Das erscheint durchaus noch ausreichend für die Ansteuerung einer LED-Matrix, lässt für Erweiterungen aber im Zweifelsfall wenig Spielraum nach oben. Die Frage tauchte daher auf, ob die GPIOs auch in einer maschinennäheren Programmiersprache wie C, C++ oder Assembler in einer höheren Frequenz angesteuert werden können.

Ansteuerung in C

Glücklicherweise ist die Ansteuerung der GPIO-Pins über die Programmiersprache C auf dem Raspberry Pi ganz einfach über die bereits vorinstallierte wiringPi-Bibliothek möglich. Folgendes C-Fragment bindet als Beispiel die wiringPi-Bibliothek ein und schaltet dann darüber den GPIO-Pin 12 einmal an und aus:

#include <wiringPi.h>
int main (void)
{
  wiringPiSetup();
  pinMode(12, OUTPUT) ;
  digitalWrite(12, HIGH);
  // delay(x), sleep(x) etc.
  digitalWrite(12, LOW);  
}

Diese C-Quellcode-Datei, abgelegt beispielsweise als gpio.c, wird mit dem Gnu C-Compiler, unter Einbindung der wiringPi-Schnittstelle, in ein ausführbares Programm kompiliert. Das erstellte Programm gpio kann dann auf der Kommandozeile ausgeführt werden:

> gcc  -o gpio  gpio.c  -lwiringPi
> ./gpio

Die höchstmögliche Schaltfrequenz der GPIO-Pins ist über eine solche GPIO-Ansteuerung in C ungleich höher als über das Dateisystem. Beim analog zu oben wiederholten Test über eine for-Schleife in C werden rund 3 Mio. Schaltvorgänge pro Sekunde auf dem gleichen Raspberry-System wie oben erreicht, ein über den Faktor 100 höherer Wert.

Hinweis zur Pin-Belegung

Bei der Benutzung der wiringPi-Bibliothek müsst ihr beachten, dass die interne Nummerierung der GPIO-Pins vom häufig genutzten BCM-Schema abweicht. GPIO 2 entspricht in wiringPi beispielsweise der internen Nr. 8, GPIO 3 ist die 9, GPIO 4 entspricht der Nummer 7 etc. (warum denn das…?).

Mein Kommentar...