Was ist die bevorzugte Methode, einen Interrupt-Handler in mspgcc zu deklarieren?Wie wird ein Interrupt-Handler (ISR) in Mspgcc deklariert?
Antwort
Nur um zu klären, weil dies ein frühes Google-Ergebnis ist.
__attribute__((__interrupt__(TIMER0_A0_VECTOR)))
void __isr_5(void)
{
...
}
Aktuelle GCC noch (ich glaube, das ist das, was über arvindpdmn kommentiert) löst einen Fehler, wenn sie über Syntax.
internal compiler error: in msp430_attr, at config/msp430/msp430.c:1835
{
^
Ein Problem wurde nach einer report of this in the TI E2E community für diese angehoben, aber die Frage ist immer noch in seiner „Geplante“ Zustand, und es ist unklar, wer der Verfolger selbst gehört. (Sie können auf das Problem über den Thread in obigem Link zugreifen.)
Mit Blick auf den Code wird der Fehler scheinbar ausgelöst, da das einzige Attribut, das Argumente haben kann, ist das interrupt
Attribut.
In der Tat funktioniert Kompilierung gut, wenn die führenden und folgenden Unterstriche weggelassen werden.
Dies ist hier die richtige Syntax!
__attribute__((interrupt(TIMER0_A0_VECTOR)))
void name_does_not_matter(void)
{
...
}
Und in der Tat ist dieses Attribut documented in the official GNU GCC documentation. Rückblickend ist es eher unklar, woher die Unterstriche kamen. Im Grunde ist das einzige Problem hier, dass die Fehlermeldung so wenig informativ ist.
Beachten Sie, dass diese Information für MSPGCC v4.6.3 gilt, das vor dem Ti/Redhat/SOMNIUM-Port von MSPGCC liegt, der jetzt mit Code Composer Studio vertrieben wird.
Dank geht an Peter Bigot der Mailingliste Mspgcc-Benutzer für diese Antwort.
Es gibt zwei Möglichkeiten:
A. Rabatt-Code Composer Studio Stil Syntax (hat den zusätzlichen Vorteil von CCS tragbar):
#pragma vector=TIMER0_A0_VECTOR
__interrupt void
ta0cc0_isr (void)
(Beachten Sie, dass diese irgendwo um Version 20.120.406 von MSPGCC eingeführt wurde).
B. Verwenden Sie nativen gcc Syntax:
static void
__attribute__((__interrupt__(TIMER0_A0_VECTOR)))
isr_cc0_TA0 (void)
C. Benennen Sie die Funktion korrekt, damit sie in die Vektortabelle aufgenommen wird (nützlich für ASM-Funktionen).
Das Interrupt-Attribut bewirkt, dass die Funktion den Namen __isr_X
hat, wobei X das Wortoffset des Interrupts aus dem Start der Vektortabelle ist (gleich dem Wert des Parameters des Interrupt-Attributs dividiert durch 2).
Diese __isr_X
Symbole werden verwendet, um die Vektortabelle in crt0ivtbl.o zu initialisieren.
- 1. #define ISR (x) #pragma isr = x
- 2. Breakpoint in ISR
- 3. I2C ISR und Interrupts
- 4. Wie deklariert ein selbstreferenzieller Container in C++?
- 5. Wie man ein Swift Array deklariert
- 6. Wird ein Standard-Move-Konstruktor vom Benutzer deklariert?
- 7. Wird ein Kopierkonstruktor oder Kopierzuweisungsoperator als "Benutzer deklariert" gezählt?
- 8. Wie Verzögerungen im Kernel-Treiber verwendet werden ISR
- 9. Wie deklariert man ein Feld in Enum in Java?
- 10. , der die Steuerung an ISR übergeben wird, während die CPU BH ausgeführt wird
- 11. ISR für Timer Compare Match läuft nicht
- 12. Jeder IRQ und ISR verursacht einen GPF
- 13. Wie deklariert enums in angularjs?
- 14. Wie werden Zellen einer Tabelle beeinflusst, indem ein Ereignis in einem col-Element deklariert wird?
- 15. Wie schränkt man die Sichtbarkeit einer Klasse außerhalb des Namensraums ein, in dem sie deklariert wird?
- 16. Wie deklariert man ein benanntes Volume in einer Dockerfile?
- 17. Was passiert mit einer vorzeitigen "Rückkehr" in einem ISR?
- 18. Warum wird Silverlight 5 Assembly.LoadFrom intern deklariert?
- 19. Warum wird Reads nicht als kovariant deklariert?
- 20. Warum argv [] als const deklariert wird?
- 21. Objekt wird benutzt, aber nicht deklariert?
- 22. Zugriffsvariable, die im Makefile-Befehl deklariert wird
- 23. C# Wert wird deklariert, aber nie verwendet
- 24. Wie deklariert man Eingaben in Rcpp-Funktionen?
- 25. Warum wird die GUID-Struktur so deklariert, wie sie ist?
- 26. Wie finde ich heraus, wo eine Ruby-Methode deklariert wird?
- 27. Wie wird ein Konstruktor ausgeführt?
- 28. Warum wird dieser Code nicht kompiliert, wenn Destruktor deklariert wird?
- 29. Wie deklariert man 2D-Arrays in Haxe?
- 30. -Update ein Feld deklariert als val
Dies funktionierte nicht für mich in CCS 6.2.0 bei Verwendung von GNU v5.3.0.219 (SOMNIUM Technologies Limited), die als Add-on zu CCS installiert ist. Fehler: 'interner Compilerfehler: in msp430_attr, at'.Könnte eine neue Frage beginnen, wenn ich keine Antwort finde. –
Handbuch sagt dies: "Um einen Interrupt mit MSP430 GCC zu definieren, verwenden Sie die folgende Syntax: ' void __attribute__ (Interrupt (INTERRUPT_VECTOR))) INTERRUPT_ISR (void) ' Das statische Schlüsselwort sollte nicht für ISR-Definition verwendet werden." PDF: http://www.ti.com/lit/pdf/slau646 –
Diese ursprüngliche Information war auf den MSPGCC-Port anwendbar, bevor es von Ti/Redhat, das 2013 nicht existierte, erneut implementiert wurde. –