2020年 秋期 エンベデッドシステムスペシャリスト 午前II 問1

メモリマップドI/OのI/OポートにアクセスするプログラムをC言語で記述するときの注意点として、適切なものはどれか。

 ア  アセンブラのIN/OUT命令を用いたアクセス用関数を呼び出して、アクセスする。
 イ  コンパイラによる最適化を抑止するために、volatile型修飾子を付けて宣言した変数のポインタアドレスとして指定して、アクセスする。
 ウ  他の関数からアクセスされるのを防ぐために、静的広域変数として宣言してアクセスする。
 エ  ポインタではアクセスできないので、配列として実態を宣言してアクセスする。


答え イ


解説
メモリマップドI/OのCPUでは各種I/Oはメモリと同じようにアドレスを指定することでアクセスができます。
ただ、C言語で書かれたプログラムはコンパイラが最適化をし、I/Oのアドレスから読みだしたデータはレジスタにセットされ、その後、同じアドレスに繰り返しアクセスするとレジスタのデータを参照するだけで、I/Oにアクセスしなくなってしまうため、これを防ぐように変数にvolatile型修飾子をつけて宣言します。


キーワード
・メモリマップドI/O

キーワードの解説
  • メモリマップドI/O
    アドレス空間上にメモリと入出力機器(I/O)が共存し、メモリのリード/ライトのためのCPU命令を入出力機器にも使用できます。
    入出力機器を特別扱いしないため、CPUの内部回路が簡略化され、高速化や低価格化が容易であり、多くのRISCで採用されています。

もっと、「メモリマップドI/O」について調べてみよう。

戻る 一覧へ 次へ