Kann ich nur einen Prozessorkern für mein Programm haben?


12

Ich muss die Zeitdifferenz zwischen high -> low und low -> high Signalflanke an GPIO Pins messen. Ich habe ein einfaches Programm geschrieben, das dies tut. Nach einiger Zeit war ich sehr zufrieden mit dem Ergebnis (0,01 s Variationen). Aber von Zeit zu Zeit gab es ungefähr 0,5 s Fehler. Ich dachte, dass dies auf einen anderen Systemprozess zurückzuführen sein könnte, der zu diesem Zeitpunkt ausgeführt wurde. Meine Frage lautet also:

Kann ich einen Prozessorkern nur für mein Programm reservieren und weitere 3 Kerne für das System zulassen?

Ich verwende Raspbian Jessie Lite, also denke ich, dass 3 Kerne ausreichen werden, um es auszuführen.


4
Ich gehe davon aus, dass Sie in einer Schleife den Status des GPIO-Pins abfragen. Dies ist sehr anfällig für die Entscheidung des Betriebssystems, Ihr Programm auszuführen, da es die meiste Zeit damit verbringt, die CPU zu beschäftigen, während nichts wirklich Nützliches getan wird. Möglicherweise möchten Sie einen Weg suchen, um einen Interrupt an einem bestimmten GPIO-Pin einzurichten, mit dem Sie Ihr Programm zwischen Signalflanken an GPIO-Pins schlafen lassen können.
Florian Castellane

4
Sie sind sich nicht sicher, welches Projekt Sie haben, aber manchmal passt ein Mikrocontroller besser, insbesondere wenn Sie ein echtzeitähnlicheres System benötigen. Arduino bietet viele Optionen, und Sie können Ihr Programm in C / C ++ schreiben.
SnakeDoc

@Florian In RPi.GPIO gibt es eine Funktion, die dem Interrupt ähnelt. Es wird das Programm blockieren, bis die Kante erkannt wird (Quelle: sourceforge.net/p/raspberry-gpio-python/wiki/Inputs ).
NonStandardModel

@ SnakeDoc Ich weiß, dass Mikrocontroller besser ist. Ich hatte gehofft, dies zu vermeiden, da ich keine Mikrosekundengenauigkeit benötige. 1/100 Sekunde ist mehr als genug. Außerdem brauche ich nur den Zeitunterschied. Wenn es also eine Verzögerung gibt, hatte ich gehofft, dass dies für Start und Stopp gleich ist. Wenn dies nicht funktioniert, muss ich mit einem an RPi angeschlossenen Mikrocontroller arbeiten, um die Daten zu speichern.
NonStandardModel

1
Oder lassen Sie ein Echtzeit-Betriebssystem auf dem PI laufen. Das Problem bei Ihrem Setup ist, dass es von einem "Best Effort" des Betriebssystems abhängt. Abhängig davon, was zur gleichen Zeit passiert, in der Ihr Programm privilegierten Zugriff auf die GPIOs anfordert, kann es vorkommen, dass das Betriebssystem zu diesem Zeitpunkt andere Aufgaben ausführt. Ihr Userland-Programm erhält eine niedrigere Priorität als Systemtasks. Es gibt auch eine Präferenz, was bedeutet, dass es während der Laufzeit Ihres Programms vom Betriebssystem "angehalten" und "beiseite gelegt" wird, damit ein anderer Prozess ausgeführt werden kann, was bedeutet, dass Ihre zeitlichen Beobachtungen möglicherweise verzerrt sind.
SnakeDoc

Antworten:


13

Einen Kern zu widmen ist wahrscheinlich übertrieben.

Ich schlage vor, Sie versuchen meine Pigpio- Bibliothek. Standardmäßig ändert sich der GPIO-Pegel innerhalb von 10 µs.

Als schnellen Test schlage ich vor, dass Sie sich dieses Python-Beispiel ansehen , das alle GPIO-Pegelübergänge und die Zeit in Mikrosekunden seit dem letzten Übergang auf diesem GPIO ausgibt.

pigpio ist in Jessie Lite nicht standardmäßig installiert. Installieren Sie entweder die neueste Version von der verknüpften Site oder die ältere Version in den Repositorys.

sudo apt-get install pigpio python-pigpio python3-pigpio

pigpio - Library for Raspberry Pi GPIO control
python-pigpio - Python module which talks to the pigpio daemon (Python 2)
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)

Ich werde Ihre Pigpio-Bibliothek versuchen. Im Moment muss ich ein anderes Projekt beenden, aber ich werde darauf zurückkommen. Ich werde mich in ein paar Wochen melden. Vielen Dank!
NonStandardModel

4

Sie können Ihr Programm schedutilswie in diesem Cyberciti-Artikel beschrieben an einen Kern binden :

sudo apt-get install schedutils
sudo taskset -c 3 -p 13545  # Lock PID 13545 to core 3

Andere Prozesse können jedoch weiterhin auf demselben Kern geplant werden. Als Zweites müssen Sie sicherstellen, dass Ihr Befehl mit dem Befehl nice mit der höchsten Priorität ausgeführt wird (dies teilt dem Linux-Kernel mit, dass bei Bedarf andere Prozesse vorab ausgeführt werden sollten ). Starten Sie Ihr Programm auf folgende Weise:

nice -n -20 your-program

Es gibt einige andere mögliche Gründe für Ihre Zeitprobleme. Dies ist nicht so einfach zu ändern:

  • Wenn Sie in Python programmieren, gibt es einen Garbage Collector , der Ihr Programm manchmal anhält, um nicht genutzten Speicher freizugeben.
  • Interrupts bewirken, dass die CPU etwas anderes handhabt, als Sie möchten. Zum Beispiel Netzwerkpakete oder andere Ein- / Ausgaben.
  • Wenn Ihr Programm viel schläft, kann es sein, dass andere Prozesse die CPU-Caches füllen (L1 / L2-Cache). Dies zwingt Sie, auf den RAM-Zugriff zu warten.
    • Schlimmer noch, wenn Ihr RAM voll ist, so dass Ihr Prozess auf die Festplatte ausgelagert wird, weil SD-Karten zu langsam sind.

Es gibt Möglichkeiten, Ihren Prozess in Echtzeit zu gestalten. Dies bedeutet, dass er mit bestimmten Zeitgarantien ausgeführt wird. Das Problem dabei ist, dass alles andere langsamer sein könnte und es sich um ein komplexes Thema handelt. Wenn Sie dieses Kaninchenbaugebiet erkunden möchten, sollten Sie sich mit Echtzeitprozessen in Linux vertraut machen .


2
Anstatt schön, wäre es besser, dem Prozess Echtzeitpriorität zuzuweisen, um sicherzustellen, dass er gegenüber Nicht-Echtzeitprozessen bevorzugt ausgeführt wird.
Joan

Guter Punkt, ich werde eine Notiz darüber hinzufügen.
Emil Vikström

1
"gc.disable ()" Was passiert, wenn Sie den Garbage Collector deaktivieren?
Keine

@Keine Du kannst ein Speicherleck bekommen. Angenommen, Sie haben ein Objekt A mit einer Variablen, die auf B zeigt. Python verfolgt diese Referenz als Zahl. Es weiß, dass B ein Objekt hat, das darauf zeigt. Entfernen Sie A, wenn Sie es nicht mehr benötigen. Die Referenzanzahl für B wird verringert, und wenn es 0 trifft, kann Python auch B freigeben. Dies wird als Referenzzählung bezeichnet. Aber jetzt sagen Sie, dass B einen Verweis auf A hat. Jetzt haben Sie eine Gruppe von Objekten, die aufeinander zeigen. Keiner von ihnen wird 0 treffen und befreit werden. GC kann solche Cluster finden und entfernen, wenn das Hauptprogramm nicht auf den Cluster zeigt.
Emil Vikström

1
Ich werde die Vorschläge, die Sie gemacht haben, zu meinem Projekt hinzufügen. Ich hoffe aber, zu komplexe Themen zu vermeiden. In diesem Fall ist es wahrscheinlich besser, eine Mikrocontroller-Interrupt-Erkennung durchzuführen und diese nur zum Speichern von Daten an RPi anzuschließen. Vielen Dank!
NonStandardModel

2

Da Sie Timing-Anforderungen haben, ist Raspberry Pi nicht mehr die geeignete Plattform dafür. Es ist keine Echtzeitplattform und das Timing kann durch viele verschiedene Störquellen beeinträchtigt werden.

Stattdessen sollten Sie einen Mikrocontroller verwenden, um diese Zeit zu messen, vorzugsweise unter Verwendung von Interrupts, und die Informationen später an den Pi weitergeben.


1
Ist es nicht möglich, Interrupts auf GPIO-Pins auf einem Raspberry Pi zu bekommen?
Florian Castellane

Dies hängt sicherlich davon ab, ob es einen anderen Teil der Konstruktionsanforderungen gibt, der eine Linux-Maschine geeigneter macht als eine MCU. RPi ist in der Lage, diese Aufgabe zu bewältigen, ebenso wie eine mit 10 MHz getaktete MCU.
Sean Houlihane

1

Ich glaube nicht, dass Sie einen Single-Core-Prozessor benötigen. Sie müssen sicherstellen, dass Ihr Programm ständig ausgeführt wird. Um dies zu erreichen, können Sie die Priorität Ihres Programms sehr hoch einstellen, damit es von keinem anderen Prozess gestört wird.

Soweit ich weiß, sind die von uns verwendeten Betriebssysteme (General Purpose OS) nicht für den Einsatz in Echtzeitsystemen ausgelegt. Wenn Sie also Ihren Prozess in Echtzeit ausführen möchten, damit ihn kein anderer Prozess stört, müssen Sie loslegen für ein Echtzeit-Betriebssystem (RTOS). Vielleicht haben sie eine Kernauswahl. :)


1
Gibt es gute kostenlose RTOS da draußen?
Keine

RTLinux und Vxworks sind Beispiele für RTOS und sie sind auch gut. Sie müssen sich jedoch vor der Installation mit dem Betriebssystem auseinandersetzen (was war der Schwerpunkt seiner Erstellung?), Damit es Ihren Anforderungen gerecht wird.
Vishwajeet Vishu
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.