(→Interrupt Request) |
K (→Anwendungen für Interrupts) |
||
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
===Interrupt Request=== | ===Interrupt Request=== | ||
+ | Normalerweise arbeitet ein Prozessor (µC oder CPU) ein Programm der Reihe nach ab. Praktisch alle CPUs und µCs haben aber die Möglichkeit unabhängig vom normalen Programmfluss auf einige Ereignisse zu reagieren, die Interrupts. Typische Interruptquellen sind der Überlauf eines Timers, das Ende einer AD Wandlung und ein empfangenes Zeichen an einer Schnittstelle. | ||
− | + | Wenn ein Interrupt Signal vorliegt, pausiert das normale Programm, und die ISR ([[Interrupt Service Routine]]) wird statt dessen aufgerufen und erst danach wieder das normale Programm fortgesetzt. Mit den Interrupts kann die CPU mehrere Dinge quasi gleichzeitig erledigen. In der ISR (je nach CPU auch direkt durch die Hardware), wird der Zustand der Register gesichert und am Ende der ISR wieder hergestellt. Das Hauptprogramm bemerkt so wenig von der ISR, außer der unvermeidlichen Verzögerung und den gewünschten Effekten in der ISR. | |
− | + | Weil die ISR eben doch manchmal stört, erlauben es fast alle CPUs, dass das Programm den Aufruf der ISR durch ein Interruptflag unterbinden kann. Der Interrupt wird dann "maskiert". In der Regel wird das Signal, das den Interrupt ausgelöst hat, gespeichert und die ISR wird nachgeholt werden, wenn das Programm es wieder zulässt. Für wichtige Signale (z.B. Übertemperatur, Unterspannung), die nicht unterdrückt werden sollen gibt es teilweise nicht maskierbare Interrupts, die sich nicht so einfach abschalten lassen. | |
− | + | Bei Mikrocontrollern sind viele der Interruptquellen interne Module wie [[Timer]], [[UART]], [[I2C]] oder A/D. Je nach Prozessor gibt es je nach Interruptquelle eine eigene ISR (z.B. AVR) oder nur eine (z.B. PIC16) bzw. einige wenige. | |
− | Da die Anzahl der Interrupt-Leitungen bei | + | Da die Anzahl der Interrupt-Leitungen bei Mikroprozessoren begrenzt ist, werden teils Interrupt-Controller vorgeschaltet (z.B. im PC). Die eigentliche Interruptquelle wird dann später in der ISR ermittelt. |
+ | |||
+ | === Anwendungen für Interrupts === | ||
+ | |||
+ | Die klassische Anwendung für Interrupts ist die Reaktion auf IO-Ereignisse. Die ISR zur UART kann z.B. die Daten von der RS232 Schnittstelle in einen Puffer speichern, oder aus einem Puffer senden. | ||
+ | |||
+ | Für Vorgänge die in regelmäßigen Zeitabständen erledigt werden sollen, eignen sich Timer Interrupts. Der Timer kann z.B. alle 10 ms einen Interrupt auslösen in dem dann z.B. die interne Uhrzeit aktualisiert wird oder Tasten abgefragt werden. | ||
+ | |||
+ | Preemptives Multitasking wird auch per Interrupt realisiert: der Wechsel zu einem anderen Thread / Task beginnt mit einem Interrupt. Nach der ISR wird dann aber nicht wieder an die gleiche Stelle zurückgesprungen, sondern auf einen anderen Task gewechselt. Gerade beim µC ist die Benutzung von Interrupts eine Alternative zum echte Multitasking mit gleichberechtigten Tasks - es können mehrere Aufgaben quasi parallel erledigt werden, wobei das Hauptprogramm allerdings eine Sonderrolle hat. | ||
+ | |||
+ | Wenn die CPU in einen [[Stromspar-Modi(AVR)|Stromsparmodus]] versetzt wird, dient zu Aufwachen in der Regel auch ein Interrupt. Dadurch kann man z.B. in der Zeit, die man auf eine AD Wandlung wartet, Strom sparen. | ||
===Unterschiede zum Polling=== | ===Unterschiede zum Polling=== |
Aktuelle Version vom 21. September 2014, 17:08 Uhr
Inhaltsverzeichnis
Interrupt Request
Normalerweise arbeitet ein Prozessor (µC oder CPU) ein Programm der Reihe nach ab. Praktisch alle CPUs und µCs haben aber die Möglichkeit unabhängig vom normalen Programmfluss auf einige Ereignisse zu reagieren, die Interrupts. Typische Interruptquellen sind der Überlauf eines Timers, das Ende einer AD Wandlung und ein empfangenes Zeichen an einer Schnittstelle.
Wenn ein Interrupt Signal vorliegt, pausiert das normale Programm, und die ISR (Interrupt Service Routine) wird statt dessen aufgerufen und erst danach wieder das normale Programm fortgesetzt. Mit den Interrupts kann die CPU mehrere Dinge quasi gleichzeitig erledigen. In der ISR (je nach CPU auch direkt durch die Hardware), wird der Zustand der Register gesichert und am Ende der ISR wieder hergestellt. Das Hauptprogramm bemerkt so wenig von der ISR, außer der unvermeidlichen Verzögerung und den gewünschten Effekten in der ISR.
Weil die ISR eben doch manchmal stört, erlauben es fast alle CPUs, dass das Programm den Aufruf der ISR durch ein Interruptflag unterbinden kann. Der Interrupt wird dann "maskiert". In der Regel wird das Signal, das den Interrupt ausgelöst hat, gespeichert und die ISR wird nachgeholt werden, wenn das Programm es wieder zulässt. Für wichtige Signale (z.B. Übertemperatur, Unterspannung), die nicht unterdrückt werden sollen gibt es teilweise nicht maskierbare Interrupts, die sich nicht so einfach abschalten lassen.
Bei Mikrocontrollern sind viele der Interruptquellen interne Module wie Timer, UART, I2C oder A/D. Je nach Prozessor gibt es je nach Interruptquelle eine eigene ISR (z.B. AVR) oder nur eine (z.B. PIC16) bzw. einige wenige.
Da die Anzahl der Interrupt-Leitungen bei Mikroprozessoren begrenzt ist, werden teils Interrupt-Controller vorgeschaltet (z.B. im PC). Die eigentliche Interruptquelle wird dann später in der ISR ermittelt.
Anwendungen für Interrupts
Die klassische Anwendung für Interrupts ist die Reaktion auf IO-Ereignisse. Die ISR zur UART kann z.B. die Daten von der RS232 Schnittstelle in einen Puffer speichern, oder aus einem Puffer senden.
Für Vorgänge die in regelmäßigen Zeitabständen erledigt werden sollen, eignen sich Timer Interrupts. Der Timer kann z.B. alle 10 ms einen Interrupt auslösen in dem dann z.B. die interne Uhrzeit aktualisiert wird oder Tasten abgefragt werden.
Preemptives Multitasking wird auch per Interrupt realisiert: der Wechsel zu einem anderen Thread / Task beginnt mit einem Interrupt. Nach der ISR wird dann aber nicht wieder an die gleiche Stelle zurückgesprungen, sondern auf einen anderen Task gewechselt. Gerade beim µC ist die Benutzung von Interrupts eine Alternative zum echte Multitasking mit gleichberechtigten Tasks - es können mehrere Aufgaben quasi parallel erledigt werden, wobei das Hauptprogramm allerdings eine Sonderrolle hat.
Wenn die CPU in einen Stromsparmodus versetzt wird, dient zu Aufwachen in der Regel auch ein Interrupt. Dadurch kann man z.B. in der Zeit, die man auf eine AD Wandlung wartet, Strom sparen.
Unterschiede zum Polling
Alternativ zur Verwendung von Interrupts lässt sich das Auftreten eines externes Ereignisses auch durch das regelmäßige Abfragen des externen Gerätes erkennen. Diese Technik nennt sich Polling (der Prozessor frägt das externe Gerät).
Vorteile des Pollings gegenüber der Verwendung von Interrupts:
- Es ist einfacher zu implementieren, vor allem für Anfänger, da die Abfrage des Geräts im Hauptprogramm erfolgen kann.
- Es reagiert meist schneller auf das externe Ereignis, sofern nur auf ein Ereigniss gewartet wird. Bei Interrupts wird der aktuelle Befehl des Hauptprogramms noch fertig ausgeführt, dann wird die Rücksprungadresse gesichert und in die ISR verzweigt. Diese wiederrum muss die zu benutzenden Register auf dem Stack sichern, bevor sie mit der eigentlichen Reaktion auf das externe Ereignis beginnen kann. Beim Polling kann nach Erkennung des Ereignisses sofort reagiert werden.
- Es ist weniger Hardwareaufwand bei den Geräten notwendig, da diese nicht in der Lage sein müssen, auf das Auftreten eines Ereignisses mit einer Interrupt-Anfrage zu reagieren. So braucht z.B. ein Temperatursensor für Polling im einfachsten Fall nur einen A/D-Wandler. Bei der Verwendung von Interrupts muss er jedoch neben der Möglichkeit, die Temperatur zu messen, zusätzlich auf die Änderung der Temperatur mit einer Interruptanfrage reagieren können.
- Auch Eingänge ohne Interruptfunktion können genutzt werden.
Vorteile von Interrupts gegenüber Polling:
- Das Hauptprogramm wird u.U deutlich einfacher und besser verständlich, weil es sich auf das Wesentliche konzentriert, ohne ständig oder von unterschiedlichen Codestellen aus Ereignisse abzufragen zu müssen.
- Es können leicht mehrere mögliche Signale Überwacht werden.
- Das Auftreten des externen Ereignisses wird immer überwacht. Beim Polling geschieht dies nur zu den Zeiten, zu denen das Hauptprogramm danach frägt.
- Das Hauptprogramm kann andere Aufgaben übernehmen als das externe Gerät zu überwachen. Beim Polling wird häufig sämtliche Rechenleistung für die Abfrage der Geräte aufgewendet.
- Die Kommunikationsleitungen, Datenbusse und externen Geräte werden entlastet. Im Gegensatz zum Polling wird nur mit dem Gerät kommuniziert, wenn tatsächlich ein externes Ereigniss stattfindet.
- Es ist oft stromsparender. Hat das Hauptprogramm keine Aufgaben mehr zu erledigen, so kann es Teile der CPU bis zum nächsten Auftreten eines Interrupts in einen stromsparenden Sleep-Mode versetzen. In diesem Modus wird die CPU angehalten und beim nächsten Interrupt wieder aktiviert. Fast alle modernen, interruptfähigen Prozessoren unterstützen einen solchen Modus.
In den allermeisten Fällen überwiegen die Vorteile der Verwendung von Interrupts deutlich!
Interrupt-Sharing
Stehen auf dem Controller weniger Interruptleitungen zur Verfügung, als interruptfähige Geräte angeschlossen werden sollen, so ist es notwendig, dass sich mehrere Geräte eine Interruptleitung teilen (Interrupt-Sharing). Bei einfachen Controllern kann es sogar vorkommen, dass nur eine einzige ISR definiert werden kann, die bei jeder Art von Ereignis aufgerufen wird. In diesem Fall muss die durch den Interrupt aufgerufene Interrupt Service Routine prüfen, bei welchem Gerät das Ereignis aufgetreten ist. Das geschieht wiederrum durch Abfrage jedes in Frage kommenden Geräts (also Polling).
Interrupt-Prioritäten
Im einfachsten Fall sind während der Ausführung der ISR weitere Interrupts unterdrückt. Bei einigen Prozessoren gibt es Interrupts mit verschiedener Priorität. Dann kann ein Interrupt eine ISR niedriegerer Priorität unterbrechen. Davon zu unterscheiden sind Prioritäten bei der Signalisierung der Interrupts: Wenn mehrere Interrupts auf die Ausführung warten (z.B. weil Interrupts vorher gesperrt waren), wird darüber festgelegt welche ISR zuerst ausgeführt wird, sofern es mehr als eine ISR gibt.