Frage von SYSCrashTV, 54

Ist eine Endlosschleife "gesund"?

Ich habe einen Raspberry Pi, auf dem im Moment nur DHCP-Server und ein FileServer läuft, sowie wahlweise ein WLAN-Aufgebaut werden kann.

Nun habe ich die GPIOs nur begrenzt verwendet, um auf LEDs z.B. den Zustand des WLANs anzuzeigen (also auf HostAPD aktiv ist oder nicht). Ich hab nun auf Amazon ein 4x4 Matrix-Keypad gekauft, sowie ein 16x2 LCD-Display. Auch habe ich ein Paar Taster für's Breakboard hier, welche ich nun anschließen will.

Nun brauche ich aber zum "abfragen" des Zustandes eine Endlosschleife, welche immer wieder die Kontakte checkt, um zu merken, ob der Button gedrückt wird. Ist das "gesund", oder gibt es dafür eine "elegantere Variante"? Ich habe es nun in Python geschrieben und zwischen der Wiederholung noch ein 500ms-Timeout eingebaut. Ist das so besser?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TeeTier, 30

Erst mal vorweg: So etwas macht man nicht. Schäm dich! :)

Für so etwas solltest du immer Interrupts verwenden, die du über "add_event_detect()" und "wait_for_edge()" von "GPIO" mittels Callback benutzen kannst. In der Doku oder bei Google findest du Beispiele dazu! :)

Viel Spaß! :)

PS: Du kannst "wait_for_edge()" natürlich immernoch in einer Endlosschleife aufrufen, trotzdem empfiehlt sich eine vernünftige Abbruchbedingung oder der Einbau eines kleinen Selbsttests nach jedem Event.

Aber ein Spin-Loop, den du da gerade - selbst mit 500 ms Wartezeit - hast, ist eigentlich nicht gerade elegant und sparsam.

Expertenantwort
von guenterhalt, Community-Experte für Linux, 22

dein Programm mit der Endlosschleife läuft doch innerhalb eines Multi-Task-Betriebssystems.
Laufende Prozesse, somit auch deine Endlosschleife, werden ständig vom Betriebssystem unterbrochen, um auch anderen Programmen Rechenzeit zu geben.
Was also soll da "ungesund" an einer solchen Schleife sein? Linux bietet auch noch die Möglichkeit die Priorität solcher Prozesse von (meine Interpretation) "aggressiv" auf "sehr nett" zu setzen. Dafür gibt es den Befehl nice bzw. renice. 
Vielleicht kannst du auch das Systemprogramm sleep einfügen. Das unterbricht die Endlosschleife für die angegebene Zeit ( in Sekunden).
Möglicherweise bietet auch Python so eine Funktion wie after ( in tcl) an.

Problematisch an solchen Endlosschleifen ist, das man sie schlecht abbrechen kann. Oft muss man das Terminal killen, in dem es läuft oder mit dem kill-Befehl nachhelfen.

Das betrifft aber mehr die Testphase.
Für solche Tcl-Programme habe ich bei mir eine Kopie des Interpreters erstellt und benutze dann killall <Kopie-Name-von-tcl> , ohne damit auch andere Programme zu stoppen.

Keine passende Antwort gefunden?

Fragen Sie die Community