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?
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.
D.h. Standartmäßig können Interrupts NICHT unterbrochen werden, es gibt aber "tail chaining". Richtig?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.