2015-07-13 34 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