Dichiarazione variabile con @ in C


11

Sto leggendo un codice C e ho trovato questa dichiarazione nel programma:

unsigned char serv_ctr @0x0002;

Qualcuno può indicarmi la documentazione o spiegare a cosa serve "@ 0x0002" nel compilatore Mplab XC8 v1.35 C?


14
Immagino che sia un'estensione del compilatore per posizionare la variabile a un indirizzo specifico.
Eugene Sh.

2
la domanda potrebbe quindi beneficiare del tag #mplab, poiché risulta che questo è specifico di Mplab.
sylvainulg,

Giusto per ottenerlo: è in argomento su questo sito? Penserei che questo appartenga a SO. Oppure va bene chiedere la programmazione del microcontrollore qui. Ciò renderebbe poco chiaro dove dovrebbero essere queste domande.
Arrivederci SE

6
@KamiKaze Quali argomenti posso chiedere qui? elenca "la scrittura del firmware per applicazioni bare metal o RTOS" come argomento e "software di programmazione per PC" come argomento. Dal momento che questo sembra riguardare la programmazione di sistemi integrati, a prima vista sembrerebbe di essere in tema. Il fatto che possa anche essere argomento su StackTranslate.it non fa da solo fuori tema qui.
un CVn

@KamiKaze grazie per avermelo chiesto, avevo domande simili (non sono un utente abituale di questo SE)
GPPK

Risposte:


20

Questo per specificare un indirizzo assoluto in cui posizionare la variabile.
Dal manuale del compilatore XC8 pagina 27, sezione 2.5.2 Indirizzamento assoluto :

Le variabili e le funzioni possono essere posizionate a un indirizzo assoluto usando il __at()costrutto
......
2.5.2.2 DIFFERENZE
I compilatori a 8 bit hanno usato un simbolo @ per specificare un indirizzo assoluto


6

@è un'estensione non standard comune al linguaggio C che consente di dichiarare una variabile a un indirizzo specifico. Può essere utilizzato per registri hardware mappati in memoria, ecc. In tal caso è necessario dichiarare anche la variabile volatile, quindi il tuo esempio non è corretto.

Altri compilatori usano qualcosa di simile __attribute__(section...o #pragma ..., tutto ciò non standard C.

L'unica ragione razionale (se presente) per cui le catene di strumenti fanno questo, è abilitare il debug dei registri su debugger scadenti. La sintassi non standard assicurerà che il registro diventi parte dell'output del linker e delle informazioni di debug. Il che a sua volta ti consente di guardare il registro nel debugger scadente proprio come puoi vedere qualsiasi altra variabile.

Se hai un buon debugger, avrà il supporto e la consapevolezza del tuo MCU specifico. Quindi non hai bisogno di schifezze non standard nel codice C, ma puoi invece scrivere C standard puro e portatile:

#define serv_ctr ( *(volatile uint8_t*)0x0002u )

1
Mentre i compilatori devono accettare il secondo modulo, le implementazioni sono autorizzate a mappare i numeri agli indirizzi in qualsiasi modo ritengano opportuno. Inoltre, la maggior parte dei compilatori che ho visto usano @piattaforme di destinazione della notazione con più spazi di memoria o altri problemi in modo che la maggior parte delle cose dichiarate usando la @notazione si comporterebbe diversamente da tutto ciò che potrebbe essere fatto senza estensioni.
supercat,

1

Una breve estensione:

Questo non funziona più da xc8 2.0 e versioni successive. Ora dovevi scrivere:

unsigned char serv_ctr __at(0x0002);

per mettere una variabile ( serv_ctr) in un indirizzo assoluto ( 0x0002).

Con XC8 2.0 è possibile compilare il vecchio codice utilizzando la @sintassi se si impostano le impostazioni del compilatore per utilizzare il formato "C90". L'impostazione è simile a questa, si trova in "Opzioni globali XC8" e si chiama "C standard".


Molti altri compilatori di sistemi embedded supportano anche la @sintassi, non solo Mplab.
Lundin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.