Форум РадиоКот https://radiokot.ru/forum/ |
|
Большой размер прошивки после компиляции https://radiokot.ru/forum/viewtopic.php?f=57&t=85156 |
Страница 1 из 2 |
Автор: | dem66 [ Чт фев 14, 2013 19:21:52 ] |
Заголовок сообщения: | Большой размер прошивки после компиляции |
Доброго времени суток. Пытаюсь в амеге 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; //printf("%f", tik); //puts("\r\n"); int temp = (int)(256.0-(((1.0/freq)/tik)/2.0)); if(temp>0 && temp<=256){ //printf("%d", temp); //puts("ok\r\n"); timer0 = temp; } return 1; } int main(void){ timer0 = 256-161; timer1 = 999; presc = 256; SetFreq('1'); while(1) { //_delay_ms(500); } } Откомпилировав получаю hex файл размером 9,8Kb ![]() ![]() ![]() ![]() |
Автор: | Kavka [ Чт фев 14, 2013 19:46:54 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Ну, а вы как себе представляете как реализуются операции с плавающей точкой на 8-битном процессоре имеющим команды только для сложения, вычитания и умножения? Какая версия gcc? Какие опции компилятора? У меня получилось меньше. Program: 3592 bytes (43.8% Full) Data: 270 bytes (26.4% Full) Думаю, что можно ещё меньше получить... ![]() |
Автор: | ibiza11 [ Чт фев 14, 2013 19:56:04 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
dem66 писал(а): Откомпилировав получаю hex файл размером 9,8Kb .hex всегда больше прошивки.
![]() ![]() ![]() ![]() |
Автор: | dem66 [ Чт фев 14, 2013 20:05:10 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
ibiza11, не ну это понятно, но не на столько же. avr-gcc -v Using built-in specs. Target: avr Configured with: ../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-language=c : (reconfigured) ../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-language=c --disable-libssp Thread model: single gcc version 4.3.2 (GCC) Опции компиляции Код: avr-gcc -mmcu=atmega8 -g -Os -Werror -lm -mcall-prologues -o firmware.o freq.c Пробовал также компилировать с опцией -Wall, бестолку. Kavka, возможно просто ваш компилятор посчитал некоторые строки ненужными и тупо вырезал |
Автор: | shads [ Чт фев 14, 2013 20:09:41 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Тут тоже как то обсуждали размр проги с плавающей точкой: viewtopic.php?f=20&t=6996&p=1543016&hilit=%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%2A#p1543016 Оказалось, что при наличии плавающей точки, 4-я версия делает намного больший код чем 6-я версия..... |
Автор: | Kavka [ Чт фев 14, 2013 20:25:06 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
ibiza11, да уж, про HEX я "промахнулся" ![]() Но размер можно ещё уменьшить. У меня получилось так: Program: 1372 bytes (16.7% Full) Data: 6 bytes (0.6% Full) HEX: 3875 gcc version 4.3.3 (WinAVR 20100110) dem66, shads Не помню где читал: "Народ всё больше и больше отключает свои мозги и полагается на компьютеры с работающими там программами, забывая о том, что программы пишут такие же отключающие мозги... Процесс итерационный..." Печалька, в общем. ![]() Документацию не читаем, а возмущаемся http://www.nongnu.org/avr-libc/user-man ... l#faq_math |
Автор: | HHIMERA [ Чт фев 14, 2013 20:30:21 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Kavka писал(а): Но размер можно ещё уменьшить. У меня получилось так: Program: 1372 bytes (16.7% Full) Data: 6 bytes (0.6% Full) HEX: 3875 gcc version 4.3.3 (WinAVR 20100110) Подверждаю эти цифры... == Ничему AVReal некоторых так и не научил... видать было сразу... "Не в коня корм!"... ![]() |
Автор: | Kavka [ Чт фев 14, 2013 20:35:24 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Мне вот интересно. ![]() |
Автор: | shads [ Чт фев 14, 2013 20:39:51 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
HHIMERA писал(а): Ничему AVReal некоторых так и не научил... видать было сразу... "Не в коня корм!"... ![]() Ты хвастать только можеш... гений..... Когда вопрос задали... че не ответил? народ за быдло считаеш..... ну и считай..... "всезнающий и всемогущий"..... |
Автор: | HHIMERA [ Чт фев 14, 2013 20:45:15 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
shads писал(а): че не ответил? А зачем??? AVReal'а ещё раз пересказывать??? И что толку... сколько можно??? Цитата: народ за быдло считаеш..... ну и считай..... "всезнающий и всемогущий"..... Народ - нет... Быдло - да... |
Автор: | ploop [ Чт фев 14, 2013 20:57:00 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Срач прекращаем. Отвечаем на вопрос аргументированно, с чувством, с толком, с расстановкой... |
Автор: | dem66 [ Чт фев 14, 2013 22:26:36 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Блин развели тут черт знает что. а по теме то откомпилировал это дело в Код: avr-gcc-4.6.2 -Wall -mmcu=atmega8 -g -Os -Werror -lm -mcall-prologues -o firmware.o freq.c И оно вместе 9,5 уже 10,2Кб ![]() |
Автор: | HHIMERA [ Чт фев 14, 2013 23:03:13 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
dem66 писал(а): а по теме то откомпилировал это дело Это не дело... так проги не пишут... Это просто ужас... а вы за размер HEX переживаете... |
Автор: | dem66 [ Чт фев 14, 2013 23:09:43 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
А как пишут а? |
Автор: | Ser60 [ Чт фев 14, 2013 23:55:48 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Замечания по коду: 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 [ Пт фев 15, 2013 05:38:46 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
dem66 писал(а): Код: avr-gcc-4.6.2 -Wall -mmcu=atmega8 -g -Os -Werror -lm -mcall-prologues -o firmware.o freq.c ![]() dem66 писал(а): Kavka, возможно просто ваш компилятор посчитал некоторые строки ненужными и тупо вырезал Неа. Компилятор нормально всё делает. Точно так как ему указали! Точно в соответствии алгоритму заложенному в программу. Только из-за незнания заложенного алгоритма мы, в том что указано, подразумеваем одно, а компилятор - другое. (Только не надо обвинять компьютер, что он тупой. ![]() Ser60, это уже другой аспект. Изначально надо с компиляцией разобраться. |
Автор: | urry [ Пт фев 15, 2013 09:36:38 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Что не видит ? Что флоат здесь и близко не нужен или что вместе с одним файлом линкуется второй ? |
Автор: | Kavka [ Пт фев 15, 2013 10:28:33 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Про уместность флоата - отдельная тема. Я выше уже говорил. А по поводу линковки... В том то и дело, что НЕ линкуется! Код прежний - из первого сообщения темы. Опции те, что 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 результат будет разным. И это только с объектными файлами. С библиотеками бывает ещё хуже. Код: # COMPILE
avr-gcc -c -mmcu=atmega8 -g -Os -Werror -mcall-prologues -o test_fp.o test_fp.c avr-gcc -c -mmcu=atmega8 -g -Os -Werror -mcall-prologues -o test_fp1.o test_fp1.c avr-gcc -c -mmcu=atmega8 -g -Os -Werror -mcall-prologues -o test_fp2.o test_fp2.c # 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 |
Автор: | urry [ Пт фев 15, 2013 11:36:54 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
да ну, раздули ерунду на 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 |
Автор: | Kavka [ Пт фев 15, 2013 12:08:33 ] |
Заголовок сообщения: | Re: Большой размер прошивки после компиляции |
Согласен, если бы автор темы правил makefile, или из студии настраивал то и вопроса не было бы. А если нету makefile-а? Здравствуте грабли!? В общем есть такая особенность. Кому интересно - возьмёт на заметку. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |