【问题标题】:Switch statement won't restart after terminationswitch 语句在终止后不会重新启动
【发布时间】:2015-07-13 02:05:05
【问题描述】:

我正在努力退出以下 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 的声明。是volatile吗?

标签: c switch-statement embedded avr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对 break_flag == true 的检查在 while 循环之外。 所以一旦进入while循环,程序永远不会检查 对于 break_flag 以一种或另一种方式。我没有看到其余代码的猜测是 break_flag 检查应该在切换之后的 while 循环内。 switch 中的 break 语句从 switch 语句,而不是任何周围的循环。

    【讨论】:

    • 嗨,对不起,我的介绍是错误的,if 语句实际上是在 while 循环内。它就在 switch 语句右括号之后。
    • 根据 chux 的评论,break_flag 是如何在这里声明的?如果它不是易失性的,编译器可能会优化检查。 while 循环中的任何内容都不会更改 break_flag,因此编译器可以将检查移出循环,然后生成常量代码。
    • @user464502 break_flag 的初始化值是多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2019-11-01
    • 2016-02-25
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多