2009-11-03 6 views
15

揮発性変数は、どのセクションに格納されているプログラムメモリに格納されていますか?揮発性変数

答えて

7

変数のボラティリティは、変数が格納されている場所を変更しません。それが変わるのは、読み書きに関してアクセスする方法の意味です。

私はC標準がvolatileの実装について何も言わないと思います。しかし、典型的には、変数の書き込み操作のセマンティクスを解放し、変数の読み出し操作のアクアセマンティクスを揮発性の保証で解放します。しかし、これはすべての実装に当てはまるわけではなく、特定のコンパイラが保証するものを読むべきです。

+0

いいえ、これらのセマンティクスには、[this](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html)と[CERT](https ://www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+not+use+volatile+as+a+synchronization+primitive) '同期に 'volatile'を使わないでください' – Spudd86

2

メモリの「特別な」セクションに揮発性変数を格納する理由はありません。通常、不揮発性の変数を含む他の変数とともに格納されます。いくつかのコンパイラがvolatile変数をメモリの特別な部分に格納することを決定した場合、それを防ぐことは何もありません。しかし、言語レベルでは絶対に理由はありません。

なぜこのような質問をしていますか?あなたはそれがのメモリのいくつかの特別なセクションに格納する必要がありますと思った?

9

In C volatileは、 "この変数の値が変更されていないと仮定するのに十分な知識がありません"とコンパイラに伝えます。 BSS、CSSなどの「セクション」はありません。

特定のタイプの最適化を防止するために、コンパイラにフラグを設定することを検討してください。ハードウェアデバイスの入力により特定のアドレスのメモリが「変更」する可能性のある組み込みプログラミングに非常に便利です。

はここで良い説明です:http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658

+0

最適化している間、コンパイラはこの仮定値をどこから得るでしょうか?私は記憶のどの部分を意味しますか? – kapilddit

+1

これは、通常、値がCPUレジスタにあることをコンパイラーが「記憶」しているかどうかによって異なります。 volatileは、コンパイラがその前提を決して行なわず、各アクセス(通常はメインメモリから)の値をリロードします。 – Justicle

21

volatiletype qualifierないstorage class specifierので、それはまったく保管場所を決定するものではありません。それは変数ではなく、変数の型定義に影響します。

それは単に、むしろ例えばレジスタ内のいくつかの以前に読み込まれた値が有効なままであることを仮定よりも(どこそれがかもしれない)、明示的に変数の保管場所からそのタイプvolatileある変数を読み取るために、コンパイラを強制します。

4

volatileはストレージクラスを処理することはありません。

volatileはコンパイラに指示するか、コンパイラにその変数の "最適化を行わない"ように指示します。 コンパイラはその変数のコードを最適化しておらず、以前の値を保持するインターレースレジスタではなく、指定された場所から値を読み込みません。

変数をvolatileと宣言すると、外部イベントによって変更される可能性のある最新の値が取得されます。

その変数を揮発性として宣言していないとコードが正常に動作する可能性がありますが、時には正しい値が得られない可能性があります。 変数をvolatileとして宣言する必要がないようにします。

volatileは、ハードウェア関連のピンの割り込みなどの外部イベントを処理するときに一般的に使用されます。

例。 adc値を読み取ります。

const voltile means コード内のその変数の値を変更または変更することはできません。外部イベントのみが値を変更できます。

コントローラピンは一般に揮発性と定義されています。 は、揮発性コントローラが "ラッチによって読み込まれる"ではなく、 "ピンによって読み出される"ように変数を宣言することによって可能性があります。これは私の仮定です。その値が予期せず変更される可能性がいつでも

変数がvolatile宣言されなければならない。.. ...

間違っているが、まだ揮発性として変数を選択する混乱の多くがあります。実際には、変数の3種類のみ変更することができ:

  1. メモリマップ周辺レジスタマルチスレッドアプリケーション

    内のルーチン

  2. グローバル変数割り込みサービスによって修飾

  3. グローバル変数

リンク:http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword

したがって、このような場合にはvolatileとして変数に提供されます。

1

メモリマップされたデバイスを使用できるように、C/C++仕様では「揮発性」が使用されていました。このキーワードで定義された変数を最適化しないようにコンパイラに指示します。なぜなら、変数がコンパイラ可視コード内の状態を変更しないように見えるからです。

関連する問題