2016-11-23 9 views
1

私はnrf52マイクロコントローラ(CORTEX 34F)プロセッサを使用しています。私はメインループとタイマー割り込みルーチンの両方で変更されているメインループの変数チェックを持っています。変数がtrueの場合は、割り込みルーチンで変数が変更されたときにvolatileキーワードが本当に必要です

  1. メインループチェック:

    • 実行条件コード偽

    • セット変数

  2. タイマーごとに10の真のルーチンセット変数割り込みms

のでvolatileキーワードを指定せずに、コードが働いて、私はvolatileに変数を設定すると、動作しているようですが、私は確信していないではないようだ:私は皮質M4fは、データ・キャッシュを含んでいないと思う最初

  1. メモリ
  2. 秒:この場合は、コンパイラによってhandeldさ(アームKeil社)

どんな答えてください。

真実行した場合、本体のコード 2.リスト項目

+0

はいそれは必要です – Fredrik

+1

答えはこちらhttp://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c – dkolmakov

+2

@ dkolmakov:これは多かれ少なかれ重複していますが、 *キャッシュメモリ*のハードウェア機能と、レジスタ内の値をキャッシュする*ソフトウェア技術との間の誤解に対処していない可能性があります。 – Clifford

答えて

10

あなたはvolatileキーワードに関する誤解を持っています。具体的にはであり、キャッシュに関連するではありません。キャッシュの整合性は完全にハードウェアで処理され、volatileはそれに影響しません。

volatileの目的は、値が変更できないことを前提としたコードをコンパイラが生成しないようにすることです。 C言語は実行スレッドにサポートを提供せず、コードは単一のスレッドがあるかのように生成されます。コンパイラは、変数が明示的に変更されていないことを単一スレッド内で観察できる場合、明示的な読み取りを削除し、既知の値(たとえばレジスタに格納されている)を使用することがあります。

main()関数内のコードは、読み込み間に割り込みが発生する可能性があることを「認識しない」ため、読み込みを最適化できます。 volatileキーワードは、明示的にメモリを読み取るコードを生成するようにコンパイラに指示します。キャッシュのヒットやミス、またはキャッシュが全くないかどうかは、ハードウェアの問題ではありません。

埋め込みコードのIntroduction to the volatile keywordを読むことでメリットが得られます。それは正確にこの問題をカバーします。

0

上記のコメントに加えて、ほとんどのアプリケーション開発者は、次のステートメントの妥当性について混乱します。混乱は宣言にvolatileとconstのキーワードが共存することによって発生します。つまり、どのように変数がconstでもvolatileでもかまいませんか?

volatile const char * const ptr = 0x4000;

volatileは、変数がプログラムの範囲外で変更される可能性があることを理解することが重要です。上記のステートメント/同様のステートメントは、デバイスのハードウェアレジスタをマッピングするのに便利です。

関連する問題