0
私は配列を持っています。 私はメインプログラムから使用しています。 私はISRから使用しています。 私はいつもそれを揮発性として定義しなければなりませんか? コンパイラはどのような最適化をアレイに適用できますか?配列とvolatileの使用
私は配列を持っています。 私はメインプログラムから使用しています。 私はISRから使用しています。 私はいつもそれを揮発性として定義しなければなりませんか? コンパイラはどのような最適化をアレイに適用できますか?配列とvolatileの使用
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
ありがとう。私はそれを知っている。私は配列だけが不思議でした。あなたが「問題ではない」と言うなら、私は「揮発性」を使用します。 – koluna