web-dev-qa-db-ja.com

CまたはC ++でハードウェアに書き込むときに揮発性を使用する必要がありますか?

CまたはC++のハードウェア(FIFO)への書き込み時にvolatileを使用する必要があります。ハードウェアを読むときにvolatileが必要であることはオンラインのマニュアルから確認するのが簡単ですが、書き込みについてはどうでしょうか。私は、オプティマイザがループを排除して値の配列をFIFOに書き込むことができ、最後のエントリを書き込むことができます。

17
Nigel Davies

C規格によると(C99×6.7.3脚注106、P.109 ここ) )。

volatile宣言を使用して、メモリマップされた入出力ポートまたは非同期的に割り込み関数によってアクセスされるオブジェクトに対応するオブジェクトを記述するために使用されます。 このように宣言されたオブジェクトに対するアクションは、式を評価するための規則によって許可されている場合を除き、実装または並べ替えされてはならない。

準拠Cコンパイラを使用している場合は、メモリマップハードウェアへの書き込み時にvolatileを使用する必要があると仮定してください。


実行中の特定のマシンとコンパイラに応じて、volatilevolatileの使用法は最大で冗長になります。

実装は、要約と実際のセマンティクスとの間の1対1の対応を定義するかもしれません:すべてのシーケンスポイントで、実際のオブジェクトの値は抽象セマンティクスによって指定されたものと一致します。キーワードvolatileは冗長になります。


C++によると, 最新のドラフトによると

注5:volatileオブジェクトの値は、実装によって検出されずに変更される可能性があるため、オブジェクトを含む積極的な最適化を回避するための実装へのヒントです。さらに、いくつかの実装形態では、揮発性は、オブジェクトにアクセスするために特別なハードウェア命令が必要であることを示しているかもしれない。詳細な意味論については[INTRO.Execution]を参照してください。 一般的に、揮発性の意味はC++でC++であることを意図しています。 - エンドノート

2
Marco Bonelli