平成30年度春期 エンベデッドシステムスペシャリスト試験 午前II 問1
2025年6月20日
【問題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型修飾子を付けて宣言した変数へのポインタとしてアドレスを指定して,アクセスする。
出典:平成30年度 春期 エンベデッドシステムスペシャリスト試験 午前II 問1