SkillStack
テクノロジ系1 / 25問

エンベデッドシステムスペシャリスト試験 令和2年度 秋期 午前II 問1

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

選択肢を押すと答え合わせができます。

正解と解説を見る

【正解】イ

メモリマップドI/Oでは、I/Oポートのレジスタが主記憶と同じアドレス空間に配置されます。そのため、対象アドレスをvolatile型修飾子付きの型へのポインタに変換し、そのポインタを介して読み書きします。I/Oレジスタの値は周辺装置によって変化し、同じアドレスへの書込みにも装置を動作させる意味があります。volatileを付けないと、コンパイラが不要な読出しや書込みと判断して削除したり、一度読み出した値を再利用したりする可能性があります。したがって、最適化を抑止するイが適切です。

アのIN/OUT命令を用いる方法は誤りです。これは、メモリとは別のI/Oアドレス空間を専用命令で操作するポートマップドI/Oの説明です。

ウの静的広域変数とする方法は誤りです。staticは変数の記憶期間や名前の参照範囲を指定するものであり、他の関数からのアクセスやコンパイラの最適化を防ぐものではありません。

エの配列として実体を宣言する方法は誤りです。通常の配列を宣言するとRAM上などに別の記憶領域が確保されます。特定のハードウェアアドレスにはポインタを用いてアクセスできます。

【ポイント】 volatileは、プログラム外部で値が変わるI/Oレジスタや割込み処理と共有する変数で重要です。 ただし、volatileだけでは処理の不可分性や複数コア間の同期まで保証されません。 メモリマップドI/OとポートマップドI/Oの違いを整理しておきましょう。

出典:令和2年度 秋期 エンベデッドシステムスペシャリスト試験 午前II 問1
※ 解説は SkillStack 編集部が作成したものです。Web 表示のため、図表の配置や表記を一部改めています。

この回の25問を、アプリで通しで解く

  • 本番と同じ問題数・制限時間で通し演習(模試モード)
  • 間違えた問題は自動で「復習すべき問題」に回る
  • 解説で分からない点はAIに質問できる
SkillStackで無料で始める