Большой размер прошивки после компиляции

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

Доброго времени суток.
Пытаюсь в амеге 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 :shock: :shock: :shock: ну как так :(
Это не хвост, это антенна
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Ну, а вы как себе представляете как реализуются операции с плавающей точкой на 8-битном процессоре имеющим команды только для сложения, вычитания и умножения?

Какая версия gcc? Какие опции компилятора?

У меня получилось меньше.
Program: 3592 bytes (43.8% Full)
Data: 270 bytes (26.4% Full)

Думаю, что можно ещё меньше получить... :idea:
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

dem66 писал(а):Откомпилировав получаю hex файл размером 9,8Kb :shock: :shock: :shock: ну как так :(
.hex всегда больше прошивки.
Ставим плюсы: )
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

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, возможно просто ваш компилятор посчитал некоторые строки ненужными и тупо вырезал
Это не хвост, это антенна
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Тут тоже как то обсуждали размр проги с плавающей точкой: http://radiokot.ru/forum/viewtopic.php? ... A#p1543016

Оказалось, что при наличии плавающей точки, 4-я версия делает намного больший код чем 6-я версия.....
Последний раз редактировалось shads Чт фев 14, 2013 20:31:27, всего редактировалось 1 раз.
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

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
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Kavka писал(а): Но размер можно ещё уменьшить.
У меня получилось так:
Program: 1372 bytes (16.7% Full)
Data: 6 bytes (0.6% Full)
HEX: 3875

gcc version 4.3.3 (WinAVR 20100110)
Подверждаю эти цифры...
==

Ничему AVReal некоторых так и не научил... видать было сразу... "Не в коня корм!"... :)))
"Я не даю готовых решений, я заставляю думать!"(С)
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Мне вот интересно. :) А "правильный" вопрос будет задан или нет?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

HHIMERA писал(а):Ничему AVReal некоторых так и не научил... видать было сразу... "Не в коня корм!"... :)))
Ты хвастать только можеш... гений.....
Когда вопрос задали... че не ответил? народ за быдло считаеш..... ну и считай..... "всезнающий и всемогущий".....
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

shads писал(а):че не ответил?
А зачем???
AVReal'а ещё раз пересказывать??? И что толку... сколько можно???
народ за быдло считаеш..... ну и считай..... "всезнающий и всемогущий".....
Народ - нет...
Быдло - да...
"Я не даю готовых решений, я заставляю думать!"(С)
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Срач прекращаем. Отвечаем на вопрос аргументированно, с чувством, с толком, с расстановкой...
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

Блин развели тут черт знает что.

а по теме то откомпилировал это дело в

Код: Выделить всё

avr-gcc-4.6.2 -Wall -mmcu=atmega8 -g -Os -Werror -lm  -mcall-prologues -o firmware.o freq.c
И оно вместе 9,5 уже 10,2Кб :))
Это не хвост, это антенна
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

dem66 писал(а): а по теме то откомпилировал это дело
Это не дело... так проги не пишут...
Это просто ужас... а вы за размер HEX переживаете...
"Я не даю готовых решений, я заставляю думать!"(С)
Встал на лапы
Аватара пользователя
Сообщения: 141
Зарегистрирован: Ср окт 26, 2011 13:38:13

Сообщение dem66 »

А как пишут а?
Это не хвост, это антенна
Друг Кота
Аватара пользователя
Сообщения: 3785
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Замечания по коду:

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

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

Сообщение Kavka »

dem66 писал(а):

Код: Выделить всё

avr-gcc-4.6.2 -Wall -mmcu=atmega8 -g -Os -Werror -lm  -mcall-prologues -o firmware.o freq.c
Не ужель никто не видит? :shock:
dem66 писал(а):Kavka, возможно просто ваш компилятор посчитал некоторые строки ненужными и тупо вырезал
Неа. Компилятор нормально всё делает. Точно так как ему указали! Точно в соответствии алгоритму заложенному в программу.
Только из-за незнания заложенного алгоритма мы, в том что указано, подразумеваем одно, а компилятор - другое. (Только не надо обвинять компьютер, что он тупой. :)) )

Ser60, это уже другой аспект. Изначально надо с компиляцией разобраться.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

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

Сообщение Kavka »

Про уместность флоата - отдельная тема. Я выше уже говорил.
А по поводу линковки... В том то и дело, что НЕ линкуется!
Код прежний - из первого сообщения темы.
Опции те, что 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
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

да ну, раздули ерунду на 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
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Согласен, если бы автор темы правил makefile, или из студии настраивал то и вопроса не было бы.

А если нету makefile-а? Здравствуте грабли!?
В общем есть такая особенность. Кому интересно - возьмёт на заметку.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

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