OSとハードウェア
上のように装置の状態レジスタをメモリマップドI/Oで読むとき、volatileを付け、その領域をキャッシュしない設定にする理由として正しいものはどれか。
#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
; /* 装置の準備ができるまで待つ */
- Avolatileを付けると、読み出しの命令が1回だけにまとめられ、速くなるから
- Bキャッシュに入れると、装置のレジスタの値が自動的に0に戻るから
- C値は装置が変えるので、毎回実際に読み直さないと変化を見逃すから
答えと解説を見る
正解:C. 値は装置が変えるので、毎回実際に読み直さないと変化を見逃すから
装置のレジスタの値はプログラムとは無関係に装置が書き換えます。volatileがないと、コンパイラはループの中で値が変わらないと判断して1回だけ読み、永久に待ち続けるコードを作ることがあります。また、その領域をキャッシュすると、CPUはキャッシュにある古い値を読み続け、装置の変化が見えません。volatileは読み出しを省略させないための指定で、1回にまとめるのとは逆の働きです。キャッシュで値が0になることもありません。
- A. volatileは読み出しの省略を禁じるもので、まとめるのとは逆です。
- B. キャッシュしても値が0に戻ることはありません。
- C. 正しい。装置が値を変えるので、毎回実際に読む必要があります。