c - switch 语句终止后不会重新启动

标签 c switch-statement embedded avr

我正在努力退出以下 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

最佳答案

问题可能是 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 只会应用一次,您不必在重新启动之前清除它。

关于c - switch 语句终止后不会重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31374503/

相关文章:

c - 我如何使用 SIGINT 来打破对 accept() 或 read() 的等待?

c - printf 指针参数类型警告?

javascript - Switch 语句比较用户输入 Javascript

c++ - 几次访问后,mmap 因无法打开/dev/mem 而死

c - 将函数分配给 packetbuf_copyfrom

c - 在 C 中过滤 XY 数组

C++ Switch 语句大小写错误

c - 输入末尾的预期声明或语句。我数出了正确的括号数量

你能用整数运算代替浮点除法吗?

c - micium 的 printf 函数