【问题标题】:MDK-ARM C: While loop won't break after interruptMDK-ARM C:中断后循环不会中断
【发布时间】:2019-01-25 05:45:34
【问题描述】:

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

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

【问题讨论】:

    标签: c arm keil


    【解决方案1】:

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

    所以把定义改成

    UINT8 volatile isRunning;
    

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

    【讨论】:

    • @chux 谢谢,自动更正让我明白了。这里不需要诱惑:)
    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 2021-01-30
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多