Interrupt mit gleicher Priorität auf ARM Cortex M0

Ich habe zwei zwei Interrupts mit der gleichen Priorität; jeder hat seine eigene Interrupt-Service-Routine: ISR_A und ISR_B.

Wenn Interrupt A auftritt, wird ISR_A ausgeführt ... was passiert, wenn Interrupt B auftritt, während ISR_A ausgeführt wird? Wird ISR_B ausgeführt, nachdem ISR_A beendet ist? oder wird ISR_B niemals ausgeführt?

Ich verwende einen Freescale KL25z Arm Cortex M0+ mit GCC

Antworten (2)

Die ARM-Kernarchitektur unterstützt zwei verschiedene Arten von Interrupts – impulssensitiv und pegelsensitiv. (Siehe ARMv6-M-Architektur-Referenzhandbuch, Abschnitt B3.4.1) In beiden Fällen, wenn zwei Interrupts gleichzeitig auftreten oder einer davon auftritt, während der erste Interrupt verarbeitet wird, wird der zweite Interrupt verarbeitet, wenn der erste Interrupt bedient wird Routine kehrt zurück und gibt Interrupts wieder frei.

Die Quelle eines pegelempfindlichen Interrupts bleibt aktiv, bis die Interrupt-Service-Routine sie löscht. Wenn die Interrupt-Service-Routine die Interrupt-Quelle nicht löscht, wird ein zweiter Interrupt generiert, sobald Interrupts wieder aktiviert werden. Die Quelle kann zum Beispiel durch Lesen eines Datenregisters oder in einigen Fällen durch explizites Löschen eines Flags gelöscht werden.

Der impulsempfindliche Interrupt setzt ein Flag, das den Interrupt generiert, der Impuls muss jedoch lang genug sein, damit der Prozessor ihn abfangen kann. Wenn der Puls nicht lang genug ist, wird er nicht erfasst. Die Interrupt-Service-Routine muss das Flag explizit löschen.

Ich bin mir nicht sicher, was in dem Fall passieren wird, in dem zwei pegelempfindliche Interrupts gleichzeitig auftreten und die Interrupt-Serviceroutine etwas mit dem Peripheriegerät macht, das beide Interrupts bestätigt. Ein Beispiel hierfür wäre ein USART-Treiber, der sowohl Rx- als auch Tx-Interrupts behandelt. Ich glaube, dass der zweite Interrupt nicht gesehen wird, da er nicht mehr aktiv ist, wenn der Interrupt wieder aktiviert wird. Ich bin mitten in einem ARM-Projekt und wenn jemand die Antwort nicht veröffentlicht, werde ich einige Tests durchführen und diese Antwort mit den Ergebnissen bearbeiten.

Ich bin kein ARM-Experte, aber in allen anderen MCUs, die ich mit Interrupts gearbeitet habe, wurde ein Flag gesetzt, und dieses Flag wird während des normalen Ausführungszyklus überprüft. Wenn ein Interrupt auftritt, während ein anderer ausgeführt wird, wird das Flag trotzdem gesetzt und überprüft, wenn die aktuelle ISR endet, wodurch die nächste ISR gestartet wird.