|
WinAVR-20081205 и тенденции, С каждым релизом WinAVR размер кода растет :( |
|
|
|
Feb 12 2009, 12:45
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(ARV @ Feb 12 2009, 15:17)  при этом никакие другие параметры не использовал! комбинация -mcall-prologues -fno-split-wide-types --param -inline-call-cost=1 -Wl,-relax дает 17112 байт! более чем на килобайт меньше отправной точки! (правда, в железе не проверил - работает оно или нет?) :D По моим наблюдениям GCC 4.3 лучше чем 4.2 процента на 3. GCC 4.4 будет посередине между ними. Про -fsplit-wide-types постораюсь вечером расказать. Анатолий.
|
|
|
|
|
Feb 12 2009, 15:27
|

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

|
Цитата(alx2 @ Feb 12 2009, 12:32)  Поэтому дефолтным поведением должно быть именно сохранение регистров (если специально не указано, что функция noreturn). Буквально сегодня добавил в mspgcc проверку, есть ли выход из функции. Если выхода нет - не сохраняются регистры и не генерится эпилог. Т.е. этакий автоматический __attribute__((noreturn)). Судя по листингу - получается. Даже для main(). Не знаю насколько все изменилось в gcc 4.x по сравнению с 3.х, но можно предположить, что возможность такой проверки осталась - ведь компилятор как-то умеет генерить предупреждения об отсутствии return в функции, возвращающей значения и о наличии точек выхода в функции с атрибутом noreturn. Остается дописать по одному условию в функции генерации пролога и эпилога. Цитата(ARV @ Feb 12 2009, 14:17)  это предел? еще хачу!  http://electronix.ru/forum/index.php?s=&am...st&p=393663
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 12 2009, 21:34
|

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

|
Цитата(Сергей Борщ @ Feb 12 2009, 17:27)  Т.е. этакий автоматический __attribute__((noreturn)). Автоматический это хорошо, конечно, но пренебрагать явным не стоит - он предназачен не толко для компиляции данной функции, но и для вызывающих её. Простейший пример (в жизни врядли такой будет, но это первое, что взбрело в голову для - форсирования размещения аргументов на стеке). Код __attribute__((__noreturn__)) void foo(char *p, ...);
void moo(char *p, ...);
char cc[10];
void baa(unsigned char a) { if(a) foo(cc, 1313); moo(cc, 169); } Код .type kwa, @function kwa: ldi r18,lo8(cc) ldi r19,hi8(cc) tst r24 breq .L2 ldi r24,lo8(1313) ldi r25,hi8(1313) push r25 push r24 push r19 push r18 rcall foo ; ----------- .L2: ldi r24,lo8(169) ldi r25,hi8(169) push r25 push r24 push r19 push r18 rcall moo pop __tmp_reg__ pop __tmp_reg__ pop __tmp_reg__ pop __tmp_reg__ ret из foo "не должно быть" возврата, поэтому нет смысла после неё восстанавливать стек (собственно, можно было и rjmp нарисовать...) Аналогично - если у вызывающей функции набралось что-то в caller-save-регистрах, то перед вызовом noreturn-функции она не будет эти регистры сохранять.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 13 2009, 08:17
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(ARV @ Feb 13 2009, 10:38)  а вот еще вопрос (не совсем в тему, но касающийся оптимизации размера): каким образом убрать из кода таблицу векторов прерываний, если прерывания не используются, чтобы "полезный" код начинался с адреса 0х000? актуально для tiny-проектов. Я так ни когда не делал, но можете попробовать этот вариант. Не знаю получиться ли так в WinAVR. 1. качаете исходники avr-libc и распаковываете их; 2. находите заголовычный файл для вашего контроллера avr-libc\include\avr\io<нужный_контроллер>.h, и правите макрос _VECTORS_SIZE, в соттветствии с необходимым количеством векторов. Учтите _VECTORS_SIZE размер таблицы векторов в байтах; 3. компилируете avr-libc; Код mkdir build cd build ../avr-libc/configure -v --host=avr --prefix=/tools/ make make install - не делаете; 4. ищете statr-up файл для вашего контроллера build\avr\lib\avr<2,3,....51>\<нужный_контроллер>\gcrt1.o 5. линкуете этот gcrt1.o в ваш проект вместо стандартного. Анатолий.
Сообщение отредактировал aesok - Feb 13 2009, 08:23
|
|
|
|
|
Feb 13 2009, 08:38
|

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

|
Цитата(aesok @ Feb 13 2009, 11:31)  Пока только так... слово "пока" зарождает надежду... а нельзя ли принципиально удалять таблицу векторов, если имеется опция -mno-interrupts ? по-моему, очень логично...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|