Frage unterbrechen ARM?

Ich sehe oft so etwas void UART2_IRQHandler(void) __irqund frage mich, warum __irq verwendet wird, wenn der Interrupt-Handler deklariert wird. Ist es erforderlich oder kann der Handler ohne ihn arbeiten?

Es ist eine Anweisung an den Compiler. Sehen Sie sich den mit und ohne __irq generierten Assemblercode an ... Viele interessante Dinge passieren aufgrund von __irq (die in den Antworten erklärt werden)
Ein Problem, mit dem ich konfrontiert war, als ich den __irq zu meinem Handler weggelassen habe, war, dass, als ich meinen ISR-Handler zum zweiten Mal gemietet habe (das erste Mal hat gut funktioniert), er den Modus auf IRQ geändert hat, aber meinen ISR-Handler nie aufgerufen hat. Als ich es mit __irq versuchte, funktionierte es beim zweiten Anruf gut.

Antworten (3)

Grundsätzlich ist eine in C geschriebene Interrupt-Service-Routine einfach eine Funktion, die keine Argumente akzeptiert und nichts zurückgibt void someKindOfIsr(void).

__irqist eine C-Spracherweiterung für Ihren Compiler, die verwendet wird, um spezielle Eingangs- und/oder Ausgangs-Assembler-Anweisungen zur Behandlung von Interrupts zu generieren. Beispielsweise kann die Rückkehranweisung anders sein, wenn Sie von einem Interrupt zurückkehren und nicht von einer einfachen Funktion zum Löschen eines Interrupt-Statusregisters.

Ob es notwendig ist oder nicht, hängt davon ab, mit welcher ARM-Architektur Sie arbeiten. Ein schneller Weg, um herauszufinden, ob es für Ihre Plattform erforderlich ist, besteht darin, die Baugruppe zu untersuchen, die sowohl mit als auch ohne das __irqSchlüsselwort erstellt wurde.

Auch wenn die Listendatei sowohl mit als auch ohne das Schlüsselwort genau gleich ist __irq, sollten Sie erwägen, das __irqSchlüsselwort aus Gründen der Übersichtlichkeit und der Übertragbarkeit auf eine zukünftige Plattform beizubehalten.

Danke für die Antwort, jetzt weiß ich, was der Zweck von __irq ist.

Einige Mikrocontroller erfordern für Unterbrechungsbehandlungsfunktionen eine andere Behandlung des Stapels und der Rückkehr als für normale Funktionen.

Bei ARM-Controllern verwendet ein normaler Einstieg in ein Unterprogramm einen PUSH, um Daten auf dem Stapel zu speichern, und beim Verlassen des Unterprogramms würden Sie den gespeicherten Zustand zurückgeben und das Unterprogramm verlassen. ( ARM Montage Referenz Seite 65 )

Für einen Ausnahmehandler auf modernen ARM-Plattformen wird der Status automatisch auf den Stack übertragen, sodass der Compiler beim Funktionseintrag keine PUSH-Anweisung erstellen muss. Auch der Ausgang eines Ausnahmehandlers kann anders aussehen als normal, die ARMv7-M-Architektur kehrt von einer Ausnahme zurück, wenn entweder POP/LDM, LDR oder BX einen Wert von in den Programmzähler (PC) laden 0xFXXXXXXX.

Der teilt dem Compiler also __irqmit, dass der Ein- und Ausstieg dieser Funktionen eine besondere Behandlung erfordern könnte, und zwar abhängig vom eingestellten Ziel (für 8051 gab es, glaube ich, RET für die normale Rückkehr und RETI für die Interrupt-Rückgabe).

Nein, ohne _irq geht es nicht. Es ist ein allgemeines Format. Sie müssen dies befolgen. sonst funktioniert es nicht.

Das ist ein bisschen dünn für eine Antwort. Können Sie genau erklären, was __irqim Compiler bedeutet?