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

MDK-ARM C: While loop won't break after interrupt

我想在按下按钮后跳出主循环。

所以我更改了按钮按下中断中的 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");
....

在interrupt.c

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

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

所以将定义更改为

UINT8 volatile isRunning;

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