2013-07-21 8 views
5

次のコードがあります。これは私のIDEによって生成されたもので、私はそれを理解しようとしています。Cで低レベルの初期化を理解する

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

ここで、タイマーマネージャは、データシートに従って0xF0250の位置にあります。しかし私が理解できないのは文法です。

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

私はポインタについて知っています。しかし、私は本当に何が正確に行われているのか理解できません。誰かが私を助けてもらえ、次のようにBITS8はビットフィールドを持つ別の構造体ですところで:?

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; 

答えて

10

それは固定アドレス0xF0250でメモリマップドレジスタにアクセスするだけの方法です。ユニオンのBITフィールド、またはtrmgrフィールドを介して8ビットレジスタ全体を介してレジスタの個々のビットにアクセスできます。 #defineは、後者に簡単にアクセスできるようにしています。

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

volatileの使用 - メモリマップドI/Oは、それは/が意図したように、常に起こり書き込み、彼らは通常のメモリ位置にあるかもしれないとして、(離れて最適化されていない読み込みを保証するために登録すると、これは一般的な技術であります)。

+0

この 'volatile union un_trgmr *'は、共用体へのポインタを作成します。一番外側の点は何ですか?それは組合にその住所にあることを伝えますか? –

+3

最も外側の '*'は '共用体へのポインタ'を逆参照し、共用体を与えます。 'TRMGR'をl値(Paulで表示)またはr値として使うことができます:' unsigned char bits = TRMGR; '。私はマクロTRMGRのために、全体の "ユニオン"ビットが...過労であると主張します。マクロは '#define TRMGR(*(volatile unsigned char *)0xF0250)'と書くことができ、同じように動作します。これは、 "メモリアドレス0xF0250を' volatile unsigned char * 'として扱い、そのアドレスに格納されている値にアクセスします。組合とのバージョンは同じで、より長い間巻き込まれています。 –

関連する問題