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;
Questo 'unione volatile un_trgmr *' crea un puntatore all'unione. Qual è il punto più esterno *. Indica al sindacato di trovarsi a quell'indirizzo. –
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. –