c - 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;" 并再次看到“你好”,但没有发生这种情况。如果我在循环内插入延迟,则所有预期都已实现
解决方案
如果您的变量button_state
未声明为 volatile,则编译器可能会尝试优化对button_state
内部的访问,while (button_state==0) {}
从而导致意外行为。尝试将其声明为volatile
.
编辑:发布已删除的答案以供参考,因为 OP 在评论中接受了这是解决他的问题的方法。
推荐阅读
- c++ - 什么是用作 boost::icl::interval_map 值的高效标准库或 boost 容器?
- java - 使用 Spring Boot 对 Elasticsearch/AWS 进行 Java API 运行状况检查
- c++11 - 从过去的微秒中获取 time_t
- azure-devops - 仅构建已更改的项目
- php - 如何知道文本的大小?
- laravel - 在 Laravel 中上传文件
- c++ - 函数无法识别我在 C++ 中传递节点指针向量?
- python - 问题循环通过kwarg值python
- clang - 如何配置 GN(Google 的 generate-ninja)/Ninja 以使用不同的 clang 工具链
- python - 在 python 中使用 boto3 查询 cloudwatch 日志以获取不同的值