首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MDK-ARM C: While循环在中断后不会中断

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

Stack Overflow用户
提问于 2019-01-25 13:45:35
回答 1查看 129关注 0票数 1

我想在按下按钮后中断主循环。

因此,我更改了按钮按下中断中的isRunning值。但它并没有起作用。

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

如果我在循环中输出isRunning值。它每次都会起作用。但是我不能在等待someOtherSignal的时候输出,因为它的任务太长了,我在输出的时候可能会错过信号。

我想知道它为什么会这样。我怎么才能修复它呢。

在main.h中

代码语言:javascript
复制
extern UINT8 isRunning;

在main.c中

代码语言:javascript
复制
UINT8 isRunning;
....
//mainfunc
    isRunning = 1;
    output("before loop");
    while(!someOtherSignal){
        if(!isRunning){
            break;
        }
    }
    output("after loop");
....

在interrupt.c中

代码语言:javascript
复制
void buttonPress_Routine(){
    isRunning = 0;
    output(isRunning);//output 0 when button pressed;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-25 13:57:30

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

因此将定义更改为

代码语言:javascript
复制
UINT8 volatile isRunning;

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54359587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档