Seite 1 von 1
Interrupt ausschalten
Verfasst: Montag 30. September 2013, 09:18
von Python1234
Hallo,
gibt es einen Befehl in Python, der die Tasterinterrupts ausschalten lässt?
Im Moment sind meine Tasterinterrupts folgendermaßen definiert:
Code: Alles auswählen
GPIO.add_event_detect(9, GPIO.RISING, callback = Knopf1, bouncetime = 200)
Das Programm funktioniert auch so weit, also er springt dann in die def Knopf1 ... aber ich will ihn quasie verriegeln, dass wenn ein weiterer Interrupt kommt er in der def Knopf1 bleibt und nicht in eine andere Interruptservice routine springt...
In C konnte man die Interrupts mit folgenden Befehlen aktivieren und deaktiveren:
Aktivieren von Interrupts
sei();
Deaktivieren von Interrupts
cli();
Gibt es soetwas für Python??? Wäre super, wenn mir da jemand weiterhelfen könnte.
Re: Interrupt ausschalten
Verfasst: Montag 30. September 2013, 10:16
von BlackJack
@Python1234: Ob das in Python möglich ist hängt davon ab ob entweder die `GPIO`-Bibliothek so etwas anbietet, oder wie das sperren der Unterbrechungsanforderungen technisch gelöst ist. Letztendlich stellt sich aber auch die Frage ob man so eine globale Aktion überhaupt durchführen will, und sich nicht lieber eine Klasse schreibt, welche die Handler verwaltet und solange ein Handler abgearbeitet wird, die anderen ignoriert. Wobei ich sowieso erst einmal versuchen würde herauszufinden wie nebenläufig die Handler im Python-Prozess tatsächlich laufen.
Re: Interrupt ausschalten
Verfasst: Montag 30. September 2013, 11:35
von Dami123
Wenn du keine Interrupt möchtest, könnte man "KeyboardInterrupt" im Handler verwenden, oder?
Re: Interrupt ausschalten
Verfasst: Montag 30. September 2013, 12:24
von BlackJack
@Dami123: Es geht hier um Hardwareinterrupts auf einer sehr spezifischen Plattform (RaspberryPi) und nicht um die vergleichsweise sehr High-Level-Abstraktion der `KeyboardInterrupt`-Ausnahme, die durch einen Signal-Handler ausgelöst wird, der von einem Signal ausgelöst wird das der Kernel dem Process sendet, was vom Tastaturtreiber ausgelöst wird, weil der eine bestimmte Tastenkombination erkannt hat, die ihrerseits wiederrum aus einer Reihe von USB-Ereignissen bestehen die von der Tastatur kommen, wo wahrscheinlich ein Mikroprozessor die Tastendrücke (innerhalb der Tastaturhardware) als Interrupts gemeldet bekommt. Sofern die Hardware an der Stelle nicht „pollt”. Der `KeyboardInterrupt` ist sozusagen mehrere Grössenordnungen von dem entfernt was hier gemacht werden soll.
Re: Interrupt ausschalten
Verfasst: Montag 30. September 2013, 13:07
von jerch
@Python1234:
Laut der Doku
http://code.google.com/p/raspberry-gpio ... iki/Inputs laufen die Eventhandler in einem 2. Thread. Die callbacks werden in einer verketteten Liste abgelegt für die GPIO Events und nacheinander nach polling aufgerufen (
http://code.google.com/p/raspberry-gpio ... gpio.c#345 und
http://code.google.com/p/raspberry-gpio ... gpio.c#285). Eventuell könntest Du daher mittels eines handlerlokalen Zustandes (z.B. mittels Closures) oder objektweit über eine Handlerklasse Deine Zusatzbedingung zur Abarbeitung des Handlers unterbringen (sollte threadsafe sein, solange Du nicht von aussen auf den Handler/Handlerobjekt ohne Locks zugreifst).
Edit: Was ich vergessen habe - lange laufende Handler blockieren demnach die Abarbeitung aller späteren Eventhandler. Das sollte man u.U. beachten.