循环"而"不满足中断的两个条件

时间:2016-12-01 15:28:16

标签: c loops interrupt avr stm32

我在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循环,也会发生同样的事情。造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分:3)

您需要使用volatile

声明t_ms
An object passed as a parameter to the method that is invoked when the bookmark resumes.

Volatile告诉编译器变量可能因外部因素而发生变化,因此编译器永远不会认为变量会保持不变。

换句话说,它将强制编译器检查每个循环以查看t_ms是否已更改,而不是假设它永远不会更改。