Перейти к содержанию
    

WinAVR-20081205 и тенденции

2ARV: -fno-unroll-loops стоИт?
раньше я уже писал: все *loops* опции я пробовал... но проверил еще раз: в комплекте с предыдущим набором 0 байт изменения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при этом никакие другие параметры не использовал! комбинация -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 постораюсь вечером расказать.

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, для тех, кто пользуется максимальной оптимизацией по скорости, рекомендую отключить векторизацию. Не так давно обсуждали этот вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поэтому дефолтным поведением должно быть именно сохранение регистров (если специально не указано, что функция noreturn).
Буквально сегодня добавил в mspgcc проверку, есть ли выход из функции. Если выхода нет - не сохраняются регистры и не генерится эпилог. Т.е. этакий автоматический __attribute__((noreturn)). Судя по листингу - получается. Даже для main(). Не знаю насколько все изменилось в gcc 4.x по сравнению с 3.х, но можно предположить, что возможность такой проверки осталась - ведь компилятор как-то умеет генерить предупреждения об отсутствии return в функции, возвращающей значения и о наличии точек выхода в функции с атрибутом noreturn. Остается дописать по одному условию в функции генерации пролога и эпилога.

 

это предел? еще хачу! :)
:) http://electronix.ru/forum/index.php?s=&am...st&p=393663

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. этакий автоматический __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-функции она не будет эти регистры сохранять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вот еще вопрос (не совсем в тему, но касающийся оптимизации размера): каким образом убрать из кода таблицу векторов прерываний, если прерывания не используются, чтобы "полезный" код начинался с адреса 0х000? актуально для tiny-проектов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

каким образом убрать из кода таблицу векторов прерываний, если прерывания не используются, чтобы "полезный" код начинался с адреса 0х000? актуально для tiny-проектов.

Наверно, подрихтовать скрипт линкера, выкинуть секцию векторов и растянуть кодовую

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вот еще вопрос (не совсем в тему, но касающийся оптимизации размера): каким образом убрать из кода таблицу векторов прерываний, если прерывания не используются, чтобы "полезный" код начинался с адреса 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

увы, такой сложный и, опять-же, индивидуально затачиваемый под конкретный контроллер вариант явно не подходит... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

увы, такой сложный и, опять-же, индивидуально затачиваемый под конкретный контроллер вариант явно не подходит... :(

 

Пока только так, изменить таблицу векторов можно только в стртап файле.

 

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока только так...
слово "пока" зарождает надежду...

а нельзя ли принципиально удалять таблицу векторов, если имеется опция -mno-interrupts ? по-моему, очень логично...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...