Irgendwo habe ich gelesen, dass die Interruptroutinen beim Cortex-M3
durch einen Interrupt mit höherer Priorität unterbrechbar sind. Im
"Insiders Guide to the STM32ARM Based Microcontroller" ist jedoch nur
von Tailgating, also dem effizienten hintereinanderausführen von
Interrupts die Rede.
Was stimmt also und wenn die Interrupts wirklich unterbrechbar sind, wie
kann ich dann verhindern, dass ein Interrupt unterbrochen wird?
Dominik schrieb:> Was stimmt also und wenn die Interrupts wirklich unterbrechbar sind, wie> kann ich dann verhindern, dass ein Interrupt unterbrochen wird?
Ist schon seltsam. Ich freue mich, dass endlich ein Int höherer
Priorität 'durchkommen' kann und Andere irritiert das :-)
Gib dem nicht unterbrechbaren Interrupt einfach die höchste Priorität,
oder sperre alle Ints global, oder entwickel ein Konzept, um diese
schöne Eigenschaft sinvoll zu nutzen,
"Tailgating" => "Tail chaining"!!!
So weit ich weiss, werden die IRQs nicht unterbrochen. Es gibt bei den
Cortex-M3 nur "preeemtion" (Verdrängung). Ein IRQ Ablauf ist wie folgt:
-- Register sichern
IRQ ausführen
-- Register wiederherstellen
Wenn beim Sichern der Register ein IRQ mit höherer Priorität eintrudelt,
dann wird dieser vor dem aktuellen IRQ abgearbeitet (preemption).
Allerdings glaub nur, wenn der mit niedrigerer Prio noch nicht
bearbeitet wird. Dann wird der IRQ mit niedrigerer Prio direkt nach dem,
mit höherer Prio, ausgeführt (tail chaining). Steht kein IRQ mehr an,
werden die Register
wiederhergestellt.
Wenn der IRQ mit niedrigerer Prio schon verarbeitet wird, dann wird der
mit der höheren direkt danach bearbeitet.
Ob es da eine "Sonderoption" im NVIC-Modul gibt, die eine
"Unterbrechung"
möglich macht, kann ich leider nicht mit Sicherheit sagen. Dazu ist das
Thema etwas zu lange her.
Ja, kann schon manchmal sinnvoll sein, aber ich möchte das eben genau in
einem Fall NICHT haben.
Wie können die Interrupts also einfach gesperrt werden? Haben beim
einschalten alle Interrupts dieselbe Priorität?
Dominik schrieb:> wie> kann ich dann verhindern, dass ein Interrupt unterbrochen wird?
Z.B.:
1. man hat keine verschiedenen Interruptprioritäten zugewiesen.
2. der aktuelle Interrupt hat die höchste Priorität.
Wenn man Interrupts verschiedene Prioritäten zuweist, dann nur, weil man
sich dabei auch was gedacht hat.
Peter
Matthias schrieb:> Ob es da eine "Sonderoption" im NVIC-Modul gibt, die eine> "Unterbrechung"> möglich macht, kann ich leider nicht mit Sicherheit sagen. Dazu ist das> Thema etwas zu lange her.
Beim ARM7 war das nicht möglich, bei Cortex M3/M4 schon. Man muß ein
bißchen danach suchen, bis man es herausfindet.
Dominik schrieb:> Was stimmt also und wenn die Interrupts wirklich unterbrechbar sind, wie> kann ich dann verhindern, dass ein Interrupt unterbrochen wird?
Auf dem Cortex M3 kann ein Interrupt höherer Priorität einen mit
niedrigerer Priorität unterbrechen. Deshalb hat der dafür zuständige
Systemteil auch das 'Nested' im Namen.
Tail-chaining tritt in Kraft, wenn während der Abarbeitung eines
IRQ-Handlers ein weiterer Interrupt der gleichen oder einer niedrigeren
Priorität eintrifft.
Aus dem ARMv7-M-Referenzhandbuch: "When multiple pending exceptions have
the same priority number, the exception with the lowest exception number
takes precedence. When an exception is active, only an exception with a
higher priority can preempt it."
Wenn Du nicht willst, dass ein Interrupt-Handler unterbrochen wird,
musst ihm entweder (wie schon erwähnt) die maximal mögliche Priorität
zuweisen (die nach einem Reset ohnehin alle IRQs haben) oder zu Beginn
des Handlers die Interrupts sperren und am Ende wieder freigeben.
Christian
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.