AtmelStudio6.1 компилирует код на 50% больше!

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Аватара пользователя
Сообщения: 286
Зарегистрирован: Ср ноя 28, 2012 05:16:37
Откуда: Новотроицк Оренбургской обл.

Сообщение aurifer »

Открываю проект, сделанный на Studio 5, в Studio 6 . Ничего не меняя, сразу нажимаю "Build (имя проекта)". А он выдаёт ошибку "переполнение памяти контроллера на 32%"! Попробовал изменить параметр оптимизации кода(Toolchain>AVR/GNU C Compiler>optimization>optimization level), максимум чего смог добиться - превышение памяти на 74 байта!
Изображение
Пробовал в настройках проекта Build>Build Artifact>Artifact Type изменить "Executable" на "Static Library", проект компилируется без проблем, но не генерируется HEX файл(изменяется/создаётся файл с расширением ".а" ). Не совсем понимаю до конца, для чего этот параметр.
Изображение
Как такое побороть? Ведь сама программа,скомпилированная ранее, трудится в контроллере без проблем. Можно попробовать Studio 5 установить, но такая проблема появлялась и у другого человека на 5-ой. Т.е. придётся искать подходящую версию.
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Смотря что у вас там в исходниках.
Может решиться опциями компилятора, может ещё какими мерами.
Если проект не большой и не жалко публично засветить - закиньте его сюда, посмотрим.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 286
Зарегистрирован: Ср ноя 28, 2012 05:16:37
Откуда: Новотроицк Оренбургской обл.

Сообщение aurifer »

Проект не мой. Вот исходники.
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Видать, у новых версий компиляторов изменились алгоритм принятия решения о включении кода вместо его вызова (inlining).

Добавьте
__attribute__ ((noinline))
ко всем определениям calculateColor и rndColor
вот так
__attribute__ ((noinline)) static uint8_t calculateColor(uint8_t from, uint8_t to, uint16_t tm);
__attribute__ ((noinline)) static uint8_t rndColor()

У меня получилось 974 вместо 1070 байт.

Да, и не забудьте выбрать в качестве конфигурации "Release" в настройках проекта.
И проверьте оптимизацию: -Os
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Аватара пользователя
Сообщения: 286
Зарегистрирован: Ср ноя 28, 2012 05:16:37
Откуда: Новотроицк Оренбургской обл.

Сообщение aurifer »

Спасибо, всё получилось. Сам ни когда бы не догадался...
Реклама
Ответить

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