c语言 - 循环"while"不满足中断的两个条件



我正在等待一段时间在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是否已更改,而不是假设它永远不会改变。

最新更新