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

 
 
> WinAVR-20070122 еще сырой?, ошибки оптимизации
Jat
сообщение Feb 17 2007, 04:29
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 6-03-06
Из: Новосибирск
Пользователь №: 15 027



Вот пример генерации кода. опции -Os

---------------------------------------------------------

int g;

int func(void)
{
int res;
{
uint8_t _SReg;
asm volatile("in %0,__SREG__\n\tcli" : "=r" (_SReg));

res = g;

asm volatile( "out __SREG__,%0" :: "r" (_SReg));
}
return res;
}

--------------------------------------------------------
WinAVR 20060421 (правильно)

28 0000 2FB7 in r18,__SREG__
29 0002 F894 cli
32 0004 8091 0000 lds r24,g
33 0008 9091 0000 lds r25,(g)+1
36 000c 2FBF out __SREG__,r18
40 000e 0895 ret

---------------------------------------------------------
WinAVR 20070122 (неправильно)

32 0006 8FB7 in r24,__SREG__
33 0008 F894 cli
37 000a 8FBF out __SREG__,r24
40 000c 8091 0000 lds r24,g
41 0010 9091 0000 lds r25,(g)+1
46 0014 0895 ret

---------------------------------------------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ahulap
сообщение Feb 17 2007, 15:31
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



Заметил, что по сравнению с WinAVR 20060125 код стал занимать немного больше места.
Например, bootloader занимал 2034 байта, стал 2078 байт (написан на с + макросы из boot.h и pgmspace.h). В 2к boot sector уже не влазит.
В чем отличия, еще еще не разбирался, но, похоже, придется менять "трюки" для уменьшения размера кода.
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 17 2007, 16:44
Сообщение #3


Знающий
****

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



Цитата(ahulap @ Feb 17 2007, 15:31) *
Заметил, что по сравнению с WinAVR 20060125 код стал занимать немного больше места.
Например, bootloader занимал 2034 байта, стал 2078 байт (написан на с + макросы из boot.h и pgmspace.h). В 2к boot sector уже не влазит.
В чем отличия, еще еще не разбирался, но, похоже, придется менять "трюки" для уменьшения размера кода.

Если у вас есть локальные переменные в 'main()', сделайте их временно глобальными. 40 байт не обещаю, но байт на 20 код должен уменьшиться.

Анатолий.
Go to the top of the page
 
+Quote Post
ahulap
сообщение Feb 17 2007, 19:00
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



[/quote]
Если у вас есть локальные переменные в 'main()', сделайте их временно глобальными. 40 байт не обещаю, но байт на 20 код должен уменьшиться.
[/quote]
Нет в main() локальных переменных. Из нее в зависимости от джамперов вызываются две static функции (для обновления "себя" или "соседа"). В них несколько локальных переменных (счетчики и байт, принятый по UART), остальные и массивы static.
Я этот загрузчик долго сворачивал, так что думаю, дело в сохранении многобайтовых переменных, принимаемых по UART, идущих старшим байтом вперед. Если записать так:
static unsigned char buf[512];
unsigned int size;
*( (unsigned char *)&size + 1) = buf[0];
*( (unsigned char *)&size + 0) = buf[1];
то компиллятор расположит переменную в памяти, что для счетчика не хорошо. Если записать так:
size = (buf[0] <<8) | buf[1];
то будут лишняя операция ИЛИ 2х-байтных чисел.
Как это все-таки правильно реализовать на С? Или только через ассемблерные вставки?

P.S.: если собрать этот bootloader в IAR 4.12 со средней оптимизацией по размеру, то получится 1940 байт. Есть за чем гнаться smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jat   WinAVR-20070122 еще сырой?   Feb 17 2007, 04:29
- - beer_warrior   Вчера был на avrfreaks. Там много таких вопросов. ...   Feb 17 2007, 12:32
- - aesok   К сожалению это не компилятор сырой, а ваш код. Пр...   Feb 17 2007, 14:10
|- - defunct   Цитата(aesok @ Feb 17 2007, 15:44) Если у...   Feb 23 2007, 16:23
- - ahulap   Провел эксперименты, вот что получил: unsigned in...   Feb 18 2007, 00:16
|- - aesok   В настоящий момент самый эффективный способ в GCC ...   Feb 18 2007, 00:43
- - ahulap   Нашел отличие: 00003900 <main>: 3900: 2f...   Feb 23 2007, 15:55
|- - aesok   Цитата(ahulap @ Feb 23 2007, 15:55) Нашел...   Feb 23 2007, 23:43
- - gormih   WinAVR еще долго будет сырым по определению. Все...   Feb 23 2007, 23:51
|- - aesok   Цитата(gormih @ Feb 23 2007, 23:51) WinAV...   Feb 23 2007, 23:58
|- - gormih   Цитата(aesok @ Feb 23 2007, 23:58) Уважае...   Feb 24 2007, 00:34
|- - aesok   Цитата(gormih @ Feb 24 2007, 00:34) Цитат...   Feb 24 2007, 00:43
|- - ahulap   Цитата(aesok @ Feb 23 2007, 23:43) Патчи ...   Feb 24 2007, 13:12
|- - aesok   Цитата(ahulap @ Feb 24 2007, 13:12) Цитат...   Feb 24 2007, 13:32
- - Abakt   Он же не пишет - "лучше-хуже" он именно ...   Feb 24 2007, 00:42
- - singlskv   Цитата(gormih @ Feb 23 2007, 23:51) WinAV...   Feb 24 2007, 12:38
|- - gormih   Цитата(singlskv @ Feb 24 2007, 12:38) Хот...   Feb 26 2007, 22:55
|- - singlskv   Цитата(gormih @ Feb 26 2007, 22:55) Не со...   Feb 26 2007, 23:28
|- - gormih   Цитата(singlskv @ Feb 26 2007, 23:28) А н...   Feb 27 2007, 12:52
- - beer_warrior   ЦитатаДа и не собираюсь думать, чего он там сделае...   Feb 27 2007, 14:52
|- - gormih   Цитата(beer_warrior @ Feb 27 2007, 14:52)...   Feb 27 2007, 14:57
- - beer_warrior   ЦитатаА Ваше высказывания кроме того, что Вы хам -...   Feb 27 2007, 15:08
|- - gormih   Цитата(beer_warrior @ Feb 27 2007, 15:08)...   Feb 27 2007, 16:03
- - beer_warrior   Цитатаа GNU GPL же тренируются молодые перспективн...   Feb 27 2007, 16:32
|- - gormih   Цитата(beer_warrior @ Feb 27 2007, 16:32)...   Feb 27 2007, 16:42
- - gormih   на сколько понимаю на этом всё   Mar 1 2007, 23:53
- - ahulap   Вот еще что обнаружил: есть маленнькая функция st...   Mar 5 2007, 16:19
|- - aesok   Цитата(ahulap @ Mar 5 2007, 16:19) Вот ещ...   Mar 5 2007, 18:11
|- - ahulap   Цитата(aesok @ Mar 5 2007, 17:11) Цитата(...   Mar 5 2007, 18:57
- - beer_warrior   Цитатана сколько понимаю на этом всё Я просил плат...   Mar 5 2007, 17:22
|- - gormih   Цитата(beer_warrior @ Mar 5 2007, 17:22) ...   Mar 6 2007, 01:12
- - IgorKossak   Поумерьте свой пыд, господа. Тема уже давно себя и...   Mar 6 2007, 10:46
- - IgorKossak   gormin довыступался до предупреждения из-за грубос...   Mar 7 2007, 18:15


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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 20:48
Рейтинг@Mail.ru


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