次のマクロ定義の意味は何ですか?
#define REG(x) (*((volatile unsigned int *)(x)))
ポインターとしてキャストx
し、volatile unsigned int
そのポインターを逆参照して、x
「指す」ものの値を取得します。
x
実際にはポインターとして宣言する必要はないことに注意してください。これは、メモリ内のどこかへのアドレスとして扱われるリテラル整数でもかまいません。組み込みシステムや、固定アドレスにあるものがあるカーネル ブートアップ コードで役立ちます。
volatile
キーワード Grossly は、コンパイラが実際にアクセスし、各出現時に修飾されたデータを書き込む必要があることを意味します。
愚かな例として、ループを考えてみましょう
#define REG(x) (*((volatile unsigned int *)(x)))
for (REG(0x1234)=0; REG(0x1234)<10; REG(0x1234)++)
dosomethingwith(REG(0x1234)*2);
キーワードを入れなかった場合volatile
、最適化コンパイラは (dosomethingwith
インライン化されていると仮定して) 0x1234 のメモリの内容を 1 回 (ループの前に) レジスタにロードし、おそらくループの後にのみ更新し、内容のみをインクリメントしてテストすることができます。レジスタ (ループ内の位置 0x1234 へのアクセスを気にせずに)。
キーワードを使用volatile
すると、ループごとに 0x1234 の場所 (おそらくハードウェア ポートまたはデバイス) にアクセスするために、コンパイルされたバイナリ コードが必要になります。