我正在等待一段时间在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++;
}
但是,如果我在while
循环中添加printf()
,它可以工作!
如果我使用do...while
循环,也会发生同样的事情。是什么原因引起的?
您需要用挥发性声明t_ms
volatile int t_ms =0;
挥发性告诉编译器,由于外部因素可能会更改变量,因此,编译器永远不会假设它会保持不变。
换句话说,它将迫使编译器检查每个循环以查看T_MS是否已更改,而不是假设它永远不会改变。