我想在按下按钮后打破主循环。
因此,我在按钮按下中断中更改了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;
}
答案 0 :(得分:3)
编译器从代码中推断出您没有更改代码中的变量,因此它可以优化读取变量。不能假设为了提高效率而可以在其他地方更改每个变量。如果将变量标记为volatile
,则意味着可以在本地代码之外修改变量,而不能对其进行优化。
因此将定义更改为
UINT8 volatile isRunning;
会告诉编译器不要优化变量访问。