首页 > 解决方案 > while 循环仅在条件为假并插入延迟时停止

问题描述

我想执行一个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;" 并再次看到“你好”,但没有发生这种情况。如果我在循环内插入延迟,则所有预期都已实现

标签: cstm32ldiscovery

解决方案


如果您的变量button_state未声明为 volatile,则编译器可能会尝试优化对button_state内部的访问,while (button_state==0) {}从而导致意外行为。尝试将其声明为volatile.

编辑:发布已删除的答案以供参考,因为 OP 在评论中接受了这是解决他的问题的方法。


推荐阅读