2017-05-27 4 views
0

Ich mag es, ein Signal zu probieren, das von den Pins meines Raspberry Pi erzeugt wird. Ich habe die Erfahrung gemacht, dass hohe Sample-Raten schwer zu realisieren sind.Was ist der beste Weg, um regelmäßig GPIO-Pins in Linux zu testen?

Zuerst habe ich einen schnellen Ansatz mit Python (super langsam) gemacht. Dann wechselte ich zu ANSI C + die bcm2835.h lib. Ich habe deutliche Leistungssteigerungen erzielt.

Jetzt stelle ich mir selbst die Frage: Wie kann ich die beste Sampling-Methode unter Linux durchführen?

Meine Versuche wurden im Benutzerraum unternommen. Aber was ist, Wechsel zum Kernel-Raum? Ich kann ein einfaches Zeichen-Gerätekernmodul schreiben. In diesem Modul werden die Pins periodisch überprüft. Wenn sich der Status ändert, werden einige Informationen in einen Puffer gelegt. Dieser E/A-Puffer wird von einer synchronen Datei gelesen, die für eine Anwendung im Benutzerbereich gelesen wird. Die beste Lösung für mich wäre, wenn die Pin-Prüfung mit einer festen Frequenz durchgeführt werden kann (die Sample-Periode sollte für die Signalverarbeitung konstant sein).

Die dafür eingerichtet sein könnte:

@kernel: character Modul + Kernel-Thread + GPIO-Schnittstelle Gerätebaum + DSP bei konstanten Abtastzeit

@user space: i/o app Lesen von synchronen Zeichenmodul

Ideen/Tipps?

+1

Dies im Kernel zu tun wäre ein Vorteil, wenn Sie eine Art Interrupt verwenden könnten, wenn sich der GPIO ändert. Wenn Sie einen Kernel-Modus-Thread schreiben, dann sind Sie wahrscheinlich besser mit einem Echtzeit-Thread im User-Space. – rodrigo

+1

Wenn Sie dies im Benutzerbereich tun möchten, müssen Sie sicherstellen, dass Sie den aktuellen Kernel haben und 'libgpiod' installiert haben. – 0andriy

+0

Die libgpiod verwendet die Kernelschnittstelle "gpio.h". Das Zeichenmodul liest die Pins wie eine Datei. ppoll + timeout wird verwendet, um zu überprüfen, ob eine Änderung stattgefunden hat. Die lib bcm2845 verwendet eine Speicherzuordnung, um auf die GPIO-Register zuzugreifen. Ich denke, das ist der schnellste Weg, weil das MMU nur die logische Adresse in die physische übersetzt. Die Verwendung der mmap vermeidet die Geräteebene beim Überprüfen der Pins. Was ist mit der Kombination mmap + thread, die zyklisch einen Teil des Speichers liest? –

Antwort

1

Ich habe eine Lösung für Sie.

ich ein solches Modul geschrieben haben:

https://github.com/Appyx/gpio-reflect

Sie synchron jedes Signal von den GPIO-Pins lesen.

Sie können den Ausgang verwenden und das Signal mit Ihrer Abtastrate berechnen. Teilen Sie einfach die Perioden.

+0

Dieser Code erkennt die Änderung eines Pins. Dies ist ereignisbasiert. Die Frage, die ich gestellt habe, ist es, einen oder mehrere Pin (s) auf einer konstanten Zeitbasis abzutasten (zB Lese-Pin 1,56 und 96 alle 100 ms).Obwohl die Verbindung der Datei (Datei souce) mit einem Interrupt verbunden ist, scheint dies eine Lösung nach dem Stand der Technik zu sein. @Appyx Lösung basiert auf http://derekmolloy.ie/kernel-gpio-programming-buttons-and-leds/ –

+1

ya ich weiß, aber Sie können das Senden Beispiel nehmen und ersetzen Sie einfach die GPIO-Funktion. Die beste Lösung wäre eine konstante Abtastung mit einem hr_timer und das anschließende Schreiben der Werte in den Lesepuffer. – Appyx

+0

Was ist besser - einen hrtimer anstelle eines Kernel-Threads verwenden, um einen Pin periodisch zu lesen/schreiben? Ein gutes hrtimer Beispiel könnte hier gefunden werden: https://gist.github.com/maggocnx/5946907 –

Verwandte Themen