GPIO über C-Programm auslesen und steuern

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich wollte ein C-Programm schreiben, das mir die Werte der GPIOs ausgibt.

    Bisher funktioniert folgendes:
    - Die GPIOs werden bei Systemstart eingerichtet.
    - Die Abfrage und das schreiben über die Shell funktioniert auch.

    Aber wie bekomme ich diese Abfrage in C hin?
    Das Kommando "cat" erkennt er nicht in C und wenn ich die Datei mit "fopen" öffne, dann bekomme ich immer "s" als Ausgabe angezeigt.

    Weiß jemand wie man die Werte in C auslesen kann?

  • Entweder du läst dir den Source von wiringPi und bindest dann die header (*.h) Dateien in dein C Source ein, oder du kopierst dir die jeweiligen Zeilen die du benötigst raus und fügst sie bei dir ein - guck dir am besten mal das an: https://github.com/WiringPi/WiringPi/blob/master/gpio/gpio.c

    Aber prinzpiell geht auch wiringPi nur mit den in /sys/class/gpio/ befindlichen Dateien um, das ist also eigentlich keine Hexerei ;)

  • Mit "direkt" meine ich ein Arbeiten mit der Hardware, so wie man es bei Microcontrollern macht.
    Dabei werden die Zwischenschritte von Dateisystem, Kernel und Kernelmodulen umgangen.
    Man würde zwar die Hardwareunabhängigkeit verlieren, aber einen enormen Performanceschub bekommen. Ich schätze mal daß da Leistungssteigerungen bis zum 1000-fachen möglich sind.

    Vom PC ist man es gewohnt mit dem Betiebssystem und Treibern zu arbeiten weil man sein Programm nicht auf eine bestimmte Hardware festlegen möchte.

    Bei der RasPI ist das anders. Da ist die eingebaute Hardware immer gleich. Da könnte man sein Programm durch direktes Arbeiten mit der Hardware optimieren. Die GPIO's sind ein Anwendungsfall wo das schon Sinn machen würde. Schließlich erfordert die eigendliche Ein/Ausgabe nur einen einzigen Assembler-Befehl.

    Ich Frage das übrigens nur aus reiner Neugierde. Ich hab noch kein konkretes Projekt bei dem ich GPIO's nutzen könnte. Ich bau derartige Sachen immer mit Microcontrollern.


  • Meinst Du wirklich die C-Compiler sind so schlecht? Mehr als 20-50 würde ich nicht vermuten.


    In die 1000 fach hab ich weniger an die Unterschiede zwischen Assembler und C gedacht als an den Overhead vom Betriebssystem. Schließlich wird bei jedem Byte was du schreibst erstmal das BS aufgerufen, zigmal Parameter auf den Stack geworfen, wieder runter geholt und was weiß ich nicht noch alles.

    Ich muss dazu aber zugeben daß ich von den internas von Linux nicht die geringste Ahnung habe. Das wiringPi-Benchmark im Link von Bjoern lässt vermuten daß der Overhead doch nicht so groß ist. Mit gemessenen 7 Mhz kommt man auf 50 CPU-Takte pro GPIO-Schreibvorgang (bei 700mhz CPU-Takt).
    Bei dem nativen C-Benchmark sinds 20 Mhz, das wären dann 17 CPU-Takte. Gar nicht schlecht, auch wenns genaugenommen immer noch 16 zuviel sind ;)

    Vielen Dank an Bjoern, MMI und Orb. Meine Neugierde zu dem Thema ist erstmal gestillt ;)

  • Hallo meigrafd,
    also mir gefällt - ehrlich gesagt - das Beispiel mit der Adressierung über die Kernelvariablen gar nicht. =(
    Wahrscheinlich bin ich zu sehr "Effizienzguru". :s

    Wenn schon in C, dann muss es (bei mir) so aussehen:

    So läuft es wie bei einem Microcontroller - eine Kernelfunktion wird gar nicht benötigt.

    Zugegebenermassen ist es oft umständlich, an die Internas des Prozessors heranzukommen und Broadcom ist auch nicht gerade großzügig mit Infos. "joan" (Autor von pigpio) hat in diesem Fall aber gute Vorarbeit geleistet. ;)

    Gruß, mmi

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!