Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Rasenmaehroboter fuer schwierige und grosse Gaerten im Test

K (Anwendungen für Interrupts)
 
(12 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.
  
"Ein Interrupt ist ein Signal, meist von einem externen Gerät, mit dem der Prozessor aufgefordert wird, den aktuellen Programmablauf anzuhalten (zu unterbrechen) und eine sog. Unterbrechungsroutine ([[ISR]]) aufzurufen." (Zitat aus der Wikipedia [http://de.wikipedia.org/wiki/Interrupt_Request Interrupt Request])
+
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.  
  
Es wird unterschieden zwischen maskierbaren (d.h. Interrupts, die man unterdrücken kann) und nicht maskierbaren Interrupts.
+
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.
  
Sind die Interrupts nicht unterdrückt, wird der normale Programmfluss unterbrochen, sobald ein externes Signal an einer von mehreren Interrupt-Eingängen anliegt. Es wird eine spezielle Unterroutine abgearbeitet ([[ISR]]), die auf das externe Signal reagieren und es ggf. abschalten muss (um erneute Interrupt Requests und damit Endlosschleifen zu vermeiden).
+
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.  
  
Nicht maskierbare Interrupts werden vor allem für besonders schwerwiegende Ereignisse (z.B. zu hohe Umgebungstemperatur) verwendet, da hier das Steuerprogramm immer unmittelbar reagieren muss, um Schaden vom System abwenden zu können (z.B. indem es eine Kühlung aktiviert).
+
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.
  
Da die Anzahl der Interrupt-Leitungen bei Microprozessoren meist begrenzt sind, werden oft Interrupt-Controller vorgeschaltet, die auch kaskadiert (in Serie geschaltet) werden können. Um in solch einem System die Interrupt-Quelle eindeutig identifizieren zu können, muss diese dem Microcontroller über den normalen Datenbus z.B. eine Kennung übermitteln können. Die dazu nötige Kommunikation zwischen Microcontroller und Interrupt-Quelle findet in der Interrupt Service Routine statt.  
+
=== 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===
Zeile 16: Zeile 25:
  
 
'''Vorteile des Pollings gegenüber der Verwendung von Interrupts:'''
 
'''Vorteile des Pollings gegenüber der Verwendung von Interrupts:'''
* Es ist einfacher zu implementieren, da die Abfrage des Geräts im Hauptprogramm erfolgen kann.
+
* 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. 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 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 [[ADC|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.
 
* 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 [[ADC|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:'''
 
'''Vorteile von Interrupts gegenüber Polling:'''
Zeile 35: Zeile 45:
 
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.
 
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 [[ISR|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).
 
In diesem Fall muss die durch den Interrupt aufgerufene [[ISR|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.
 +
 
==Siehe auch==
 
==Siehe auch==
 
* [[ISR]]  
 
* [[ISR]]  
  
 
[[Kategorie:Microcontroller]]
 
[[Kategorie:Microcontroller]]

Aktuelle Version vom 21. September 2014, 17:08 Uhr

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.

Siehe auch


LiFePO4 Speicher Test