Ожидание в цикле while
- Войдите на сайт для отправки комментариев
Ср, 18/09/2019 - 20:56
Приветствую. Задача в сабже. Сделать ожидание в цикле while. Есть байт с флагами, пока нужный флаг равен 0, то дальше не идем. Но в железе не работает, т.е. работает весьма странно. Если тело цикла остается пустым, то программа не идет дальше. Но стоит вписать в тело цикла пару действий, тот же delay(), то выполнение происходит. Не могу понять почему.
#define interrupt 0 #define left 1 #define right 2 #include <avr/interrupt.h> byte flags; void setup() { pinMode (4, INPUT_PULLUP); pinMode (5, INPUT_PULLUP); pinMode(13, OUTPUT); Serial.begin(9600); Serial.println(F("encoder test")); PCICR = B00000100; PCMSK2 = B00010000; sei(); } void loop() { while (!bitRead(flags, interrupt)){ //Serial.println(flags); //delay(1000); } // Serial.println(flags); // if (bitRead(flags, interrupt)) { Serial.println(flags); if (bitRead(flags, left)) { Serial.println(F("turn left")); bitClear(flags, left); //bitClear(flags, interrupt); } if (bitRead(flags, right)) { Serial.println(F("turn right")); bitClear(flags, right); //bitClear(flags, interrupt); } bitClear(flags, interrupt); //} } ISR(PCINT2_vect) { if (!digitalRead(4)) { bitSet(flags, interrupt); digitalWrite(13, !digitalRead(13)); if (digitalRead(5)) { bitSet(flags, right); //bitClear(flags, right); } else { bitSet(flags, left); //bitClear(flags, right); } } }
Все, разобрался.
Переменную надо volatile объявить, чтобы в прерывании менялась. Но все равно странно... Почему тогда в остальных случаях работало.
Потому что non-volatile переменные и связанные с ними вычисления компилятор оптимизирует. Видимо считает, что результат вычисления условия всегда false и выкидывает while() целиком из объектного кода.
Включите уровень дебага компилятора повыше - узнаете много нового.