我在AVR或STM32 MCU上等待一些真实世界事件的时间(例如,按下一个按钮3秒),并且遇到以下代码的问题:Loop“while”不满足中断条件
#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
循环,也会发生同样的事情。这是什么造成的?
'volatile'关键字的威力。更改为'volatile int t_ms = 0;' – LPs
除了添加'volatile'外,您如何反弹按钮?这需要用软件或硬件完成,否则程序总是表现不佳。 – Lundin
每5个满月只有一次我看到stackoverflow上正确需要的'volatile'。好问题。 –