|
uint24_t |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jan 26 2010, 10:16
|

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

|
Цитата(Злодей @ Jan 26 2010, 11:19)  Бутлодер для mega128 малость не влезает в 2k флэша, а нужно впихнуть. 1) Есть множество ключей компиляции, игры с которыми позволяют уменьшить код. 2) Попробуйте самый свежий WinAVR 20100110 - в нем сильно оптимизирована работа с eeprom. 3) Также очень помогает встраивание функций, вызываемых один раз. 4) Можно оптимизировать сам исходник. AVR231 у меня влез в 2К с запасом. Вот мои ключи: Код CFLAGS += -ffunction-sections CFLAGS += -fdata-sections
# code optimisation CFLAGS += -fno-ivopts #CFLAGS += -mcall-prologues #CFLAGS += -fno-tree-scev-cprop #CFLAGS += -fno-split-wide-types #CFLAGS += -fno-inline-small-functions
CFLAGS += --param inline-call-cost=0 <- это число подобрать. #CFLAGS += -fno-reorder-blocks #CFLAGS += -fno-reorder-blocks-and-partition #CFLAGS += -fno-reorder-functions #CFLAGS += -fno-toplevel-reorder CFLAGS += -fno-move-loop-invariants #CFLAGS += -fno-unroll-loops #CFLAGS += -fno-unroll-all-loops #CFLAGS += --param max-unroll-times=0
LDFLAGS += -Wl,--gc-sections LDFLAGS += -Wl,--relax попробуйте раскомментировать/закомментировать некоторые из них.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 27 2010, 10:37
|

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

|
Цитата(Сергей Борщ @ Jan 26 2010, 13:16)  Вот мои ключи... Есть такой ключ, что всем ключам ключ: Код CFLAGS += --combine CFLAGS += -fwhole-program
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jan 27 2010, 10:52
|

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

|
Цитата(demiurg_spb @ Jan 27 2010, 12:37)  Есть такой ключ, что всем ключам ключ: Код CFLAGS += --combine CFLAGS += -fwhole-program Вчера потратил 2 часа, пытаясь собрать с его помощью первый попавшийся проект на С++. Так и не удалось. Ругался undefined variable на все глобальные объекты и переменные. Без этого ключа все собирается и работает.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 27 2010, 12:00
|

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

|
Using the GNU Compiler Collection. For gcc version 4.3.4 Цитата -fwhole-program Assume that the current compilation unit represents whole program being compiled. All public functions and variables with the exception of main and those merged by attribute externally_visible become static functions and in a affect gets more aggressively optimized by interprocedural optimizers. While this option is equivalent to proper use of static keyword for programs consisting of single file, in combination with option ‘--combine’ this flag can be used to compile most of smaller scale C programs since the functions and variables become local for the whole combined compilation unit, not for the single source file itself.This option is not supported for Fortran programs.
-combine If you are compiling multiple source files, this option tells the driver to pass all the source files to the compiler at once (for those languages for which the compiler can handle this). This will allow intermodule analysis (IMA) to be performed by the compiler. Currently the only language for which this is supported is C. If you pass source files for multiple languages to the driver, using this option, the driver will invoke the compiler(s) that support IMA once each, passing each compiler all the source files appropriate for it. For those languages that do not support IMA this option will be ignored, and the compiler will be invoked once for each source file in that language. If you use this option in conjunction with -save-temps, the compiler will generate multiple pre-processed files (one for each source file), but only one (combined) .o or .s file.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jan 28 2010, 09:51
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142

|
Цитата(Сергей Борщ @ Jan 27 2010, 13:52)  Вчера потратил 2 часа, пытаясь собрать с его помощью первый попавшийся проект на С++. Так и не удалось. Ругался undefined variable на все глобальные объекты и переменные. Без этого ключа все собирается и работает. Ключ ломает стереотипы. Отпадают цели вроде "$(OBJDIR)/%.o : %.c", т.к. по одному они компилиться не могут больше. # Compile: create object files from C source files. # $(OBJDIR)/%.o : %.c # @echo # @echo $(MSG_COMPILING) $< # $(CC) -c $(ALL_CFLAGS) $< -o $@ compile: $(CC) $(CFLAGS) $(CDEFS) $(LDFLAGS) $(SRC) -o $(TARGET).elf ...Или дело даже не в этом, а в том, что у Вас C++?
Сообщение отредактировал Злодей - Jan 28 2010, 09:53
|
|
|
|
|
Jan 28 2010, 11:16
|

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

|
Цитата(Злодей @ Jan 28 2010, 11:51)  Ключ ломает стереотипы. Не, ну доку-то я первым делом прочитал. Конечно все файлы компилились скопом. Цитата(Злодей @ Jan 28 2010, 11:51)  ...Или дело даже не в этом, а в том, что у Вас C++? Да. Провел элементарный эксперимент: Код main.cpp: #include <avr/io.h>
volatile int a; extern void test();
int main() { for(;;) { PORTB = a; test(); } }
test.cpp: #include <avr/io.h>
extern volatile int a;
void test() { PORTC = a; } avr-gcc -mmcu=atmega8 --combine -fwhole-program main.cpp test.cpp -o main.elf
D:\Temp/ccEyCFtV.o: In function `main': main.cpp:(.text+0x16): undefined reference to `test()' Переименовываю файлы в *.c - все компилится. Можно предположить, что ему сносит крышу от плюсового name mangling.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 28 2010, 23:44
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(ReAl @ Jan 28 2010, 17:50)  Стереотипы он ломает в другом месте. У тех, у которых они были - про то, что "если вызывается функция из другого файла, то и компилятор не переставит операции в коде, и volatile можно не ставить". А разьве это(сваливание всего в кучу) просто не противоречит стандарту ? Кажись именно за это ругали CodeVision... По-моему тот кто "вызывается функция из другого файла... , и volatile можно не ставить" все же точно знает что он делает и почему... Я не агитирую за то что так нужно делать всегда, это несомненно плацдарм для "скрытых" ошибок, но иногда этим сам пользуюсь когда нужно чего-нить дооптимизировать...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|