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

 
 
> uint24_t
Злодей
сообщение Jan 26 2010, 09:19
Сообщение #1


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

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



Бутлодер для mega128 малость не влезает в 2k флэша, а нужно впихнуть. Первое что приходит в голову - бороться с flash_size_t, который у меня из-за RAMP_Z для atmega128+ определен как uint32_t...

Откуда взять uint24_t? Если сделать структуру из трёх байт, и написать функции арифметических действий над ней, будет профит?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
demiurg_spb
сообщение Jan 26 2010, 09:31
Сообщение #2


неотягощённый злом
******

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



Цитата(Злодей @ Jan 26 2010, 12:19) *
Если сделать структуру из трёх байт, и написать функции арифметических действий над ней, будет профит?
Если функции напишешь на asm, то, возможно, будет. Всё зависит от кол-ва данных типа uint32_t и активности операций над ними.
Правда исходники будут выглядеть не очень читабельно, но не писать же бут на C++ с перегрузкой операторов для типа uint24_t:)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 26 2010, 10:16
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 27 2010, 10:37
Сообщение #4


неотягощённый злом
******

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



Цитата(Сергей Борщ @ Jan 26 2010, 13:16) *
Вот мои ключи...
Есть такой ключ, что всем ключам ключ:
Код
CFLAGS += --combine
CFLAGS += -fwhole-program


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 27 2010, 10:52
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 27 2010, 12:00
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 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.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 27 2010, 12:30
Сообщение #7


Гуру
******

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



Цитата(demiurg_spb @ Jan 27 2010, 14:00) *
Currently the only language for which this is supported is C
Да читал я это... Подумал - если он не выругался на неправильный язык, то может просто документацию не подправили... Причем в листинге все корректно, переменные есть.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 27 2010, 12:36
Сообщение #8


неотягощённый злом
******

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



Цитата(Сергей Борщ @ Jan 27 2010, 15:30) *
Подумал - если он не выругался на неправильный язык, то может просто документацию не подправили...
Всё может быть...
У нас на pure-C проекте отлично работает (бутлоадер кстати).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Злодей
сообщение Jan 28 2010, 09:51
Сообщение #9


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

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 28 2010, 10:04
Сообщение #10


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Злодей @ Jan 28 2010, 12:51) *
Ключ ломает стереотипы. Отпадают цели вроде "$(OBJDIR)/%.o : %.c", т.к. по одному они компилиться не могут больше.
это точно... я все старался прикрутить эти ключики к автоматически генерируемому makefile в среде Eclipse - потерпел неудачу... там пофайловое компилирование. придется привыкать к hand-made makefiles smile.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 28 2010, 10:53
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ARV @ Jan 28 2010, 13:04) *
придется привыкать к hand-made makefiles smile.gif

Лучше не отвыкать. Ну, эклипса - ладно, но остальные (Avrstudio gcc plugin, Code Blocks) - иногда такое выстегивают, что лучше ими не пользоваться
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 28 2010, 11:16
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 28 2010, 14:50
Сообщение #13


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Злодей @ Jan 28 2010, 11:51) *
Ключ ломает стереотипы.
Стереотипы он ломает в другом месте. У тех, у которых они были - про то, что "если вызывается функция из другого файла, то и компилятор не переставит операции в коде, и volatile можно не ставить".


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 28 2010, 23:44
Сообщение #14


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



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

По-моему тот кто "вызывается функция из другого файла... , и volatile можно не ставить" все же точно знает что он делает и почему...
Я не агитирую за то что так нужно делать всегда, это несомненно плацдарм для "скрытых" ошибок,
но иногда этим сам пользуюсь когда нужно чего-нить дооптимизировать...
Go to the top of the page
 
+Quote Post
SysRq
сообщение Jan 29 2010, 20:52
Сообщение #15


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Убрать таблицу векторов прерываний, если не нужна (или сократить, вручную создав нужные вектора).
Если избавиться от глобальных и локальных static данных (или в .noinit их), то оптимизируется долой __do_clear_bss из стартапа - это еще немного байт smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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