Forum: Mikrocontroller und Digitale Elektronik Interruptroutine Cortex-M3 unterbrechbar?


von Dominik (Gast)


Lesenswert?

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 STM32 ARM 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?

von Willi (Gast)


Lesenswert?

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,

von Matthias (Gast)


Lesenswert?

"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.

von Dominik (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von Willi (Gast)


Lesenswert?

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.

von Dominik (Gast)


Lesenswert?

D.h. Standartmäßig können Interrupts NICHT unterbrochen werden, es gibt 
aber "tail chaining".
Richtig?

von Christian G. (christian_g83)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.