令和2年度 秋期 エンベデッドシステムスペシャリスト試験 午前II 問1
【問題1】
メモリマップドI/OのI/OポートにアクセスするプログラムをC言語で記述するときの注意点として、適切なものはどれか。
アセンブラのIN/OUT命令を用いたアクセス用関数を呼び出して、アクセスする。
コンパイラによる最適化を抑止するために、volatile型修飾子を付けて宣言した変数へのポインタとしてアドレスを指定して、アクセスする。
他の関数からアクセスされるのを防ぐために、静的広域変数として宣言してアクセスする。
ポインタではアクセスできないので、配列として実体を宣言してアクセスする。
【解説】
ア: アセンブラのIN/OUT命令を用いたアクセス用関数を呼び出して、アクセスする。
誤り。アセンブラのIN/OUT命令は、ポートマップドI/Oに使用される場合が一般的で、メモリマップドI/Oでは適用されません。
イ: コンパイラによる最適化を抑止するために、volatile型修飾子を付けて宣言した変数へのポインタとしてアドレスを指定して、アクセスする。
正しい。メモリマップドI/Oでは、コンパイラの最適化によって意図した動作が阻害される可能性があるため、volatile型修飾子を使用して最適化を抑止します。
ウ: 他の関数からアクセスされるのを防ぐために、静的広域変数として宣言してアクセスする。
誤り。静的広域変数は、他の関数からのアクセス制限には役立ちますが、メモリマップドI/O特有の注意点ではありません。
エ: ポインタではアクセスできないので、配列として実体を宣言してアクセスする。
誤り。メモリマップドI/Oではポインタによるアクセスが基本であり、この選択肢は不適切です。
【答え】
イ: コンパイラによる最適化を抑止するために、volatile型修飾子を付けて宣言した変数へのポインタとしてアドレスを指定して、アクセスする。
出典:令和2年度 秋期 エンベデッドシステムスペシャリスト試験 午前II 問1