Qual è il metodo preferito per dichiarare un gestore di interrupt in mspgcc?Come dichiarare un gestore di interrupt (ISR) in Mspgcc?
risposta
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.
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.
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. –
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 –
Questa informazione originale era applicabile alla porta MSPGCC prima che fosse reimplementata da Ti/Redhat, che non esisteva nel 2013 :) –