ループの最適化

いつもお世話になっております。

以下のようなプログラムで、loop1()はwhileを抜けられず復帰しないのですが、 loop2()は、正しく復帰します。

loop1と、loop2の違いは、Delay()を呼ぶか、呼ばないかの違いしか有りません。

タイマー割り込みによりTimerは、0になります。 (Flagは0のままとします。)

多分?ループ最適化による影響ではないかと思うのですが、コンパイルオプションを替えても状況は変わりません。

どの様なオプションが影響するか お教え願えないでしょうか?

 

int Flag ;
int Timer;

void Delay( void )
  {
    asm("NOP");
  }

void Interrupt_1ms( void )
  {
    if ( Timer > 0 ) Timer--;
  }

int loop1( void )
  {
    Flag = 0;
    Timer = 100;
    while(1)
      {
        if ( Flag ) break;
        if ( Timer == 0 )
         {
           return( 1 );
         }
     }
    return( 0 );
 }

int loop2( void )
  {
    Flag = 0;
    Timer = 100;
    while(1)
      {
        Delay(); // 重要
        if ( Flag ) break;
        if ( Timer == 0 )
         {
           return( 1 );
        }
     }
    return( 0 );
  }

Parents
  • にもちさん、
    かふぇルネ管理人です。
    初心者向けフォーラムにふさわしい、楽しい話題で盛り上がってますね。
    職人は道具を使いこなしてなんぼの世界ですので、師匠さんたちのノウハウを大いに吸収してください。
    ご師匠さんたち、みなさん優しいですね。
Reply
  • にもちさん、
    かふぇルネ管理人です。
    初心者向けフォーラムにふさわしい、楽しい話題で盛り上がってますね。
    職人は道具を使いこなしてなんぼの世界ですので、師匠さんたちのノウハウを大いに吸収してください。
    ご師匠さんたち、みなさん優しいですね。
Children
No Data