当条件为假并插入延迟时,while 循环停止
while loop stops just when condition is false and a delay is inserted
我想执行一个 while 循环直到达到一个条件,这个条件是由用户按钮触发的中断给出的,但是当我按下按钮时 while 循环没有结束,奇怪的是如果我在循环中放置一个延迟然后它就可以工作
//does not works:
while( 1 )
{
PRINTF("hello\n\r");
while (button_state==0)
{
//do something
if(button_state==1)
break;
}
button_state=0;
}
//works:
while( 1 )
{
PRINTF("hello\n\r");
while (button_state==0)
{
HAL_Delay(500);//i don't know why needs this to work
//do something
}
button_state=0;
}
//does not works:
while( 1 )
{
PRINTF("hello\n\r");
while (button_state==0)
{
//do something
}
button_state=0;
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
button_state = 1;
}
程序以 "hello" 开始,然后进入 while 循环,我按下按钮,此时中断将 button_state 置为 1,我希望 while 循环结束,到达我重置条件 "button_state=0;" 并再次看到 "hello" 的行,但没有任何反应。如果我在循环中插入延迟,所有预期都会实现
如果您的变量 button_state
未声明为 volatile,编译器可能会尝试优化 while (button_state==0) {}
内对 button_state
的访问,从而导致意外行为。尝试将其声明为 volatile
.
编辑:发布已删除的答案以供参考,因为 OP 在评论中接受了这是解决他的问题的方法。
我想执行一个 while 循环直到达到一个条件,这个条件是由用户按钮触发的中断给出的,但是当我按下按钮时 while 循环没有结束,奇怪的是如果我在循环中放置一个延迟然后它就可以工作
//does not works:
while( 1 )
{
PRINTF("hello\n\r");
while (button_state==0)
{
//do something
if(button_state==1)
break;
}
button_state=0;
}
//works:
while( 1 )
{
PRINTF("hello\n\r");
while (button_state==0)
{
HAL_Delay(500);//i don't know why needs this to work
//do something
}
button_state=0;
}
//does not works:
while( 1 )
{
PRINTF("hello\n\r");
while (button_state==0)
{
//do something
}
button_state=0;
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
button_state = 1;
}
程序以 "hello" 开始,然后进入 while 循环,我按下按钮,此时中断将 button_state 置为 1,我希望 while 循环结束,到达我重置条件 "button_state=0;" 并再次看到 "hello" 的行,但没有任何反应。如果我在循环中插入延迟,所有预期都会实现
如果您的变量 button_state
未声明为 volatile,编译器可能会尝试优化 while (button_state==0) {}
内对 button_state
的访问,从而导致意外行为。尝试将其声明为 volatile
.
编辑:发布已删除的答案以供参考,因为 OP 在评论中接受了这是解决他的问题的方法。