3

ポインターと構造体についていくつか読んでいましたが、理解できません。マイクロコントローラーのヘッダーファイルに次の内容があります。

#define NVIC_BASE (SCS_BASE + 0x0100) /*< NVIC Base Address */ (1)
#define NVIC ((NVIC_Type *) NVIC_BASE) /*< NVIC configuration struct */ (2)

後者のコードでは、次のようなものがあります。

NVIC->ICER[0] = (1<<4);

これは(定義のために)次のものに対応していますか?

(NVIC_Type *) NVIC_BASE).ICER[0] = (1<<4);

NVIC_Type は、割り込みを設定およびクリアするためのいくつかのレジスタを備えた単なる typedef 構造体です。(2) 構造体の開始アドレスが NVIC_BASE アドレスであることを何とか管理していることは明らかです。しかし、どのように?

括弧内のこの構造体 (NVIC_Type *) の後のポインタ (*) は何ですか?

4

1 に答える 1

3

NVIC_BASEアドレスです。これ(NVIC_Type *)はキャストです。つまり、参照を参照すると、構造体NVICへのポインターとして解釈されます。NVIC_Type

したがって、 と書くNVIC->ICER[0]と、NVIC が宣言された構造体であるかのように見えますが、アドレスは一定です。このようにして、構造体のレイアウトが周辺メモリ マップと一致し、指定されたベース アドレスを使用してレジスタが整列し、ハードウェアを操作できるようになります。

また、yesNVIC->ICER[0] = (1<<4);と同じです(*(NVIC_Type *) NVIC_BASE).ICER[0] = (1<<4);

于 2012-05-21T16:46:14.487 に答える