FSST - Hardwarenahe Programmierung
You are viewing an older revision! See the latest version
Interrupt
Bei Interrupts wird sofort reagiert. Wenn ein Interrupt-Signal auftritt, wird der aktuelle Befehl des Hauptprogramms beendet, die nötigen Register auf den Stack gerettet und dann anschließend sofort die ISR (Interrupt Service Routine) aufgerufen.
Technische Realisierung der Interrupts¶
- der Prozessor besitzt einen oder mehrere spezielle Interrupt Eingänge
- wird eine Interruptleitung aktiviert, so führt dies zum Auslösen der zugehörigen Programmunterbrechung
- "richtige" Rechner verwenden oft sog. Interruptcontroller, welche verschiedene Interruptquellen managen
Z.B. die Tastenabfrage mittels ISR; Statt DigitalIn wird mit InterruptIn
der Taster definiert. Die ISR wird wie eine Funktion ohne Parameter und Rückgabewert (void change()) definiert. Zum Datenaustausch wird eine globale Variable (toggle) verwendet:
InterruptIn button(p14); DigitalOut led(LED1, 0); DigitalOut flash(LED4); void flip() { led = !led; } int main() { button.rise(&flip); // attach the address of the flip function to the rising edge while(1) { // wait around, interrupts will interrupt this! flash = !flash; wait(0.25); } }
Auf dem M3-Application Board wird der Joy-Stick für den button
verwendet, der folgendermaßen die Pins definiert:
- Down:p12
- Left:p13
- Centre:p14
- Up:p15
- Right:p16
ACHTUNG¶
- In der ISR sollten keine wait-Funktionen, Endlosschleifen oder blockierende System Calls verwendet werden.
- No printf, malloc, or new in ISR
Keine Bibliotheksfunktionen, die nicht re-entrant sind.
Vor-/Nachteile¶
Man hat in diesem Fall also kaum Zeitverzug zwischen der Ausführung der ISR und dem Auftreten des Signals.
Gut:
- sehr geringe Extra Belastung des Prozessors
- Prozessor wird nur dann beansprucht, wenn es notwendig ist
Schlecht:
- in der Regel längere Reaktionszeit (gilt im Vergleich zu Polling mit wenigen Ereignisquellen und modernen Betriebssystemen)