Priorität unter priorisierten Interrupts

Ich verwende 2 Interrupts auf LPC1778. Eine für CAN und eine für Timer. Der CAN unterbricht immer dann, wenn eine neue Nachricht empfangen wird. Der Timer unterbricht alle 200uS. Die Priorität für Timer-Interrupts ist die höchste (dh NVIC-Priorität = 0). Mein Zweifel ist, wenn eine CAN-Nachricht ankommt und ich in der ISR bin, angenommen, dass ein Timer-Interrupt auftritt, während ich in CAN ISR bin, wird die Timer-Interrupt-ISR ausgeführt und kehrt dann zu CAN ISR zurück? Oder wird der CAN-Interrupt abgeschlossen, bevor der Timer-Interrupt ausgeführt wird. Gilt die Priorität nur, wenn beide Interrupts gleichzeitig auftreten, oder gilt die Priorität für die Einstellung, welche Interrupts unter keinen Umständen maskiert werden können? Denn es ist sehr wichtig, dass der Timer-Interrupt unter allen Umständen alle 200 uS ausgeführt werden muss.

Der Mikrocontroller kann sie priorisieren. Kein Problem auf dieser Seite. Was nicht trivial ist, ist sicherzustellen, dass Ihr Betriebssystem (falls Sie Ihres entwickeln) ablaufinvariant ist und damit umgehen kann. Wenn Sie ein vorhandenes Betriebssystem wiederverwenden, teilen Sie uns mit, um welches es sich handelt.
Ich verwende kein Betriebssystem. Nur der LPC1778 wie er ist.
Ok, dann müssen Sie sehr darauf achten, wie Sie beide ISR-Funktionen schreiben, um die CAN-ISR-Arbeitsregister/-variablen nicht zu beeinträchtigen, falls sie unterbrochen werden. Nun zur Konfiguration des NVIC, es sollte nur Maskierung sein, aber ich bin kein Experte. Relevante Antworten sollten bald kommen.
Ich verwende einen Timer-Interrupt, um kritische Impulse zu erzeugen. Das heißt, die Timer-ISR kann nicht angehalten werden, während eine andere ISR ausgeführt wird.

Antworten (1)

Siehe feines Benutzerhandbuch . Der Mikrocontroller LPC1778 enthält einen ARM Cortex-M3-Kern, der das Peripheriegerät Nested Vectored Interrupt Controller (NVIC) enthält . Das Schlüsselwort hier ist " verschachtelt ", was bedeutet, dass der Interrupt-Controller verschachtelte Ausnahmen und Interrupts unterstützt, was bedeutet, dass ein aktiver Interrupt durch einen Interrupt mit höherer Priorität vorbelegt werden kann. Suchen Sie im Benutzerhandbuch nach den Begriffen „nest“ und „preempt“, um mehr zu erfahren.

Sie müssen den Interrupt-Controller konfigurieren und die Interrupts entsprechend priorisieren, damit Preemption auftritt. Vielleicht entscheiden Sie sich dafür, die SysTick-Ausnahme für Ihren Timer zu verwenden, damit er eine höhere Priorität als der CAN-Interrupt hat. Oder wenn Sie einen Interrupt auch für den Timer verwenden, müssen Sie die Gruppenpriorität (siehe Abschnitt 39.3.3.6) der Interrupts konfigurieren, um sicherzustellen, dass die Timer-ISR der CAN-ISR Vorrang einräumen kann.

Ich verwende den CMSIS-Treiber. Für CAN-> NVIC_SetPriority(CAN_IRQn,1);NVIC_EnableIRQ(CAN_IRQn); Für Timer->NVIC_EnableIRQ(TIMER0_IRQn);NVIC_SetPriority(TIMER0_IRQn,0); Das ist alles, was erforderlich ist, um sicherzustellen, dass der Timer niemals angehalten wird?
Eine höhere Priorität verdrängt die niedrigere Priorität, und nachdem die höhere Priorität erledigt ist, kehrt sie zur niedrigeren Priorität zurück, richtig?
Ja, die ISR mit niedrigerer Priorität wird fortgesetzt, nachdem die Unterbrechung mit höherer Priorität abgeschlossen ist. Ich weiß nicht, ob diese Funktionsaufrufe ausreichend eingerichtet sind. Ich bin skeptisch, weil sie anscheinend keine Einrichtung der Prioritätsgruppen enthalten und ich nicht sicher bin, ob 0 und 1 gültige Prioritätswerte sind. Sie müssen das Handbuch lesen und dann Ihren Code testen. Es wäre hilfreich, sich einige Beispiele des Anbieters NXP anzusehen.
Prioritätsgruppen sind nur für Interrupts gleicher Priorität gültig. Ich habe den Timer explizit höher priorisiert
Lesen Sie Abschnitt 39.3.3.6. Es scheint sehr klar. "Nur die Gruppenpriorität bestimmt den Vorrang vor Interrupt-Ausnahmen. Wenn der Prozessor einen Interrupt-Ausnahmehandler ausführt, wird der Handler durch einen anderen Interrupt mit derselben Gruppenpriorität wie der behandelte Interrupt nicht vorgezogen."