我想在按下按钮后中断主循环。
因此,我更改了按钮按下中断中的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;
}发布于 2019-01-25 13:57:30
编译器从代码中推断出,您没有更改代码中的变量,因此它可以优化读取它。它并不假设每个变量都可以在其他地方进行更改以提高效率。如果您将变量标记为volatile,这意味着可以在本地代码之外修改该变量,并且不应将其优化。
因此将定义更改为
UINT8 volatile isRunning;将告诉编译器不要优化变量访问。
https://stackoverflow.com/questions/54359587
复制相似问题