Страница 1 из 1

ATmega48 слишком большой размер программы

Добавлено: Вс сен 19, 2010 18:20:51
e226329
Здравствуйте.
Помогите, пожалуйста, понять почему у меня простейшая прошивка занимает почти всю память. Там вроде ничего особенного - в дополнение к обычному миганию светодиодом, только циклическая выдача алфавита в UART, а флеша занимает 3,9кб.

Для организации задержек использую функцию _delay_ms(). Если ее закомментировать, то размер становиться нормальный (байт ~300 примерно). Тут бы и успокоится мне, и подумать, что это библиотека такая большая, но ведь раньше при простом мигании светодиодом я ее использовал и размер был небольшим.

Подскажите, что я делаю не так ?

Re: ATmega48 слишком большой размер программы

Добавлено: Вс сен 19, 2010 19:55:28
Kavka
Найдите два отличия с вашим файлом (не считая испорченных комментариев).
И взгляните на определение функции _delay_ms в соответствующем h-файле.
Надеюсь этих подсказок будет достаточно чтобы понять на что уходит около 3500 байт. :kill: :)

Re: ATmega48 слишком большой размер программы

Добавлено: Вс сен 19, 2010 20:09:14
Шурики
Или дизассемблировать два варианта скомпилированного файла (в 300 байт и почти 4Кб) и увидеть, я так думаю, кучу операций типа NOP.

Re: ATmega48 слишком большой размер программы

Добавлено: Вс сен 19, 2010 20:23:20
Kavka
Шурики писал(а):Или дизассемблировать два варианта скомпилированного файла (в 300 байт и почти 4Кб) и увидеть, я так думаю, кучу операций типа NOP.
Ну-ну. Поищите там кучу NOP-ов на досуге. :kill:
Дальше - без комментариев.

Re: ATmega48 слишком большой размер программы

Добавлено: Вс сен 19, 2010 20:31:18
e226329
Kavka писал(а):... взгляните на определение функции _delay_ms в соответствующем h-файле.
Надеюсь этих подсказок будет достаточно чтобы понять на что уходит около 3500 байт.

Огромное спасибо.

Нашел файл <util/delay.h> и там в одном из комментариев дано объяснение почему так происходит:
the delay time must be an expression that is a known constant at compile-time. If these requirements are not met, (...) applications that otherwise do not use floating-point calculations will experience severe code bloat by the floating-point library routines linked into the application.
Т.е. параметр функции _delay_ms должен быть выражением, которое известно на этапе компиляции. Тогда его подсчитает компилятор. А если это будет переменная, как в моем случае, компилятор его посчитать не сможет и придется это значение вычислять во время выполнения программы. А поскольку там используются вычисления с плавающей точкой, то будет прилинкована соответствующая здоровущая библиотека.