Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 06.04.2010, 00:05  
di_halt
Прописка
 
Аватар для di_halt
 
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
di_halt на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

c:\WinAVR\bin›avr-gcc --version
avr-gcc (WinAVR 20090313) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
Реклама:
__________________
Мой блог по электронике - www.easyelectronics.ru
di_halt вне форума  
Непрочитано 06.04.2010, 00:20  
alexgap
Гражданин KAZUS.RU
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
alexgap на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Сообщение от di_halt Посмотреть сообщение
avr-gcc (WinAVR 20090313) 4.3.2
Вообщем почти то же самое, что и у меня.

У меня в программе switch делается по переменной типа uint8_t, значение case'ов последовательные от 0 до 7, секция default отсутствует. Оптимизация -Os.
При этом генерируется таблица переходов для switch'а сразу после таблицы прерываний.
__________________
.

В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
alexgap вне форума  
Непрочитано 06.04.2010, 00:27  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Сообщение от alexgap Посмотреть сообщение
У меня в программе switch делается по переменной типа uint8_t,
Вы листинг лучше приводите - намного наглядней. И попробуйте для непоследовательных значений.
kison вне форума  
Непрочитано 06.04.2010, 00:34  
di_halt
Прописка
 
Аватар для di_halt
 
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
di_halt на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Ну с непоследовательными разговор особый. Тут даже спорить не о чем. Интересует оптимизация именно последовательных списков.
__________________
Мой блог по электронике - www.easyelectronics.ru
di_halt вне форума  
Непрочитано 06.04.2010, 00:45  
alexgap
Гражданин KAZUS.RU
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
alexgap на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Сообщение от kison Посмотреть сообщение
Вы листинг лучше приводите - намного наглядней
Я вставил комментарии там где сгенерировался код для switch.

Код:
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000007e2  00000000  00000000  00000094  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000024  00800060  000007e2  00000876  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000005  00800084  00800084  0000089a  2**0
                  ALLOC
Disassembly of section .text:
00000000 ‹se_empty_vectors_entry_at_0›:
   0:	08 c0       	rjmp	.+16     	; 0x12 ‹__ctors_end›

   ; Ниже таблица для switch
   2:	44 c3       	rjmp	.+1672   	; 0x68c ‹_ZN5EmKit9Soldering8FirmWare7Program25Main_CySx0rF  vdSF_7A67FC86Ev+0x19e›
   4:	4b c3       	rjmp	.+1686   	; 0x69c ‹_ZN5EmKit9Soldering8FirmWare7Program25Main_CySx0rF  vdSF_7A67FC86Ev+0x1ae›
   6:	5d c3       	rjmp	.+1722   	; 0x6c2 ‹_ZN5EmKit9Soldering8FirmWare7Program25Main_CySx0rF  vdSF_7A67FC86Ev+0x1d4›
   8:	66 c3       	rjmp	.+1740   	; 0x6d6 ‹_ZN5EmKit9Soldering8FirmWare7Program25Main_CySx0rF  vdSF_7A67FC86Ev+0x1e8›
   a:	af c3       	rjmp	.+1886   	; 0x76a ‹_ZN5EmKit9Soldering8FirmWare7Program25Main_CySx0rF  vdSF_7A67FC86Ev+0x27c›
   c:	ae c3       	rjmp	.+1884   	; 0x76a ‹_ZN5EmKit9Soldering8FirmWare7Program25Main_CySx0rF  vdSF_7A67FC86Ev+0x27c›
   e:	76 c3       	rjmp	.+1772   	; 0x6fc ‹_ZN5EmKit9Soldering8FirmWare7Program25Main_CySx0rF  vdSF_7A67FC86Ev+0x20e›
  10:	84 c3       	rjmp	.+1800   	; 0x71a ‹_ZN5EmKit9Soldering8FirmWare7Program25Main_CySx0rF  vdSF_7A67FC86Ev+0x22c›
00000012 ‹__ctors_end›:
  12:	11 24       	eor	r1, r1
  14:	1f be       	out	0x3f, r1	; 63
  16:	cf e5       	ldi	r28, 0x5F	; 95
  18:	d4 e0       	ldi	r29, 0x04	; 4
  1a:	de bf       	out	0x3e, r29	; 62
  1c:	cd bf       	out	0x3d, r28	; 61

...

; В r20 лежит переменная для switch

 672:	e4 2f       	mov	r30, r20
 674:	f0 e0       	ldi	r31, 0x00	; 0
 676:	31 97       	sbiw	r30, 0x01	; 1
 678:	e8 30       	cpi	r30, 0x08	; 8
 67a:	f1 05       	cpc	r31, r1
 67c:	18 f4       	brcc	.+6      	; 0x684 ‹_ZN5EmKit9Soldering8FirmWare7Program25Main_CySx0rF  vdSF_7A67FC86Ev+0x196›
 67e:	ef 5f       	subi	r30, 0xFF	; 255
 680:	ff 4f       	sbci	r31, 0xFF	; 255
 682:	09 94       	ijmp

 ; Инструкции после switch'a
 684:	44 31       	mov	r20, 0x14	; 20

...
__________________
.

В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
alexgap вне форума  
Непрочитано 06.04.2010, 00:46  
di_halt
Прописка
 
Аватар для di_halt
 
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
di_halt на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

вот что было

switch(EncState)
{
case 0: UDR=1; break;
case 1: UDR=28; break;
case 2: UDR=35; break;
case 3: UDR=46; break;
case 4: UDR=54; break;
case 5: UDR=65; break;
case 6: UDR=73; break;
case 7: UDR=86; break;
case 8: UDR=93; break;
case 9: UDR=12; break;
case 10: UDR=22; break;
case 11: UDR=33; break;
}


А вот что он родил:

347: switch(EncState)
+00000172: 9180014B LDS R24,0x014B Load direct from data space
+00000174: 3085 CPI R24,0x05 Compare with immediate
+00000175: F151 BREQ PC+0x2B Branch if equal
+00000176: 3086 CPI R24,0x06 Compare with immediate
+00000177: F470 BRCC PC+0x0F Branch if carry cleared
+00000178: 3082 CPI R24,0x02 Compare with immediate
+00000179: F101 BREQ PC+0x21 Branch if equal
+0000017A: 3083 CPI R24,0x03 Compare with immediate
+0000017B: F428 BRCC PC+0x06 Branch if carry cleared
+0000017C: 2388 TST R24 Test for Zero or Minus
+0000017D: F0C1 BREQ PC+0x19 Branch if equal
+0000017E: 3081 CPI R24,0x01 Compare with immediate
+0000017F: F571 BRNE PC+0x2F Branch if not equal
+00000180: C017 RJMP PC+0x0018 Relative jump
+00000181: 3083 CPI R24,0x03 Compare with immediate
+00000182: F0C9 BREQ PC+0x1A Branch if equal
+00000183: 3084 CPI R24,0x04 Compare with immediate
+00000184: F549 BRNE PC+0x2A Branch if not equal
+00000185: C018 RJMP PC+0x0019 Relative jump
+00000186: 3088 CPI R24,0x08 Compare with immediate
+00000187: F0F1 BREQ PC+0x1F Branch if equal
+00000188: 3089 CPI R24,0x09 Compare with immediate
+00000189: F428 BRCC PC+0x06 Branch if carry cleared
+0000018A: 3086 CPI R24,0x06 Compare with immediate
+0000018B: F0B1 BREQ PC+0x17 Branch if equal
+0000018C: 3087 CPI R24,0x07 Compare with immediate
+0000018D: F501 BRNE PC+0x21 Branch if not equal
+0000018E: C015 RJMP PC+0x0016 Relative jump
+0000018F: 308A CPI R24,0x0A Compare with immediate
+00000190: F0C9 BREQ PC+0x1A Branch if equal
+00000191: 308A CPI R24,0x0A Compare with immediate
+00000192: F0A8 BRCS PC+0x16 Branch if carry set
+00000193: 308B CPI R24,0x0B Compare with immediate
+00000194: F4C9 BRNE PC+0x1A Branch if not equal
+00000195: C016 RJMP PC+0x0017 Relative jump
__________________
Мой блог по электронике - www.easyelectronics.ru
di_halt вне форума  
Непрочитано 06.04.2010, 00:52  
alexgap
Гражданин KAZUS.RU
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
alexgap на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Сообщение от di_halt Посмотреть сообщение
А вот что он родил
ИМХО, компилятор почти правильно сделал в вашем случае. У вас же -Os. Всё потому, что тела ваших case'oв очень маленькие. Поэтому компилятор решил сэкономить на размере в ущерб скорости. Ну явно не глубоко он думает, это да. Такое решение вполне поверхностное. Таблица была бы выгодна и по скорости и по размеру, насколько я могу это сейчас предугадать. Пробуйте -O2 или -O3.

В моем случае тела case'oв - это целые баяны, да еще некоторые завершаются по goto, а не по break. Поэтому отсутствие таблицы никак не сказалось бы на размере - он и так большой. И еще у меня хитрые директивы оптимизации, может дело все-таки в них. Сейчас скину.
__________________
.

В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.

Последний раз редактировалось alexgap; 06.04.2010 в 01:03.
alexgap вне форума  
Непрочитано 06.04.2010, 01:03  
alexgap
Гражданин KAZUS.RU
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
alexgap на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Мои настройки оптимизации:
-Os -fexpensive-optimizations -fshort-enums -fpack-struct -funsigned-char -funsigned-bitfields -fwhole-program

Вот дополнительно чтобы компилятор сам выкидывал неиспользуемый код и данные. Эти опции давать всем файлам и линкеру:
-ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,-O1
__________________
.

В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.

Последний раз редактировалось alexgap; 06.04.2010 в 01:06.
alexgap вне форума  
Непрочитано 06.04.2010, 08:03  
di_halt
Прописка
 
Аватар для di_halt
 
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
di_halt на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

в чистом забеге, без другого кода, на 15кейсах он фигачит на CPI (на таблицах выгадываем на 15 байт меньше, но не думаю что компилер настолько хорошо умеет высчитывать выгоду от оптимизации, так что считаем что он не сильно ошибся выбрав CPI). А на 23 кейсах уже на таблицах сделал. Таки работает.

Осталось теперь понять почему у меня на 30 кейсах было через CPI побалуюсь ключами.

Усем спасибо!
__________________
Мой блог по электронике - www.easyelectronics.ru
di_halt вне форума  
Непрочитано 07.04.2010, 04:22  
alekseyb
Частый гость
 
Регистрация: 23.05.2005
Сообщений: 16
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
alekseyb на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Я еще эти опции к компилятору добавляю
--param inline-call-cost=2 -fno-tree-scev-cprop -fno-split-wide-types -fno-inline-small-functions -fno-move-loop-invariants

а к линковщику это дабавляю
-Wl,--relax
код поменьше еще становится.
alekseyb вне форума  
 

Закладки

Метки
winavr
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06
Библиотеки для Xmega под WinAVR harchenko_pavel AVR 21 15.03.2013 23:00
На WinAVR + AVR Studio c CVAVR Vetal-soft Embedd С 87 03.03.2013 20:31
Вопрос winavr wss60 Микроконтроллеры, АЦП, память и т.д 6 09.03.2010 07:33
Оптимизация в WinAVR && GCC igor-k Микроконтроллеры, АЦП, память и т.д 1 30.11.2009 17:37


Часовой пояс GMT +4, время: 23:21.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot