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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> gcc для AVR, слишком большой код
XVR
сообщение Oct 6 2010, 06:57
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MrYuran @ Oct 5 2010, 15:10) *
Цитата
Не знаю как себя поведёт avr-gcc, но в аннотации к mspgcc про такую конструкцию написано, что при удачном стечении обстоятельств ждать будем вечно...
Цитата
А там случайно эти обстоятельства не конкретизируются?

...
Вывод неправильный - не 'ждать вечно', а 'не ждать вообще'

Цитата
Основной смысл последней цитаты - задержку лучше определить самому (с точностью до такта), чем отдавать на откуп компилятору
Это да, тут поспорить трудно (хотя и можно при большом желании и абсолютном взаимопонимании с компилятором) rolleyes.gif
Go to the top of the page
 
+Quote Post
609
сообщение Oct 6 2010, 10:03
Сообщение #17





Группа: Новичок
Сообщений: 7
Регистрация: 10-08-10
Пользователь №: 58 849



Цитата(609 @ Oct 5 2010, 12:26) *
4.18 b700 WinAVR 20100110
Еще имеет значение чип, я выбрал ATmega168

Поставил эту версию, проблема исчезла, и уменьшился код: при компиляции в обоих случаях выдает 168 байт.


Цитата(Сергей Борщ @ Oct 5 2010, 14:23) *
А если напишете #define WDR asm volatile ("wdr"), то не сможет.

Спасибо за подсказку, так действительно получается более оптимально.

Цитата(zhevak @ Oct 5 2010, 14:50) *
Смею предположить, что оптимизирующий компилятор в одном случае может вставлять вызов функции, а в другом -- осуществлять in-line подстановку тела этой функции в месте ее вызова. Попробуйте отключить оптимизацию и, как абсолютно правильно сказал MrYuran, посмотрите листинги. Вы не только ответите на свой вопрос, но и существенно придвинетесь в сторону профи.

Листинг смотрел, там действительно в одном случае функция вызывается, а в другом подставляется.
Только я так и не понял, почему компилятор подставляет 100 байт тела функции, вместо того чтобы вызвать функцию 3 байтами.




Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 6 2010, 10:37
Сообщение #18


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

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



Цитата(609 @ Oct 6 2010, 14:03) *
Листинг смотрел, там действительно в одном случае функция вызывается, а в другом подставляется.
Только я так и не понял, почему компилятор подставляет 100 байт тела функции, вместо того чтобы вызвать функцию 3 байтами.

Это зависит от того, какие остальные оптимизирующие ключи выставлены и от того, сколько раз эта функция вызывается.
Если один, то зачем тратить 3 байта на её вызов?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
609
сообщение Oct 6 2010, 11:33
Сообщение #19





Группа: Новичок
Сообщений: 7
Регистрация: 10-08-10
Пользователь №: 58 849



Цитата(MrYuran @ Oct 6 2010, 14:37) *
Если один, то зачем тратить 3 байта на её вызов?

В примере задержка вызывается два раза, и код подставляется дважды. Получается, вместо того чтобы потратить 6 байт на вызов, и 100 байт на тело функции, компилятор подставляет 200 байт.


Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 6 2010, 11:42
Сообщение #20


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

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



Вот ключи для более тонкой настройки инлайна и анролла циклов:
Код
CFLAGS += --param inline-call-cost=10
CFLAGS += --param max-unroll-times=100

#CFLAGS += -ftree-loop-ivcanon
#CFLAGS += -mcall-prologues
CFLAGS += -finline-small-functions
CFLAGS += -fearly-inlining
CFLAGS += -finline-limit=100
CFLAGS += -fno-unit-at-a-time

#CFLAGS += -fno-inline-small-functions
#CFLAGS += -fno-inline-functions
#CFLAGS += -fno-unroll-loops
#CFLAGS += -fno-unroll-all-loops

Может, ещё другие есть.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
609
сообщение Oct 6 2010, 12:39
Сообщение #21





Группа: Новичок
Сообщений: 7
Регистрация: 10-08-10
Пользователь №: 58 849



Цитата(MrYuran @ Oct 6 2010, 15:42) *
Вот ключи для более тонкой настройки инлайна и анролла циклов:
Код
CFLAGS += --param inline-call-cost=10
CFLAGS += --param max-unroll-times=100

#CFLAGS += -ftree-loop-ivcanon
#CFLAGS += -mcall-prologues
CFLAGS += -finline-small-functions
CFLAGS += -fearly-inlining
CFLAGS += -finline-limit=100
CFLAGS += -fno-unit-at-a-time

#CFLAGS += -fno-inline-small-functions
#CFLAGS += -fno-inline-functions
#CFLAGS += -fno-unroll-loops
#CFLAGS += -fno-unroll-all-loops

Может, ещё другие есть.


Спасибо!
Попробовал первый ключ из Вашего списка, все стало компилироваться одинаково.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 31st August 2025 - 15:48
Рейтинг@Mail.ru


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