1

次のマクロ定義の意味は何ですか?

#define REG(x) (*((volatile unsigned int *)(x)))
4

2 に答える 2

5

ポインターとしてキャストxし、volatile unsigned intそのポインターを逆参照して、x「指す」ものの値を取得します。

x実際にはポインターとして宣言する必要はないことに注意してください。これは、メモリ内のどこかへのアドレスとして扱われるリテラル整数でもかまいません。組み込みシステムや、固定アドレスにあるものがあるカーネル ブートアップ コードで役立ちます。

于 2013-09-13T12:13:54.123 に答える
3

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 の場所 (おそらくハードウェア ポートまたはデバイス) にアクセスするために、コンパイルされたバイナリ コードが必要になります。

于 2013-09-13T12:59:52.993 に答える