MDK-ARM C:中断后while循环不会中断

时间:2019-01-25 05:45:35

标签: c arm keil

我想在按下按钮后打破主循环。

因此,我在按钮按下中断中更改了isRunning的值。但这没有用。

当我将代码if(!isRunning){break;}更改为if(0 == isRunning){break;}时,它将在70%的时间内正常工作。

如果我在循环中输出isRunning值。它将每次都工作。但是我在等待someOtherSignal时无法执行输出,因为它的任务时间太长,执行输出时我可能会错过信号。

我想知道为什么会这样。以及我该如何解决。

在main.h

extern UINT8 isRunning;

在main.c

UINT8 isRunning;
....
//mainfunc
    isRunning = 1;
    output("before loop");
    while(!someOtherSignal){
        if(!isRunning){
            break;
        }
    }
    output("after loop");
....

在中断中。c

void buttonPress_Routine(){
    isRunning = 0;
    output(isRunning);//output 0 when button pressed;
}

1 个答案:

答案 0 :(得分:3)

编译器从代码中推断出您没有更改代码中的变量,因此它可以优化读取变量。不能假设为了提高效率而可以在其他地方更改每个变量。如果将变量标记为volatile,则意味着可以在本地代码之外修改变量,而不能对其进行优化。

因此将定义更改为

UINT8 volatile isRunning;

会告诉编译器不要优化变量访问。