当条件为假并插入延迟时,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 在评论中接受了这是解决他的问题的方法。