- Вложения
-
- динамическая индикация.rar
- (26.95 КБ) 123 скачивания
Проблема с оптимизатором GCC.
Знающие, объясните, почему при компиляции начисто выкидывается display=i из 109 строки файла "termo.c". Написал такой "вывод" содержимого переменной "display" на трехразрядный восьмисегментник, хотел полюбоватся, как он в главном while циферки перебирает, а он только показывает то, что было при инициализации переменной, а строку присваивания с display просто игнорирует. Схему в протеусе и проект от АВР Студии 4 прилагаю.
Последний раз редактировалось Shurf Пт фев 21, 2014 19:37:23, всего редактировалось 1 раз.
- Реклама
Недоприложили вы чего-то 
only pure true norwegian blackx 
Извиняюсь, пытался тему перенести) Ан не удалить никак)-
Что-то я в растерянности. Раньше с подобными программами (раза 2) проблем не было, а сейчас - как об стену горох, никаких операций с глобальной переменной display программа не производит, потому . Чувствую, ошибка глупая и очень простая, но где она?
- Реклама
Итак, на одном хорошем форуме молодых электронщиков ответили: "Потому что переменная display больше нигде не используется.. Ты ей значение присваиваешь и всё.. Вот оптимизатор её и выкидывает..
Надо писать volatile static uint8_t display = 254; в начале." Вот и все)
Надо писать volatile static uint8_t display = 254; в начале." Вот и все)
Кстати, у меня одна программа прекрасно компилировалась и запускалась в WinAVR 2006 года. А поставил последний за 2010 год и обновил GCC - не пошла, пока на двух переменных не выставил тэг volatile.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Говорю сразу, что код не смотрел.
Но с большой вероятностью, что переменная не объявлена volatile, а где-то в прерывании используется.
Но с большой вероятностью, что переменная не объявлена volatile, а где-то в прерывании используется.
А вот теперь посмотрел код. Все в точности, как я сказал. У тебя в прерывании от таймера используется твоя переменная. Поскольку в прерывании она не изменяется, а только грузится ее значение, то компилятор берет по умолчанию то, которым ты ее проинициализировал. Т.е. 254. А в мейне она меняется. Объяви переменную с пометкой volatile - и будет тебе счастье


