2013-03-19 4 views

Antwort

3

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.

5

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.

+0

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. –

+1

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 –

+0

Diese ursprüngliche Information war auf den MSPGCC-Port anwendbar, bevor es von Ti/Redhat, das 2013 nicht existierte, erneut implementiert wurde. –

Verwandte Themen