MDK-ARM C: цикл не прерывается после прерывания - PullRequest
0 голосов
/ 25 января 2019

Я хочу разорвать основной цикл после нажатия кнопки.

Поэтому я изменяю значение 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;
}

1 Ответ

0 голосов
/ 25 января 2019

Компилятор выводит из кода, что вы не меняете переменную в своем коде, чтобы он мог оптимизировать чтение.Он не предполагает, что каждая переменная может быть изменена в другом месте для эффективности.Если вы пометите переменную как volatile, это означает, что переменная может быть изменена вне локального кода и не должна быть оптимизирована.

Таким образом, изменение определения на

UINT8 volatile isRunning;

скажет компилятору не оптимизировать доступ к переменной.

...