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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> WinAVR-20081205 и тенденции, С каждым релизом WinAVR размер кода растет :(
ARV
сообщение Feb 12 2009, 12:41
Сообщение #31


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

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



Цитата(_Pasha @ Feb 12 2009, 15:25) *
2ARV: -fno-unroll-loops стоИт?
раньше я уже писал: все *loops* опции я пробовал... но проверил еще раз: в комплекте с предыдущим набором 0 байт изменения.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 12 2009, 12:45
Сообщение #32


Знающий
****

Группа: Участник
Сообщений: 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 постораюсь вечером расказать.

Анатолий.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 12 2009, 13:39
Сообщение #33


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 12 2009, 15:27
Сообщение #34


Гуру
******

Группа: Модераторы
Сообщений: 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) *
это предел? еще хачу! smile.gif
smile.gif 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)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 12 2009, 21:34
Сообщение #35


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

Группа: Свой
Сообщений: 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-функции она не будет эти регистры сохранять.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 13 2009, 07:38
Сообщение #36


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

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



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 13 2009, 07:42
Сообщение #37


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ARV @ Feb 13 2009, 10:38) *
каким образом убрать из кода таблицу векторов прерываний, если прерывания не используются, чтобы "полезный" код начинался с адреса 0х000? актуально для tiny-проектов.

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 13 2009, 08:17
Сообщение #38


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 13 2009, 08:27
Сообщение #39


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

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



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 13 2009, 08:31
Сообщение #40


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(ARV @ Feb 13 2009, 11:27) *
увы, такой сложный и, опять-же, индивидуально затачиваемый под конкретный контроллер вариант явно не подходит... sad.gif


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


Анатолий.

Сообщение отредактировал aesok - Feb 13 2009, 08:32
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 13 2009, 08:38
Сообщение #41


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

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



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

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

 


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


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