AVR-GCC i kolejny glupi problem z niechciana konwersja
Masz problem? Zapytaj na forum elektroda.pl
From: "Darek R." <drzonca_at_nospam_w.pl>
Subject: AVR-GCC i kolejny glupi problem z niechciana konwersja
Date: Fri, 9 Apr 2004 20:50:22 +0200
Witam!
Parę dni temu miałem głupi problem z niechcianš (i niepotrzebnš) konwersjš
niejawnš w if-ie. Pomogło wprowadzenie zmiennej tymczasowej. Teraz walczę z
podobnym problemem w switch-u i nie pomaga zupełnie nic... Instrukcja switch
(zmienna) generuje mi kilkanaście porównań szesnastobitowych (zmienna jest
typu unsigned char, promuje jš do inta i zaczyna porównywać z kolejnymi
wartościami przy case-ach). Drgawek dostałem jak zobaczyłem kod assemblerowy
(zmienna jest w rejestrze r24):
1145 028c 9927 clr r25 //promuje mi
moja zmienna do inta
1146 028e 8530 cpi r24,5
1147 0290 9105 cpc r25, _zero_reg_ //sprawdza r25 z zerem (a
dopiero co sam go wyzerowal)
1148 0292 09F4 brne .+2
1149 0294 65C0 rjmp .L77
1150 0296 8630 cpi r24,6
1151 0298 9105 cpc r25, _zero_reg_ //znowu sprawdza r25
1152 029a A4F4 brge .L88
1153 029c 8230 cpi r24,2
1154 029e 9105 cpc r25, _zero_reg_ //i znowu...
1155 02a0 09F4 brne .+2
1156 02a2 43C0 rjmp .L72
1157 02a4 8330 cpi r24,3
1158 02a6 9105 cpc r25, _zero_reg_ //i znowu...
1159 02a8 2CF4 brge .L89
i tak jeszcze wiele razy (tu jest tylko próbka twórczości kompilatora).
Co ja mam z tym zrobić? Nie pomaga zupełnie nic, ani dodatkowa jawna
konwersja na unsigned char, ani zmienne tyczasowe... czy w tym kompilatorze
w ogóle da_się zrobić switcha na ośmiu bitach?
--
Pozdrowienia
Dariusz Rzońca
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai
From: Marcin Stanisz <mstanisz_at_nospam_poczta.bzdury.onet.pl>
Subject: Re: AVR-GCC i kolejny glupi problem z niechciana konwersja
Date: Fri, 09 Apr 2004 21:36:51 +0200
Dnia pią 9. kwietnia 2004 20:50 Darek R. napisał(a):
Witam!
Parę dni temu miałem głupi problem z niechcianą (i niepotrzebną) konwersją
niejawną w if-ie. Pomogło wprowadzenie zmiennej tymczasowej. Teraz walczę
z podobnym problemem w switch-u i nie pomaga zupełnie nic... Instrukcja
switch (zmienna) generuje mi kilkanaście porównań szesnastobitowych
(zmienna jest typu unsigned char, promuje ją do inta i zaczyna porównywać
z kolejnymi wartościami przy case-ach).
ZTCW to nie da się. Należy case unikać i przejrzeć archiwum listy avr-gcc,
(http://www.avr1.org/mailman/listinfo/avr-gcc-list/) gdzie OIDP problem się
przewinął parę razy.
Pozdrawiam
--
Marcin Stanisz
"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Darek R." <drzonca_at_nospam_w.pl>
Subject: Re: AVR-GCC i kolejny glupi problem z niechciana konwersja
Date: Sat, 10 Apr 2004 02:24:36 +0200
Marcin Stanisz napisał
ZTCW to nie da się. Należy case unikać i przejrzeć archiwum listy avr-gcc,
(http://www.avr1.org/mailman/listinfo/avr-gcc-list/) gdzie OIDP problem
się
przewinął parę razy.
Ale sobie kompilator wybrałem... Zawsze mnie uczyli że switch jest bardziej
efektywny niz kilka if-ów, a tu na odwrót. Pomijam już fakt, że kompilator
powinien tłumaczyć switcha na jeden rozkaz IJMP (zapisując sobie wcześniej w
rejestrze Z adres case-a odpowiadający warunkowi w switchu) a nie na
kilkadziesiąt porównań z kolejnymi liczbami, ale jak już musi to niech to
chociaż robi na zmiennych ośmiobitowych... Będę musiał przez to spory
kawałek kodu przepisać w assemblerze a tak mi się nie chce... :)
--
Pozdrowienia
Dariusz Rzońca
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai
From: J.F. <jfox_nospam_at_nospam_poczta.onet.pl>
Subject: Re: AVR-GCC i kolejny glupi problem z niechciana konwersja
Date: Sat, 10 Apr 2004 03:31:01 +0200
On Sat, 10 Apr 2004 02:24:36 +0200, Darek R. wrote:
Ale sobie kompilator wybrałem...
No fakt. Dziwne swoja droga ze gcc nie optymalizuje ..
Zawsze mnie uczyli że switch jest bardziej
efektywny niz kilka if-ów, a tu na odwrót. Pomijam już fakt, że kompilator
powinien tłumaczyć switcha na jeden rozkaz IJMP (zapisując sobie wcześniej w
rejestrze Z adres case-a odpowiadający warunkowi w switchu) a nie na
kilkadziesiąt porównań z kolejnymi liczbami
O, spowobow kompilacji switcha jest sporo, kompilator powinien dobrac
odpowiedni..
ale jak już musi to niech to chociaż robi na zmiennych ośmiobitowych..
A probowales case '\x03' ?
J.
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.gazeta.pl!news.man.poznan.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Darek R." <drzonca_at_nospam_w.pl>
Subject: Re: AVR-GCC i kolejny glupi problem z niechciana konwersja
Date: Sat, 10 Apr 2004 14:12:43 +0200
J.F. napisał
O, spowobow kompilacji switcha jest sporo, kompilator powinien dobrac
odpowiedni..
Fakt. Ale jak mam kilkadziesiąt case-ów numerowanych kolejno, to jakby nie
patrzeć najbardziej optymalna byłaby tablica z adresami etykiet a potem skok
pośredni pod adres wskazywany przez odpowiednie miejsce w tabeli. Ok,
rozumiem że IJMP nie jest zaimplementowany we wszystkich AVR-ach (choć
akurat w moim jest), więc zgadzam się że kompilator może sobie zrobić
kolejne porównania. Ale czemu na 16 bitach?
ale jak już musi to niech to chociaż robi na zmiennych ośmiobitowych..
A probowales case '\x03' ?
Próbowałem - dalej porównuje 16 bit.
--
Pozdrowienia
Dariusz Rzońca
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai
From: J.F. <jfox_nospam_at_nospam_poczta.onet.pl>
Subject: Re: AVR-GCC i kolejny glupi problem z niechciana konwersja
Date: Sat, 10 Apr 2004 15:21:12 +0200
On Sat, 10 Apr 2004 14:12:43 +0200, Darek R. wrote:
Fakt. Ale jak mam kilkadziesiąt case-ów numerowanych kolejno, to jakby nie
patrzeć najbardziej optymalna byłaby tablica z adresami etykiet a potem skok
pośredni pod adres wskazywany przez odpowiednie miejsce w tabeli. Ok,
rozumiem że IJMP nie jest zaimplementowany we wszystkich AVR-ach (choć
akurat w moim jest), więc zgadzam się że kompilator może sobie zrobić
kolejne porównania. Ale czemu na 16 bitach?
No coz - zawsze podejrzewalem ze gcc wyrosly w zasadzie na 32 bitach
moze niezbyt pasowac do 8 :-)
Jest tam jakis adres - pomecz tworcow.
J.
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.gazeta.pl!news.astercity.net!news.aster.pl!not-for-mai
From: Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl>
Subject: Re: AVR-GCC i kolejny glupi problem z niechciana konwersja
Date: Sun, 11 Apr 2004 00:09:33 +0200
Darek R. wrote:
Fakt. Ale jak mam kilkadziesiąt case-ów numerowanych kolejno, to jakby nie
patrzeć najbardziej optymalna byłaby tablica z adresami etykiet a potem skok
W takim przypadku przeciez mozesz explicite zrobic tablice z adresami
kilkudziesieciu funkcji i wywolywac je przez wskaznik czytany z tablicy.
To nawet wygodniejsze rozwiazanie, niz rozwijac switch'a. A jak sie
zrobi z tego kilkaset funkcji to latwiej bedzie calosc rozparcelowac na
kilka oddzielnych plikow zrodlowych, niz trzymac tyle kodu w jednym
(trudniej zapanowac nad 1 plikiem dlugosci 100 KB, niz 5 x 20 KB). Poza
tym w wielu przypadkach duzo czytelniejsza jest tablica z nazwami
funkcji (np. obslugiwanych komend czy stanow jakiegos automatu), niz
taki wieeeeloliniowy switch.
--
Adam Dybkowski
adybkows_at_nospam_amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows/
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Darek R." <drzonca_at_nospam_w.pl>
Subject: Re: AVR-GCC i kolejny glupi problem z niechciana konwersja
Date: Sun, 11 Apr 2004 16:53:25 +0200
Adam Dybkowski napisał:
W takim przypadku przeciez mozesz explicite zrobic tablice z adresami
kilkudziesieciu funkcji i wywolywac je przez wskaznik czytany z tablicy.
No i tak właśnie pewnie będę musiał zrobić. Tyle że pisząc switch chciałem
zaprząc kompilator żeby zrobił to za mnie ;)
--
Pozdrowienia
Dariusz Rzońca
========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.onet.pl!not-for-mai
From: Marcin Stanisz <mstanisz_at_nospam_poczta.bzdury.onet.pl>
Subject: Re: AVR-GCC i kolejny glupi problem z niechciana konwersja
Date: Sun, 11 Apr 2004 21:53:01 +0200
Dnia sob 10. kwietnia 2004 02:24 Darek R. napisał(a):
Ale sobie kompilator wybrałem... Zawsze mnie uczyli że switch jest
Jak to mówią... Darowanemu koniowi nie zagląda się w zęby ;-) Albo się
przysiada fałdów i poprawia kod avr-gcc.
Pozdrawiam
--
Marcin Stanisz
"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"
========
Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.gazeta.pl!news.task.gda.pl!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.de!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai