Доброго времени суток. Пытаюсь в амеге 8 работать с числами с плавающей точкой, в коде проводятся некоторые вычисления и полученый результат дальше используется. Получается так что после того как откомпилирую исходник прошивка получается нереально большой, пишу на Си, компилирую в avr-gcc.
Вот пример кода
Код:
#define F_CPU 10000000UL
#include <stdio.h> #include <avr/io.h>
int timer0; int timer1; int presc;
int SetFreq(char set){ //tik = 0.0000257;
float tik = (((1.0/((10000000.0/presc)/256.0))/255.0)*10000000.0)/10000000.0;
int freq = (int)(1.0/(256.0-timer0)*tik)/2.0; freq+10;
Ну, а вы как себе представляете как реализуются операции с плавающей точкой на 8-битном процессоре имеющим команды только для сложения, вычитания и умножения?
Какая версия gcc? Какие опции компилятора?
У меня получилось меньше. Program: 3592 bytes (43.8% Full) Data: 270 bytes (26.4% Full)
Думаю, что можно ещё меньше получить...
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
Kavka
Заголовок сообщения: Re: Большой размер прошивки после компиляции
Но размер можно ещё уменьшить. У меня получилось так: Program: 1372 bytes (16.7% Full) Data: 6 bytes (0.6% Full) HEX: 3875
gcc version 4.3.3 (WinAVR 20100110)
dem66, shads Не помню где читал: "Народ всё больше и больше отключает свои мозги и полагается на компьютеры с работающими там программами, забывая о том, что программы пишут такие же отключающие мозги... Процесс итерационный..." Печалька, в общем.
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Мне вот интересно. А "правильный" вопрос будет задан или нет?
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ничему AVReal некоторых так и не научил... видать было сразу... "Не в коня корм!"...
Ты хвастать только можеш... гений..... Когда вопрос задали... че не ответил? народ за быдло считаеш..... ну и считай..... "всезнающий и всемогущий".....
1. Зачем в формуле float tik = (((1.0/((10000000.0/presc)/256.0))/255.0)*10000000.0)/10000000.0; сначала умножать величину на 10000000.0 в конце формулы а потом делить на нее? Если уж вычислять по этой формуле, то следует ее сначала упростить до freq = precs * (256/(255 * 10^7)) и вычислить константу на калькуляторе, потом подставив в формулу. Получится только одно умножение с плавающей точкой.
2. Формулу для temp int temp = (int)(256.0-(((1.0/freq)/tik)/2.0)); можно переписать в виде temp = 256 - (tik/freq)/2
Из формулы для freq int freq = (int)(1.0/(256.0-timer0)*tik)/2.0; получаем tik/freq = 2(256 - timer0)
Подставляя это в выражение для temp получим temp = 256 - (tik/freq)/2 = 256 - 2(256 - timer0))/2 = timer0
Получается, что вычисления с плавающей точкой здесь не нужны вообще (?)
Kavka, возможно просто ваш компилятор посчитал некоторые строки ненужными и тупо вырезал
Неа. Компилятор нормально всё делает. Точно так как ему указали! Точно в соответствии алгоритму заложенному в программу. Только из-за незнания заложенного алгоритма мы, в том что указано, подразумеваем одно, а компилятор - другое. (Только не надо обвинять компьютер, что он тупой. )
Ser60, это уже другой аспект. Изначально надо с компиляцией разобраться.
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Про уместность флоата - отдельная тема. Я выше уже говорил. А по поводу линковки... В том то и дело, что НЕ линкуется! Код прежний - из первого сообщения темы. Опции те, что dem66 приводил.
Код:
> avr-gcc -mmcu=atmega8 -g -Os -Werror -lm -mcall-prologues -o fp_test.o test_fp.c > avr-size fp_test.o text data bss dec hex filename 3328 264 6 3598 e0e fp_test.o
> avr-gcc -mmcu=atmega8 -g -Os -Werror -mcall-prologues -o fp_test.o test_fp.c -lm > avr-size fp_test.o text data bss dec hex filename 1394 0 6 1400 578 fp_test.o
Как говориться - найдите отличия.
Если всё делать в 4й студии, то она правильно всё делает при подключении математической библиотеки. А 6-ую студию, видать, уже поумнее сделали, она судя по всему, автоматом подключает математическую библиотеку.
Вот ещё примерчик накидал. В зависимости от места в командной строке опции -lm результат будет разным. И это только с объектными файлами. С библиотеками бывает ещё хуже.
# LINK avr-gcc -mmcu=atmega8 -g -Os -Werror -mcall-prologues -lm -o test_fp.bin test_fp.o test_fp1.o test_fp2.o avr-size test_fp.bin text data bss dec hex filename 3600 264 6 3870 f1e test_fp.bin
avr-gcc -mmcu=atmega8 -g -Os -Werror -mcall-prologues -o test_fp.bin test_fp.o -lm test_fp1.o test_fp2.o avr-size test_fp.bin text data bss dec hex filename 3600 264 6 3870 f1e test_fp.bin
avr-gcc -mmcu=atmega8 -g -Os -Werror -mcall-prologues -o test_fp.bin test_fp.o -lm test_fp1.o -lm test_fp2.o avr-size test_fp.bin text data bss dec hex filename 1666 0 6 1672 688 test_fp.bin
avr-gcc -mmcu=atmega8 -g -Os -Werror -mcall-prologues -o test_fp.bin test_fp.o -lm test_fp1.o test_fp2.o -lm avr-size test_fp.bin text data bss dec hex filename 1666 0 6 1672 688 test_fp.bin
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
да ну, раздули ерунду на 100 постов. Редактировать нужно Makefile , а не командную строку, не царское это дело, в ней ковыряться. Тогда оно правильно все построит. А ручками воткнуть посредине, оно считает, наверное, что это одна из опций оптимизации и выбрасывает, не матерясь, за ненадобностью. -lm значит всего лишь, что линкером подключается математическая библиотека libm.a , а в какой версии - 4 или 6 - до лампочки, я так думаю. TARGET = tar F_CPU = 10000000 CSRC = main.c ASRC = MCU_TARGET = atmega8 OPTIMIZE = -Os -mcall-prologues DEFS = LIBS = -lm DEBUG = dwarf-2
Согласен, если бы автор темы правил makefile, или из студии настраивал то и вопроса не было бы.
А если нету makefile-а? Здравствуте грабли!? В общем есть такая особенность. Кому интересно - возьмёт на заметку.
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения