2017-05-30 3 views
1

Der Demo-Code auf der Web-ISR für ARM für die Definition der Regel ist dies:ISR-Syntax mit ARM-GCC

__irq void ISRFunc (void); 

Mit ARM-GCC, das gibt Syntaxfehler auf der Kompilierung, habe ich offensichtlich Varianten ausprobiert wie _irq, aber sie haben alle das gleiche Problem. Einige Google-Verweise geben an, dass Sie die Funktion nicht als ISR angeben müssen, d. H. void ISRFunc(...) funktioniert auch. Ich habe jedoch Probleme, meine Programme zu starten, so dass es sehr hilfreich wäre, wenn jemand bestätigen könnte (a) ist der Typspezifizierer __irq (oder gleichwertig) erforderlich, und (b) was sollte es sein, um Kompilierungsfehler zu vermeiden.

Danke für jede Information.

Antwort

2

__isr ist ARM C compiler specific Schlüsselwort (und sieht aus wie es Keil specific too, but obsoleted war) und nicht über GCC kompilieren.

Per GCC documentation, ist die Syntax für die Deklaration von ARM Interrupt-Service-Routine:

void __attribute__((interrupt("IRQ"))) do_irq() 
{ 
    //your irq service code goes here 
} 

Extra Details:

In der Tat kann man einen der Compiler zu informieren folgenden verwenden, die Ihre Funktion ist der Unterbrechungshandler.

void __attribute__((interrupt)) ... 
void __attribute__((interrupt("FIQ"))) ... 
void __attribute__((interrupt("IRQ"))) ... 

Der Unterschied ist sowohl "IRQ" und "FIQ" Kontexte registrieren wechseln sollte und speichern bestimmte Register ("FIQ" Stapel nichts), während Ebene interrupt mehr allgemein ist „save , was Sie hier und Wiederherstellen beim Beenden“.

+0

Danke Andrejs. Das ist eine weitere Unsicherheit, die ich abhaken kann! Prost – BruceV

+0

Gern geschehen! Vergessen Sie nicht, die Antwort zu akzeptieren :) –

+0

Ich werde sobald ich herausfinden, wie es geht! – BruceV