我在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'。好問題。 –