2016-06-15 21 views
0

私は配列を持っています。 私はメインプログラムから使用しています。 私はISRから使用しています。 私はいつもそれを揮発性として定義しなければなりませんか? コンパイラはどのような最適化をアレイに適用できますか?配列とvolatileの使用

答えて

2

intを宣言した後で2回読むと、コンパイラは最初の読み込みを覚えていて、もう一度読むのは気にしません。

static int value = 0; 

void ISR() { 
    ++value; 
} // ISR() 

int main() { 
    while (value==0) { 
     // Do nothing 
    } // while 
} // main() 

コンパイラは一度valueを読んで、その後、常に0として、何度も何度もそれをテストすることができます! ISRはそれを変更しますが、コンパイラはその変更を認識しません。

あなたはvolatileとしてvalueをマークした場合、コンパイラは常にそれを読み込みます:それはそれを覚えていることはありません:

static volatile int value = 0; 

それが配列であるかどうかは関係ありません:同じ問題が発生する可能性があります。

​​3210
+0

ありがとう。私はそれを知っている。私は配列だけが不思議でした。あなたが「問題ではない」と言うなら、私は「揮発性」を使用します。 – koluna

関連する問題