2013-03-19 9 views

risposta

3

Giusto per chiarire, perché questo è uno dei primi risultati di Google.

__attribute__((__interrupt__(TIMER0_A0_VECTOR))) 
void __isr_5(void) 
{ 
     ... 
} 

GCC attuale ancora (credo che questo è ciò che arvindpdmn commentato) genera un errore, quando si utilizza sopra sintassi.

internal compiler error: in msp430_attr, at config/msp430/msp430.c:1835 
{ 
^ 

Una questione è stata sollevata per questo dopo una report of this in the TI E2E community, ma ha detto problema è ancora nel suo stato "pianificato" e non è chiaro che il tracker appartiene anche a. (È possibile accedere al problema tramite il thread sopra il collegamento.)

Guardando il codice, l'errore è apparentemente generato, perché l'unico attributo che può avere argomenti è l'attributo interrupt.

In effetti, la compilazione funziona correttamente, se vengono omessi i trattini di sottolineatura iniziali e successivi.

Questo qui è la sintassi corretta!

__attribute__((interrupt(TIMER0_A0_VECTOR))) 
void name_does_not_matter(void) 
{ 
     ... 
} 

E infatti, questo attributo è documented in the official GNU GCC documentation. In retrospettiva, è piuttosto poco chiaro da dove i underscore sono venuti in primo luogo. Quindi, fondamentalmente, l'unico problema qui è che il messaggio di errore è così poco informativo.

5

Si noti che questa informazione si applica a MSPGCC v4.6.3 che precede la porta Ti/Redhat/SOMNIUM di MSPGCC che ora è distribuita con code compositore studio.

Grazie a Peter Bigot della mailing list Mspgcc-users per questa risposta.

ci sono due possibilità:

A. Usa codice sintassi stile Composer Studio (ha il vantaggio di essere portatile per CCS):

#pragma vector=TIMER0_A0_VECTOR  
__interrupt void 
ta0cc0_isr (void) 

(Si noti che questo è stato introdotto da qualche parte intorno versione 20.120.406 di Mspgcc).

B. Utilizzare nativo sintassi gcc:

static void 
__attribute__((__interrupt__(TIMER0_A0_VECTOR))) 
isr_cc0_TA0 (void) 

C. Denominare correttamente la funzione in modo che sia inclusa nella tabella vettoriale (utile per le funzioni ASM).

L'attributo di interrupt fa sì che la funzione sia denominata __isr_X dove X è l'offset di parola dell'interrupt dall'avvio della tabella vettoriale (uguale al valore del parametro dell'attributo di interruzione diviso 2).

Questi simboli __isr_X vengono utilizzati per inizializzare la tabella vettoriale in crt0ivtbl.o.

+0

Questo non ha funzionato per me in CCS 6.2.0 quando si utilizza GNU v5.3.0.219 (SOMNIUM Technologies Limited), che è installato come componente aggiuntivo di CCS. Errore: errore interno del compilatore: in msp430_attr, at'.Potrebbe iniziare una nuova domanda se non trovo una risposta. –

+1

Il manuale dice: "Per definire un interrupt utilizzando MSP430 GCC, utilizzare la seguente sintassi: ' void __attribute__ ((interrupt (INTERRUPT_VECTOR))) INTERRUPT_ISR (void) ' La parola chiave static non deve essere utilizzata sulla definizione ISR." PDF: http://www.ti.com/lit/pdf/slau646 –

+0

Questa informazione originale era applicabile alla porta MSPGCC prima che fosse reimplementata da Ti/Redhat, che non esisteva nel 2013 :) –

Problemi correlati