Ich sehe oft so etwas void UART2_IRQHandler(void) __irq
und frage mich, warum __irq verwendet wird, wenn der Interrupt-Handler deklariert wird. Ist es erforderlich oder kann der Handler ohne ihn arbeiten?
Grundsätzlich ist eine in C geschriebene Interrupt-Service-Routine einfach eine Funktion, die keine Argumente akzeptiert und nichts zurückgibt void someKindOfIsr(void)
.
__irq
ist 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 __irq
Schlüsselwort erstellt wurde.
Auch wenn die Listendatei sowohl mit als auch ohne das Schlüsselwort genau gleich ist __irq
, sollten Sie erwägen, das __irq
Schlüsselwort aus Gründen der Übersichtlichkeit und der Übertragbarkeit auf eine zukünftige Plattform beizubehalten.
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 __irq
mit, 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.
__irq
im Compiler bedeutet?
Schwanand
AlphaGoku