メモリマップドI/OのI/Oポートにアクセスするプログラムをc言語で記述するときの注意点として、適切なものはどれか。
メモリマップドI/Oはvolatile付きポインタで最適化を抑止する
選択肢
- アアセンブラのIN/OUT命令を用いたアクセス用関数を呼び出して、アクセスする。
- イコンパイラによる最適化を抑止するために、volatile型修飾子を付けて宣言した変数へのポインタとしてアドレスを指定して、アクセスする。
- ウ他の関数からアクセスされるのを防ぐために、静的広域変数として宣言してアクセスする。
- エポインタではアクセスできないので、配列として実体を宣言してアクセスする。
正解と解説
正解:イ コンパイラによる最適化を抑止するために、volatile型修飾子を付けて宣言した変数へのポインタとしてアドレスを指定して、アクセスする。
メモリマップドI/Oでは、I/Oレジスタが主記憶と同じアドレス空間に割り付けられ、通常のメモリアクセスと同じ手段で読み書きする。ただしI/Oレジスタの値はハードウェア側が勝手に書き換えるため、コンパイラが「値は変わらない」と判断してアクセスを削除したり順序を入れ替えたりすると正しく動作しない。そこでvolatile型修飾子を付けたポインタ経由でアクセスし、最適化による読み書きの省略・並べ替えを抑止するのが定石である。
選択肢ごとの解説
- アIN/OUT命令はI/Oが独立したアドレス空間をもつI/Oマップド方式のもので、メモリマップドI/Oでは使わない。
- イ正解。volatile宣言で最適化を抑止し、毎回実際のアドレスへアクセスさせる。
- ウstatic宣言はスコープを制限するだけで、最適化の抑止にはならない。
- エメモリマップドI/Oは固定アドレスをポインタで指してアクセスするのが基本で、実体を宣言する配列では正しいアドレスに割り付かない。
この問題は2回出題されています
- 2018年度 春期 午前II 問1この問題の代表ページ
- 2020年度 10月試験 午前II 問1(このページ)
同じ分野の他の問題
- 組込みシステムにおける、ソフトウェアのメモリ安全性(Memory Safety)を考慮した事例として、適切なものはどれか…2025年度 秋期 午前II 問17
- MISRA-Cの説明として、適切なものはどれか。2018年度 春期 午前II 問21
- 銀行の勘定系システムといった特定の分野のシステムに対して、業務知識、再利用部品、ツールなどを体系的に整備し、再利用を促進…2025年度 秋期 午前II 問20
- 組込みシステム開発におけるソフトウェアプロダクトライン開発の説明として、適切なものはどれか。2025年度 秋期 午前II 問18
- JIS Z 8521:2020(人間工学-人とシステムとのインタラクション-ユーザビリティの定義及び概念)によれば、ユー…2025年度 秋期 午前II 問12
最終更新:2026-08-25/解説・選択肢ごとの解説は資格暗記が独自に作成しています。問題文と選択肢の出典は上記のとおりです。