Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.04.2010, 00:05
|
|
Прописка
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
|
Re: WinAVR+switch на таблицах
c:\WinAVR\bin›avr-gcc --version
avr-gcc (WinAVR 20090313) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
|
|
|
|
06.04.2010, 00:20
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
Re: WinAVR+switch на таблицах
Сообщение от di_halt
|
avr-gcc (WinAVR 20090313) 4.3.2
|
Вообщем почти то же самое, что и у меня.
У меня в программе switch делается по переменной типа uint8_t, значение case'ов последовательные от 0 до 7, секция default отсутствует. Оптимизация -Os.
При этом генерируется таблица переходов для switch'а сразу после таблицы прерываний.
__________________
.
![](signaturepics/sigpic59615_7.gif)
В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
|
|
|
|
06.04.2010, 00:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: WinAVR+switch на таблицах
Сообщение от alexgap
|
У меня в программе switch делается по переменной типа uint8_t,
|
Вы листинг лучше приводите - намного наглядней. И попробуйте для непоследовательных значений.
|
|
|
|
06.04.2010, 00:34
|
|
Прописка
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
|
Re: WinAVR+switch на таблицах
Ну с непоследовательными разговор особый. Тут даже спорить не о чем. Интересует оптимизация именно последовательных списков.
|
|
|
|
06.04.2010, 00:45
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
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
... |
__________________
.
![](signaturepics/sigpic59615_7.gif)
В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
|
|
|
|
06.04.2010, 00:46
|
|
Прописка
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
|
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
|
|
|
|
06.04.2010, 00:52
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
Re: WinAVR+switch на таблицах
Сообщение от di_halt
|
А вот что он родил
|
ИМХО, компилятор почти правильно сделал в вашем случае. У вас же -Os. Всё потому, что тела ваших case'oв очень маленькие. Поэтому компилятор решил сэкономить на размере в ущерб скорости. Ну явно не глубоко он думает, это да. Такое решение вполне поверхностное. Таблица была бы выгодна и по скорости и по размеру, насколько я могу это сейчас предугадать. Пробуйте -O2 или -O3.
В моем случае тела case'oв - это целые баяны, да еще некоторые завершаются по goto, а не по break. Поэтому отсутствие таблицы никак не сказалось бы на размере - он и так большой. И еще у меня хитрые директивы оптимизации, может дело все-таки в них. Сейчас скину.
__________________
.
![](signaturepics/sigpic59615_7.gif)
В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
Последний раз редактировалось alexgap; 06.04.2010 в 01:03.
|
|
|
|
06.04.2010, 01:03
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
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
__________________
.
![](signaturepics/sigpic59615_7.gif)
В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
Последний раз редактировалось alexgap; 06.04.2010 в 01:06.
|
|
|
|
06.04.2010, 08:03
|
|
Прописка
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
|
Re: WinAVR+switch на таблицах
в чистом забеге, без другого кода, на 15кейсах он фигачит на CPI (на таблицах выгадываем на 15 байт меньше, но не думаю что компилер настолько хорошо умеет высчитывать выгоду от оптимизации, так что считаем что он не сильно ошибся выбрав CPI). А на 23 кейсах уже на таблицах сделал. Таки работает.
Осталось теперь понять почему у меня на 30 кейсах было через CPI побалуюсь ключами.
Усем спасибо!
|
|
|
|
07.04.2010, 04:22
|
|
Частый гость
Регистрация: 23.05.2005
Сообщений: 16
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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
код поменьше еще становится.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:21.
|
|