2016-07-05 13 views
0

私は、MSP-EXP430G2がCode Composer Studioを使用してLEDを点滅させるためのチュートリアルプログラムを試しています。もともと、それは点滅のために無限ループを持っていた:内側のforループは無視されます

for(;;) 
    // This empty for-loop will cause the lines of code within to loop infinitely 

     { 

      P1OUT ^= 0x01; 
    // Toggle P1.0 using exclusive-OR operation (^=) 

    // P1OUT is another register which holds the status of the LED. 
    // '1' specifies that it's ON or HIGH, while '0' specifies that it's OFF or LOW 
    // Since our LED is tied to P1.0, we will toggle the 0 bit of the P1OUT register 

      for(i=0; i< 20000; i++); 

    // Delay between LED toggles. This for-loop will run until the condition is met. 
    //In this case, it will loop until the variable i increments to 20000. 
     } 
    } 

これは、コピーしたとチュートリアルから貼り付けて、意図したとおりにそれが働きました。私はその後、私はそれが有限ループであることを得ることができるかどうかを確認したかったので、私は、ループに変更:以前のコード内で宣言jに

for (j = 0; j<10; j++) 

。しかし、LEDはもはや点滅せず、デバッガでプログラムをステップ実行すると、for(i=0; i< 20000; i++);行が完全にスキップされます。これは、jを0に設定した場合にのみ発生しますが、j> -1に設定した場合は発生しません。私が10から0に減少するループを作成すると、同じ問題が発生します。これは、ループが有限になったときにのみ起こると考えるようになります。

明らかなものがありませんか?

+0

_この問題は、もはや再現できない問題や簡単な誤植によって引き起こされました。同様の質問がここでは話題になるかもしれないが、これは将来の読者を助けるとは思わない方法で解決された。これは、投稿する前に問題を再現するのに必要な最短のプログラムを特定して綿密に調べることで回避できます。_ –

+0

_この場合、変数iが20000になるまでループします._どうですか? –

+0

@WeatherVaneはい、そのループは点滅の間の遅延を設定します。私はLEDが何回点滅するかを指示する最初の(;;)を置き換えることを意味しました。 –

答えて

5

コンパイラは副作用のないコードを最適化することができます。カウンタがインクリメントされ、後で使用されない内側のforループは、このようなコードの例です。

この現象を回避するには、ループに副作用を導入します。 1つの方法は、ivolatileと宣言することです。その後、コンパイラは変更するたびにiの値をメモリに書き戻し、条件がfalseになるまでループを実行します。

また、多くの場合、埋め込みプラットフォームまたはコンパイラは、delay()および/またはsleep()の機能を提供します。ビジーなループではなく、それらを使用する方が優れたコーディング方法です。ハードウェアとMCUの速度に関係なく、より確定的な実行時間が得られます。

+2

'__delay_cycles()' –

0

内部ループの代わりにdelay()またはsleep()を使用することを検討してください。

関連する問題