switch 语句终止后不会重新启动
Switch statement won't restart after termination
我正在努力退出以下 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 == true 的检查在 while 循环之外。
所以一旦进入 while 循环,程序就永远不会检查
对于 break_flag 一种或另一种方式。在没有看到其余代码的情况下,我的猜测是 break_flag 检查应该在切换之后的 while 循环内。 switch 中的 break 语句会跳出
switch 语句,而不是任何周围循环。
问题可能是 break_flag
保持正确并阻止操作正确重新启动。当你处理start_flag
的时候,你把state设置为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
只会应用一次,重启前不需要清除。
我正在努力退出以下 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 == true 的检查在 while 循环之外。 所以一旦进入 while 循环,程序就永远不会检查 对于 break_flag 一种或另一种方式。在没有看到其余代码的情况下,我的猜测是 break_flag 检查应该在切换之后的 while 循环内。 switch 中的 break 语句会跳出 switch 语句,而不是任何周围循环。
问题可能是 break_flag
保持正确并阻止操作正确重新启动。当你处理start_flag
的时候,你把state设置为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
只会应用一次,重启前不需要清除。