реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Странная работа оптимизатора MPLAB C32, Вроде бы проще некуда...
Slonic
сообщение Feb 16 2010, 20:38
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 3-10-05
Из: Москва-Троицк
Пользователь №: 9 174



Имеется процессор PIC32MX340, компилятор MPLAB C32 и следующий фрагмент программы:

Код
BYTE flag;

В функции main()

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

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

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


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

Сообщение отредактировал Slonic - Feb 16 2010, 20:44
Go to the top of the page
 
+Quote Post
Savrik
сообщение Feb 16 2010, 20:42
Сообщение #2


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Я с процессором PIC32MX340 не работал, но судя по коду, у вас локальная переменная flag, внешне(из прерываний, к примеру) ее изменить нельзя. То есть она всегда будет равно 1, и цикл будет бесконечным..


Что ж Вы быстро так редактируете свои посты?smile.gif) забираю слова назадsmile.gif

Сообщение отредактировал Savrik - Feb 16 2010, 20:47
Go to the top of the page
 
+Quote Post
Slonic
сообщение Feb 16 2010, 20:45
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 3-10-05
Из: Москва-Троицк
Пользователь №: 9 174



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


Ой, прошу прощения, переменная разумеется глобальная и объявлена в самом начале программы, иначе ее бы не было видно в других функциях. Код исправил, спасибо.
Go to the top of the page
 
+Quote Post
Savrik
сообщение Feb 16 2010, 20:50
Сообщение #4


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Попробуйте обьявить переменную flag как volatile, это укажет компилятору не оптимизировать ее.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 17 2010, 07:24
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Забавно, что именно таким образом многие узнают про volatile.
Это не странная, а абсолютно нормальная работа оптимизатора, и volatile нужен именно для этого.
Go to the top of the page
 
+Quote Post
Slonic
сообщение Feb 17 2010, 15:59
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 3-10-05
Из: Москва-Троицк
Пользователь №: 9 174



Ну значит я буду еще один в этой бесконечной последовательности ) Спасибо, заработало.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 03:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016