Interrupt ausschalten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Python1234
User
Beiträge: 9
Registriert: Mittwoch 18. September 2013, 16:31

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.
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.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Wenn du keine Interrupt möchtest, könnte man "KeyboardInterrupt" im Handler verwenden, oder?

Code: Alles auswählen

except KeyboardInterrupt:
    pass
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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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.
Antworten