我在AVR或STM32 MCU上等待一段时间来进行真实世界的事件(例如按下按钮3秒钟),我遇到了以下代码的问题:
#define PRESS_BUTTON
int waiting = 0;
int t_ms = 0; // time counter
//...
int main(void)
{
while(1)
{
waiting = t_ms + 3000; // waiting button 3 sec
while ((t_ms < waiting) && (!PRESS_BUTTON)) // infinite loop
{}
printf("out"); // not printed
waiting = t_ms = 0;
}
}
ISR( TIMER0_OVF_vect ) // timer interrupt
{
t_ms++;
}
但是如果我在printf()
循环中添加while
,它就可以了!
如果我使用do...while
循环,也会发生同样的事情。造成这种情况的原因是什么?
答案 0 :(得分:3)
您需要使用volatile
声明t_msAn object passed as a parameter to the method that is invoked when the bookmark resumes.
Volatile告诉编译器变量可能因外部因素而发生变化,因此编译器永远不会认为变量会保持不变。
换句话说,它将强制编译器检查每个循环以查看t_ms是否已更改,而不是假设它永远不会更改。