2015-07-13 35 views
0

我正在努力從下面的switch語句中退出。任何幫助是極大的讚賞。開關語句在終止後不會重新啓動

我有幾個case語句,我的問題是如果中斷標誌從外部中斷變爲高電平,任何操作應該停止並返回到初始狀態,等待啓動標誌爲高電平。

當前所有描述的功能都在工作,除了在中斷標誌爲高電平之後回到其初始狀態。例如,當我按取消操作時操作終止。但是,取消後系統不會再次啓動。

在此先感謝。

while(1) 
{ 

    switch(state) 
    { 
     case STOPPED: // Master control 
      if(start_flag == true) 
      { 
       state = WAITING_FOR_SYNC; 
       start_flag = false; 
      } 
      break; 

     case WAITING_FOR_SYNC: 
      if(sync_flag == true) // waiting for input to be synchronised 
      { 
       state = SAMPLED_AND_PROCESSING; 
       sync_flag = false; 
       sampleCounter = 0; 
       samplingComplete = false; 
      } 
      break; 

     case SAMPLED_AND_PROCESSING:  
      if(samplingComplete == true) // samples to be loaded in a buffer 
      { 
       gpio_set_pin_low(AVR32_PIN_PA07); 
       windowing(); 
       rms(x); 
       fft_run(window); 
       peak_search(fft_mag); 
       envelope_output(envelope); 
       state = LOOP; 
      } 
      break; 

     case LOOP: 
      gpio_set_pin_high(AVR32_PIN_PA07); 
      delay_ms(5); 
      loop++; 
      if(loop == 23) 
      { 
       state = RS485_OUT; 
       loop=0; 
      } 
      else 
      { 
       state = SAMPLED_AND_PROCESSING; 
       sampleCounter = 0; 
       samplingComplete = false; 
      } 
      break; 

     case RS485_OUT: 
      //SendTx(); 
      state = STOPPED; 
      break; 
     } 
    } // switch statement close bracket 
    if(break_flag == true) 
     state = STOPPED; 
}// while close bracket 
+4

顯示'break_flag'的聲明。它是不穩定的嗎? – chux

回答

2

問題可能是break_flag保持爲真,並停止操作正常重新啓動。當您處理start_flag,將其設置爲false狀態設置爲WAITING_FOR_SYNC後:

if(start_flag == true) 
{ 
    state = WAITING_FOR_SYNC; 
    start_flag = false; 
} 

所以應用相同的邏輯來break_flag

if(break_flag == true) 
{ 
    state = STOPPED; 
    break_flag = false; 
} 

這樣break_flag將只應用一次,你贏了在重新啓動之前不必清除它。

+0

是的。這解決了問題。謝謝!! – Jin

0

break_flag == true的檢查在while循環之外。 所以一旦進入while循環,程序永遠不會檢查 的break_flag這種或那種方式。我的猜測沒有看到其餘的代碼,break_flag檢查應該在切換後的while循環中。交換機中的break語句突破 switch語句,而不是任何周圍的循環。

+0

嗨,對不起,我的演示文稿是錯誤的,if語句實際上在while循環中。它剛好在switch語句的左括號之後。 – Jin

+0

根據chux的評論,那麼這裏如何聲明break_flag?如果它不穩定,編譯器可能會優化檢查。 while循環中的任何內容都不會更改break_flag,因此編譯器可以將檢查移到循環外部,然後生成常量代碼。 – user464502

+0

@ user464502「break_flag」的初始化值是什麼? – ameyCU