メモリマップドI/OのI/OポートにアクセスするプログラムをC言語で記述するときの注意点として、適切なものはどれか。
ア | アセンブラのIN/OUT命令を用いたアクセス用関数を呼び出して、アクセスする。 |
イ | コンパイラによる最適化を抑止するために、volatile型修飾子を付けて宣言した変数のポインタアドレスとして指定して、アクセスする。 |
ウ | 他の関数からアクセスされるのを防ぐために、静的広域変数として宣言してアクセスする。 |
エ | ポインタではアクセスできないので、配列として実態を宣言してアクセスする。 |
答え イ
【解説】
メモリマップドI/OのCPUでは各種I/Oはメモリと同じようにアドレスを指定することでアクセスができます。
ただ、C言語で書かれたプログラムはコンパイラが最適化をし、I/Oのアドレスから読みだしたデータはレジスタにセットされ、その後、同じアドレスに繰り返しアクセスするとレジスタのデータを参照するだけで、I/Oにアクセスしなくなってしまうため、これを防ぐように変数にvolatile型修飾子をつけて宣言します。
【キーワード】
・メモリマップドI/O