簡體   English   中英

MDK-ARM C:中斷后循環不會中斷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM