Урок 21. Возможна проблема при оптимизации?

Обсуждение и вопросы по урокам Ардуино
Sergey
Сообщения: 1
Зарегистрирован: 15 сен 2019, 12:55

Урок 21. Возможна проблема при оптимизации?

Сообщение Sergey » 15 сен 2019, 13:25

Здравствуйте.
Огромное спасибо Эдуарду за те знания и время которые он тратит на нас.
При изучении урока 21 возникла следующая проблема.
В бесконечном цикле :

void loop()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (disp.flagClick[i][j] == true)
{
disp.flagClick[i][j] = false;
disp.digit[3] = disp.digit[2];
disp.digit[2] = disp.digit[1];
disp.digit[1] = disp.digit[0];
disp.tetradToSegCod(0, codKeys[i][j]);
soundCount = 30;
}
}
}
}

код не работает без строки с комментариями (пример ниже). Либо на месте delay должен быть Serial.print().
void loop()

{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
delay(1); // Если delay закомментировать код не работает.
if (disp.flagClick[i][j] == true)
{
disp.flagClick[i][j] = false;
disp.digit[3] = disp.digit[2];
disp.digit[2] = disp.digit[1];
disp.digit[1] = disp.digit[0];
disp.tetradToSegCod(0, codKeys[i][j]);
soundCount = 30;
}
}
}
}
Компиляция проходит без ошибок в обоих случаях.
Пробовал компилировать в ARDUINO IDE, и в Visual Studio Code с PlatformIO - результат одинаков.
Не подскажите в чём причина?
Может быть виной оптимизация при компиляции?


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Урок 21. Возможна проблема при оптимизации?

Сообщение Эдуард » 15 сен 2019, 23:53

Здравствуйте!
Да, так и есть. Попробуйте объявите переменные, которые используются в прерывании по таймеру, с квалификатором volatile.

Код: Выделить всё

volatile LedDigitsKeys disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13, 14,15,16,17, 6);
volatile byte soundCount=0;  // счетчик звука на нажатие


Вернуться в «Уроки Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя