Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странная работа оптимизатора MPLAB C32
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Slonic
Имеется процессор PIC32MX340, компилятор MPLAB C32 и следующий фрагмент программы:

Код
BYTE flag;

В функции main()

flag = 1;           // заводим переменную и устанавливаем ее в 1
while(flag);        // стоим здесь, пока значение переменной не сбросится в 0
LED1 = 1;         // а потом зажигаем лампочку

Потом в функции по периодическому прерыванию:

flag = 0;           // сбрасываем флаг
LED2 = 1;         // и включаем другую лампочку


При отключенной оптимизации (level 0), все работает правильно. При включенной - программа вечно стоит в цикле while, при том что прерывание вызывается и светодиод LED2 горит! Поставил последнюю версию компилятора (1.10), все то же самое. Как бороться пока не знаю, наверное, придется локально отключать оптимизатор...
Savrik
Я с процессором PIC32MX340 не работал, но судя по коду, у вас локальная переменная flag, внешне(из прерываний, к примеру) ее изменить нельзя. То есть она всегда будет равно 1, и цикл будет бесконечным..


Что ж Вы быстро так редактируете свои посты?smile.gif) забираю слова назадsmile.gif
Slonic
Цитата(Savrik @ Feb 16 2010, 23:42) *
Я с процессором PIC32MX340 не работал, но судя по коду, у вас локальная переменная flag, внешне(из прерываний, к примеру) ее изменить нельзя. То есть она всегда будет равно 1, и цикл будет бесконечным..


Ой, прошу прощения, переменная разумеется глобальная и объявлена в самом начале программы, иначе ее бы не было видно в других функциях. Код исправил, спасибо.
Savrik
Попробуйте обьявить переменную flag как volatile, это укажет компилятору не оптимизировать ее.
scifi
Забавно, что именно таким образом многие узнают про volatile.
Это не странная, а абсолютно нормальная работа оптимизатора, и volatile нужен именно для этого.
Slonic
Ну значит я буду еще один в этой бесконечной последовательности ) Спасибо, заработало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.