реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как можно уменьшить скомпилированный исходник?
The Fresh
сообщение Apr 15 2007, 07:29
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071



Есть исходник, после компиляции забивает память практически полностью 2K AT90S2313. Необходимо дописать к нему приблизительно 1/5 его кода. Я вижу 2 варианта, либо переносить некоторые функции на чистый ASM, либо использовать какой-нибудь продвинутый компилятор. Сейчас использую WinAVR 20050214, использовал 20070122, но код получался больше. Изменял настройки
make файла, но сколь ощутимого результата не увидел!

# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = 2
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 15 2007, 08:07
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



-Os - оптимизирует сильнее всего.
Можно попробовать перенести на IAR.
Либо взять другой чип (m48 например).
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Apr 15 2007, 09:17
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
Сейчас использую WinAVR 20050214, использовал 20070122, но код получался больше.

Попробуйте 2006, ИМХО на сегодня самый качественный.

Цитата
либо переносить некоторые функции на чистый ASM, либо использовать какой-нибудь продвинутый компилятор.


Не знаю, получится ли выжать 20% места, но попробуйте следующее:
Скомпилируйте в асм (или гляньте листинг) и попробуйте посмотреть, где можно ужаться. Обычно это два места - вызовы функций и start-up (gcc часто вставляет туда много лишнего). В принципе по этому же листингу можно пробежатся ручками и подсунуть асму.

Возиться с ИАРом не советую - гемора с переносом кода может быт много, а 20% разницы для хорошо написанного кода врядли даст.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 15 2007, 10:09
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(The Fresh @ Apr 15 2007, 07:29) *
Есть исходник, после компиляции забивает память практически полностью 2K AT90S2313. Необходимо дописать к нему приблизительно 1/5 его кода. Я вижу 2 варианта, либо переносить некоторые функции на чистый ASM, либо использовать какой-нибудь продвинутый компилятор. Сейчас использую WinAVR 20050214, использовал 20070122, но код получался больше. Изменял настройки
make файла, но сколь ощутимого результата не увидел!


1. Попробуйте добавить компилятору ключ "-mcall-prologues".
2. Вы пользуетесь часлами с плавающей точкой (float) в программе?
3. Подключена ли у вас математическая библиотека? Ключ "-m" компоновщика.
4. Подключены ли у вас расширеные версии функций "printf" и "scanf" (с поддержкой часел с плавающей точкой). Ключи компановщика "-Wl,-u,vfscanf -lscanf_flt" и "-Wl,-u,vfprintf -lprintf_flt -lm"

Покажите свой Makefile.

Анатолий.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 15 2007, 11:56
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Еще Вам может помочь уменьшить размер кода ключ компилятора "-mtiny-stack"

Анатолий.
Go to the top of the page
 
+Quote Post
Amper25
сообщение Apr 15 2007, 12:17
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



Не знаю как в вашем компиллере, но когда-то давно я пользовал SDCC-Compiller
для 8051. У него есть также и версия для AVR.

Так там при написании функций есть опция __naked.
Она отключает все PUSH и POP-ы во время старта и окончания.
И уже от того, какие переменные затрагиваются внутри ф-ий, можно самому выбирать что сохранить,
а что нет.

А вообще для таких слабеньких девайсов как 2313 лучше писать на asm-е. IMHO.
Go to the top of the page
 
+Quote Post
The Fresh
сообщение Apr 15 2007, 12:23
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071



Вот make file(прикрепил) и ключи, с плавающей запятой не работаю,
set -e; avr-gcc -MM -mmcu=at90s2313 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst main.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > main.d; \
[ -s main.d ] || rm -f main.d

Compiling: main.c
avr-gcc -c -mmcu=at90s2313 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst main.c -o main.o

Linking: main.elf
avr-gcc -mmcu=at90s2313 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o main.o --output main.elf -Wl,-Map=main.map,--cref -lm

Creating load file for Flash: main.hex
avr-objcopy -O ihex -R .eeprom main.elf main.hex

Creating load file for EEPROM: main.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex main.elf main.eep

Creating Extended Listing: main.lss
avr-objdump -h -S main.elf > main.lss

Creating Symbol Table: main.sym
avr-nm -n main.elf > main.sym


Кстати вот pdf есть по этому поводу, но куда что пока не очень ориентируюсь.
Eighteen Hints to Reduce Code Size
1. Compile with full size optimization.
2. Use local variables whenever possible.
3. Use the smallest applicable data type. Use unsigned if applicable.
4. If a non-local variable is only referenced within one function, it should be
declared static.
5. Collect non-local data in structures whenever natural. This increases the possibility
of indirect addressing without pointer reload.
6. Use pointers with offset or declare structures to access memory mapped I/O.
7. Use for(;;) { } for eternal loops.
8. Use do { } while(expression) if applicable.
9. Use descending loop counters and pre-decrement if applicable.
10. Access I/O memory directly (i.e., do not use pointers).
11. Declare main as C_task if not called from anywhere in the program.
12. Use macros instead of functions for tasks that generates less than 2-3 lines
assembly code.
13. Reduce the size of the Interrupt Vector segment (INTVEC) to what is actually
needed by the application. Alternatively, concatenate all the CODE segments
into one declaration and it will be done automatically.
14. Code reuse is intra-modular. Collect several functions in one module (i.e., in one
file) to increase code reuse factor.
15. In some cases, full speed optimization results in lower code size than full size
optimization. Compile on a module by module basis to investigate what gives the
best result.
16. Optimize C_startup to not initialize unused segments (i.e., IDATA0 or IDATA1 if all
variables are tiny or small).
17. If possible, avoid calling functions from inside the interrupt routine.
18. Use the smallest possible memory model.
Five Hints to Reduce
RAM Requirements
1. All constants and literals should be placed in Flash by using the Flash keyword.
2. Avoid using global variables if the variables are local in nature. This also saves
code space. Local variables are allocated from the stack dynamically and are
removed when the function goes out of scope.
3. If using large functions with variables with a limited lifetime within the function,
the use of subscopes can be beneficial.
4. Get good estimates of the sizes of the software Stack and return Stack (Linker
File).
5. Do not waste space for the IDATA0 and UDATA0 segments unless you are using
tiny variables (Linker File).
Прикрепленные файлы
Прикрепленный файл  makefile.txt ( 10.02 килобайт ) Кол-во скачиваний: 51
 
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 15 2007, 12:49
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Я не увидел никакоко криминала в макефайле. Поэкспериментируйте с ключиками оптимизаии про которые я вам писал. Если хотите шлите .с файлы, может чего посоветую.

Советы из вашего сообщения на 80% к GCC отношения не имеют.

Анатолий.
Go to the top of the page
 
+Quote Post
The Fresh
сообщение Apr 15 2007, 12:53
Сообщение #9


Частый гость
**

Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071



Мой взор все больше ориентируется на МК с большим объемом памяти, например Atmega8. Кстати куда этот ключик ставить, я плохо пока разбираюсь с WINAR.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 15 2007, 13:17
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(The Fresh @ Apr 15 2007, 12:53) *
Мой взор все больше ориентируется на МК с большим объемом памяти, например Atmega8. Кстати куда этот ключик ставить, я плохо пока разбираюсь с WINAR.


Makefile:
CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-mcall-prologues -mtiny-stack\
-Wall -Wstrict-prototypes \
-Wa,-adhlns=$(<:.c=.lst) \
$(patsubst %,-I%,$(EXTRAINCDIRS))

Анатолий.
Go to the top of the page
 
+Quote Post
The Fresh
сообщение Apr 15 2007, 13:38
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071



Немного отвоевал, есть константы объемные наверное их стоило бы перенести в EEprom. Кстати uniprof при помощи которого шью микруху, не выдет никаких сообщений по поводу того, что hex файл больше объема памяти и конец программы вообще не попадает. Я немного голову поломал, так как, дописывая пустяковую команду, вся программа глючила и не работала, по началу думал глюк в коде!!!

Сообщение отредактировал The Fresh - Apr 15 2007, 13:45
Go to the top of the page
 
+Quote Post
Snaky
сообщение Apr 16 2007, 06:25
Сообщение #12


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



Цитата(Amper25 @ Apr 15 2007, 16:17) *
Не знаю как в вашем компиллере, но когда-то давно я пользовал SDCC-Compiller для 8051. У него есть также и версия для AVR.
Так там при написании функций есть опция __naked. Она отключает все PUSH и POP-ы во время старта и окончания. И уже от того, какие переменные затрагиваются внутри ф-ий, можно самому выбирать что сохранить, а что нет.

В WinAVR тоже можно объявлять naked функции:
void my_function(void) __attribute__ ((naked));


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
prm
сообщение Apr 16 2007, 10:13
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 4-04-07
Пользователь №: 26 760



К сведению, был у меня проект на IAR для AT90S2313, память забита байт в байт. Встала задача немного изменить прошивку. Долго бился над минимизацией, но существенных успехов не достиг. Затем перенес проект на CodeVision, перекомпилировал и смог съэкономить 5% флеш памяти.
Go to the top of the page
 
+Quote Post
Snaky
сообщение Apr 16 2007, 11:37
Сообщение #14


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



Цитата(prm @ Apr 16 2007, 14:13) *
Затем перенес проект на CodeVision, перекомпилировал и смог съэкономить 5% флеш памяти.

Хммм, а я все время считал, что в IAR оптимизатор лучше, чем в CodeVision.


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Apr 18 2007, 07:01
Сообщение #15


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(Snaky @ Apr 16 2007, 17:37) *
Хммм, а я все время считал, что в IAR оптимизатор лучше, чем в CodeVision.

Возможно это был уникальный случай. Но мне кажется, что доверять CodeVision не очень-то и стотит, ибо на этом форуме проскакивала информация, что компилятор не четко следует стандарту языка Си. И еще не известно, как будет работать программа, "соптимизированная" CV.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016