[英]MDK-ARM C: While loop won't break after interrupt
我想在按下按鈕后突破主循環。
所以我在按下按鈕中斷時更改了isRunning
值。 但它沒有用。
if(!isRunning){break;}
更改代碼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;
將告訴編譯器不要優化變量訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.