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;
会告诉编译器不要把变量访问优化掉。
我想在按下按钮后跳出主循环。
所以我更改了按钮按下中断中的 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;
会告诉编译器不要把变量访问优化掉。