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;
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? –
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. –