2013-07-21 10 views
5

Ich habe das folgende Stück Code. Es wurde von meiner IDE generiert und ich versuche es zu verstehen.Understanding Low-Level-Initialisierung in C

Hier befindet sich der Timer Manager gemäß Datenblatt im Verzeichnis 0xF0250. Aber was ich nicht verstehen kann, ist die Syntax.

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

Ich weiß über Zeiger. Aber ich kann wirklich nicht verstehen, was genau gemacht wird. ? Könnte mir jemand bitte helfen By the way BITS8 ist eine andere Struktur mit bitfields wie folgt:

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; 

Antwort

10

Es ist nur eine Art und Weise 0xF0250 eine Memory-Mapped-Register bei einer festen Adresse zuzugreifen. Sie können auf einzelne Bits der Register über das Feld BIT der Union oder das gesamte 8-Bit-Register über das Feld trmgr zugreifen. Die #define gibt Ihnen nur einen bequemen Zugang zu letzterer, so dass Sie z.

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

Beachten Sie die Verwendung von volatile - dies ist eine übliche Technik, mit Memory-Mapped I/O, um sicherzustellen, registriert, dass liest/schreibt immer wie beabsichtigt auftreten und sind nicht optimiert weg (wie sie mit normalen Speicherplätze sein könnte).

+0

Diese 'volatile union un_trgmr *' erzeugt einen Zeiger auf die Union. Was ist der Sinn des äußersten *? Weist es der Gewerkschaft zu, sich an dieser Adresse zu befinden? –

+3

Der äußerste "*" dereferenziert den "Zeiger auf Union" und gibt Ihnen die Union. Sie können 'TRMGR' als l-Wert (von Paul gezeigt) oder als r-Wert verwenden:' unsigned char bits = TRMGR; '. Ich würde argumentieren, dass für das Makro TRMGR das ganze "Union" -Bit ... Overkill ist. Das Makro könnte durchaus geschrieben werden als '#define TRMGR (* (volatile unsigned char *) 0xF0250)' und es würde sich genauso verhalten. Dies bedeutet "behandle die Speicheradresse 0xF0250 als ein 'flüchtiges unsigniertes Zeichen *' und greife auf den Wert zu, der unter dieser Adresse gespeichert ist ". Die Version mit der Union macht das gleiche, langatmiger. –