2013-07-21 12 views
5

Ho il seguente codice. È stato generato dal mio IDE e sto cercando di capirlo.Informazioni sull'inizializzazione di basso livello in C

#define TRGMR (*(volatile union un_trgmr *)0xF0250).trgmr 

Qui il gestore del timer si trova nella posizione 0xF0250 in base alla scheda tecnica. Ma quello che non riesco a capire è la sintassi.

union un_trgmr { 
    unsigned char trgmr; 
    __BITS8 BIT; 
}; 

Conosco i puntatori. Ma non riesco davvero a capire cosa si sta facendo esattamente. ? Qualcuno potrebbe darmi una mano A proposito BITS8 è un'altra struct con campi di bit come segue:

typedef struct { 
    unsigned char no0 :1; 
    unsigned char no1 :1; 
    unsigned char no2 :1; 
    unsigned char no3 :1; 
    unsigned char no4 :1; 
    unsigned char no5 :1; 
    unsigned char no6 :1; 
    unsigned char no7 :1; 
} __BITS8; 

risposta

10

E 'solo un modo di accedere ad un registro di memoria mappata a un indirizzo fisso 0xF0250. È possibile accedere ai singoli bit dei registri tramite il campo BIT dell'unione o l'intero registro a 8 bit tramite il campo trmgr. Lo #define ti offre semplicemente un comodo accesso a quest'ultimo, in modo che tu possa scrivere, ad es.

TRMGR = 0x3f; // write 0x3f to timer manager register 

Nota l'uso di volatile - questa è una tecnica comune con mappato nella memoria I/REGISTRI O per garantire che legge/scrive sempre si verificano come previsto e non sono ottimizzati distanza (come potrebbe essere con normali posizioni di memoria).

+0

Questo 'unione volatile un_trgmr *' crea un puntatore all'unione. Qual è il punto più esterno *. Indica al sindacato di trovarsi a quell'indirizzo. –

+3

Il più esterno '*' dereferenzia il 'puntatore all'unione', dandoti l'unione. Puoi usare 'TRMGR' come un valore-l (mostrato da Paul) o come valore-r:' unsigned char bits = TRMGR; '. Direi che per la macro TRMGR, l'intero bit 'union' è ... eccessivo. La macro potrebbe benissimo essere scritta come '#define TRMGR (* (volatile unsigned char *) 0xF0250)' e si comporterebbe allo stesso modo. Questo dice "tratti l'indirizzo di memoria 0xF0250 come un' carattere non volatile non firmato * 'e accedi al valore memorizzato a quell'indirizzo ". La versione con l'unione fa lo stesso, più prolisso. –

Problemi correlati