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?
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?
Risposte:
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
@
è 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 )
@
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.
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".
@
sintassi, non solo Mplab.