Проблема с оптимизатором GCC.

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср май 12, 2010 10:24:41
Откуда: Чувашия, Новочебоксарск

Сообщение Shurf »

Знающие, объясните, почему при компиляции начисто выкидывается display=i из 109 строки файла "termo.c". Написал такой "вывод" содержимого переменной "display" на трехразрядный восьмисегментник, хотел полюбоватся, как он в главном while циферки перебирает, а он только показывает то, что было при инициализации переменной, а строку присваивания с display просто игнорирует. Схему в протеусе и проект от АВР Студии 4 прилагаю.
Вложения
динамическая индикация.rar
(26.95 КБ) 123 скачивания
Последний раз редактировалось Shurf Пт фев 21, 2014 19:37:23, всего редактировалось 1 раз.
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

Недоприложили вы чего-то :)
Изображение only pure true norwegian blackx Изображение
Реклама
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср май 12, 2010 10:24:41
Откуда: Чувашия, Новочебоксарск

Сообщение Shurf »

Извиняюсь, пытался тему перенести) Ан не удалить никак)-
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср май 12, 2010 10:24:41
Откуда: Чувашия, Новочебоксарск

Сообщение Shurf »

Что-то я в растерянности. Раньше с подобными программами (раза 2) проблем не было, а сейчас - как об стену горох, никаких операций с глобальной переменной display программа не производит, потому . Чувствую, ошибка глупая и очень простая, но где она?
Контактная информация:
Реклама
Встал на лапы
Сообщения: 83
Зарегистрирован: Ср май 12, 2010 10:24:41
Откуда: Чувашия, Новочебоксарск

Сообщение Shurf »

Итак, на одном хорошем форуме молодых электронщиков ответили: "Потому что переменная display больше нигде не используется.. Ты ей значение присваиваешь и всё.. Вот оптимизатор её и выкидывает..

Надо писать volatile static uint8_t display = 254; в начале." Вот и все)
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2186
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков

Сообщение watchmaker »

Кстати, у меня одна программа прекрасно компилировалась и запускалась в WinAVR 2006 года. А поставил последний за 2010 год и обновил GCC - не пошла, пока на двух переменных не выставил тэг volatile.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Говорю сразу, что код не смотрел.
Но с большой вероятностью, что переменная не объявлена volatile, а где-то в прерывании используется.
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

А вот теперь посмотрел код. Все в точности, как я сказал. У тебя в прерывании от таймера используется твоя переменная. Поскольку в прерывании она не изменяется, а только грузится ее значение, то компилятор берет по умолчанию то, которым ты ее проинициализировал. Т.е. 254. А в мейне она меняется. Объяви переменную с пометкой volatile - и будет тебе счастье
Ответить

Вернуться в «AVR»