|
организация проэкта gcc, проект с использованием gcc |
|
|
|
Sep 29 2011, 18:36
|
Группа: Новичок
Сообщений: 7
Регистрация: 14-01-09
Пользователь №: 43 376

|
При переносе проекта из IAR в gcc возник вопрос. Помогите разобраться. Припустим у меня есть "драйвер", который просто состоит из "с" и "h" файлов, не под ось, а просто, скажем к индикатору. В "h" файле описаны порты ну и декларация функций. В "с" файл также включен файл с описанием задержек, которые зависят от проца и от частоты тактирования. В драйвере описаны как функции, которые используються проэктом, так и функции, которые этим конкретным проектом не используються. Так как gcc, в отличие от иара, на этапе компиляции закидывает в обьектные файлы все функции без исключений, то это влияет на размер выходного бинарника. Ну в принципе, хули там - делай драйер библиотекой, разбивай сишный файл на множество сишных файликов, в каждой по своей фунции и дело с концом. Но тут, вопервых, много гемора, во вторых, как вести отдельно поддержку драйевра, ведь он зависит от конкретных задержек, описанных в файле, который тоже где-то должен поддерживаться (может измениться, потом наведи лад со всеми этими библами). Получаеться хрень какаето - что бы убрать из кода не используемые функции, нужно проделать кучу лишних движений, плюс к этому это все нужно поддерживать, да если еще и куча проэктов на этом висит, то это пипец.... Как это лучше организовать с ипосльзованием gcc?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Sep 30 2011, 05:02
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
А чтоб вообще заполировать: CFLAGS += --combine CFLAGS += -fwhole-program нынче правда это всё в LTO перекочевало, что собственно очень хорошо ибо применимо и к проектам на плюсах. ЗЫ: для обсуждения gcc есть отдельная ветка на форуме: http://electronix.ru/forum/index.php?showforum=162
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 2 2011, 21:57
|
Группа: Новичок
Сообщений: 7
Регистрация: 14-01-09
Пользователь №: 43 376

|
после добавления CFLAGS += -ffunction-sections LDFLAGS += -Wl,-gc-sections
компиляция каждого файла: avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mno-interrupts -DF_CPU=3686400UL -mmcu=atmega128 -ffunction-sections -c -MD тут все Ок
компоновка: avr-gcc -Wl,-gc-sections -L"/home/ivan/DATA1/prog/embedded/PATI" -mmcu=atmega128 -o patima.hex alm.o bc1602e.o cint.o ctmp.o def.o delay.o dmem.o ds1631.o ds18b20.o dsp.o err.o fm24c64.o iic.o ini.o kbd.o light.o mctr.o mem.o mem_fm24c64.o mexe.o mopr.o msg.o note.o patima.o pcf8583.o ptimer.o rmd.o rtc.o sgn.o sta.o stm.o stp.o stw.o tc0.o tc1.o tc3.o tmp.o tmr.o trg.o usr.o wdt.o wire.o wrt.o zmr.o -lp /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr51/libc.a(fp_powsodd.o):../../../libm/fplib/fp_powsodd.S:59: relocation truncated to fit: R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in /usr/lib/gcc/avr/4.3.5/avr51/libgcc.a(_mul_sf.o) /usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr51/libc.a(fp_powsodd.o):../../../libm/fplib/fp_powsodd.S:69: relocation truncated to fit: R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in /usr/lib/gcc/avr/4.3.5/avr51/libgcc.a(_mul_sf.o) make: *** [patima.hex] Ошибка 1
а тут хз. Чего не то? Без указанных опций все компилируеться...
|
|
|
|
|
Oct 3 2011, 09:48
|
Группа: Новичок
Сообщений: 7
Регистрация: 14-01-09
Пользователь №: 43 376

|
Добавление либы LDFLAGS += -lm на удивление помогло, все собралось и после добавления CFLAGS += -ffunction-sections LDFLAGS += -Wl,-gc-sections, но нужного эффекта не дало, объем флеша так и остался прежним, и код не нужных функций так и содержится в нем. Добавление CFLAGS += -fwhole-program привело к ошибкам в main(), при которых он не видит функций включенных через h. patima.c:(.text.main+0x0): undefined reference to `ini' patima.c:(.text.main+0x4): undefined reference to `rtc' patima.c:(.text.main+0x8): undefined reference to `tmp' patima.c:(.text.main+0xc): undefined reference to `stw' patima.c:(.text.main+0x10): undefined reference to `usr' patima.c:(.text.main+0x14): undefined reference to `alm' patima.c:(.text.main+0x18): undefined reference to `tmr' patima.c:(.text.main+0x1c): undefined reference to `rmd' patima.c:(.text.main+0x20): undefined reference to `trg' patima.c:(.text.main+0x24): undefined reference to `sgn' patima.c:(.text.main+0x28): undefined reference to `kbd' patima.c:(.text.main+0x2c): undefined reference to `ptimer' make: *** [patima.hex] Ошибка 1
|
|
|
|
|
Oct 3 2011, 12:03
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(factorial @ Oct 3 2011, 13:48)  Добавление либы LDFLAGS += -lm на удивление помогло, все собралось и после добавления CFLAGS += -ffunction-sections LDFLAGS += -Wl,-gc-sections, но нужного эффекта не дало, объем флеша так и остался прежним, и код не нужных функций так и содержится в нем. странно. Цитата Добавление CFLAGS += -fwhole-program привело к ошибкам... естественно. нужно не просто добавить этот флаг а и передать все исходники компилятору разом, а не кормить по одному...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 3 2011, 17:47
|
Группа: Новичок
Сообщений: 7
Регистрация: 14-01-09
Пользователь №: 43 376

|
Ррр, Работает как с --gc-sections, так и с -gc-sections. Настройки в eclipse не правильно сделал. Со своим makefile пошло, ну потом и в eclipse конечно исправил. Теперь лишнего кода нет!!! Был 62382 стал 60140, ну как ни как, 2242 байта тоже хорошо. Правда уровень сжатия оставляет желать лучшего. На IAR было 46030 кБ, и то в gcc я еще выкинул код с ненужным калькулятором. Можно сказать, что 20 кБайт разницы!!! А это серьезный уже кусок. Можно ли еще как его ужать, а то разница относительно большая?? Все, что для оптимизации было применено это -mno-interrupts и -Os.
Сообщение отредактировал factorial - Oct 3 2011, 17:49
|
|
|
|
|
Oct 3 2011, 19:04
|
Группа: Новичок
Сообщений: 7
Регистрация: 14-01-09
Пользователь №: 43 376

|
А ну и -fpack-struct -fshort-enums...
|
|
|
|
|
Oct 3 2011, 21:30
|
Группа: Новичок
Сообщений: 7
Регистрация: 14-01-09
Пользователь №: 43 376

|
demiurg_spb Цитата А чтоб вообще заполировать: CFLAGS += --combine CFLAGS += -fwhole-program
естественно. нужно не просто добавить этот флаг а и передать все исходники компилятору разом, а не кормить по одному... Бомба это реально, что нужно!!! Вы имели ввиду, что оптимизация будет идти не над каждым файлом отдельно, а с учетом всех файлов, я правильно понял??? Если да, то не зря после компиляции произошло сокращение: 60140 - 57596 = еще на 2544 байта меньше! Хоть что-то...., но все равно, как-то маловато.
|
|
|
|
|
Oct 3 2011, 22:38
|
Группа: Новичок
Сообщений: 7
Регистрация: 14-01-09
Пользователь №: 43 376

|
Добавление -mcall-prologues еще -2048 байт....
|
|
|
|
|
Oct 4 2011, 04:44
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(factorial @ Oct 4 2011, 01:30)  Бомба это реально, что нужно!!! Вы имели ввиду, что оптимизация будет идти не над каждым файлом отдельно, а с учетом всех файлов, я правильно понял??? Правильно. Читайте доки... http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htmlCFLAGS += -Wl,--relax CFLAGS += --param inline-call-cost=2
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 4 2011, 06:18
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (factorial @ Oct 3 2011, 22:04)  А ну и -fpack-struct Уберите. Вы заставляете к каждому полю любой структуры обращаться побайтово. Если в каких-то местах программ и требуется упаковка структур (например, при организации протокола обмена), то правильнее там объявить нужную структуру с атрибутом packed: CODE typedef struct my_type { ..... } __attribute__((packed)); QUOTE (factorial @ Oct 4 2011, 00:30)  Бомба это реально, что нужно!!! Вы имели ввиду, что оптимизация будет идти не над каждым файлом отдельно, а с учетом всех файлов, я правильно понял??? Да но есть некоторые но: 1) это работает только с С-программами (С++ забудьте) 2)в более свежих версиях этого механизма уже нет - там появился механизм LTO (link-time optimization).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|