Switch语句终止后不会重启

时间:2015-07-13 02:05:06

标签: c switch-statement embedded avr

我正在努力退出以下的switch语句。任何帮助是极大的赞赏。

我有几个case语句,我的问题是如果break标志从外部中断升高,任何操作都应该停止并返回其初始状态,等待start flag升高。

目前所有描述的功能都在工作,除了在break标志为高电平后返回其初始状态。例如,当我按下取消时操作终止。但是,取消后系统不会再次启动。

提前致谢。

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

2 个答案:

答案 0 :(得分:2)

问题可能是break_flag仍然存在并且停止正常重新启动操作。处理start_flag时,将状态设置为WAITING_FOR_SYNC后将其设置为false:

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

所以将相同的逻辑应用于break_flag

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

这种方式break_flag只会被应用一次,您无需在重新启动之前将其清除。

答案 1 :(得分:0)

对break_flag == true的检查在while循环之外。 因此,一旦进入while循环,程序就永远不会检查 对于break_flag这种或那种方式。我没有看到其余代码的猜测就是break_flag检查应该在切换之后的while循环中。交换机内部的break语句突破了 switch语句,而不是任何环绕循环。