Grzegorz Kurczyk
Guest
Sun Sep 03, 2006 10:19 am
Witam
Mam dziwny problem z WinAVR-20050214.
Chodzi o atrybut volatile na zmiennej zadeklarowanej w rejestrze.
// deklaracja
volatile register struct {
char WaitRC: 1;
} Flags asm("r17");
// fragment kodu
while (Flags.WaitRC) {
wdt_reset();
// wynik kompilacji
34a: 81 2f mov r24, r17
34c: 88 70 andi r24, 0x08 ; 8
34e: 13 ff sbrs r17, 3
350: 03 c0 rjmp .+6 ; 0x358
352: a8 95 wdr
354: 88 23 and r24, r24
356: e9 f7 brne .-6 ; 0x352
kompilator pobiera zawartość rejestru R17 do rejestru R24 tylko raz przy
wejściu do pętli while, a póżniej juz program biega w kółko na podstawie
"mocno nieaktualnej" zawartości R24.
Usuniecie volatile w delkaracji zmiennej daje dokładnie taki sam kod
wynikowy.
Rozwiązałem to wstawką assemblerową, ale czy ktoś z Grupowiczów spotkał
się z podobnym problemem w nowszych wersjach WinAVR.
Pozdrawiam
Grzegorz
Zbych
Guest
Sun Sep 03, 2006 12:18 pm
Grzegorz Kurczyk przemówił ludzkim głosem:
Quote:
Rozwiązałem to wstawką assemblerową, ale czy ktoś z Grupowiczów spotkał
się z podobnym problemem w nowszych wersjach WinAVR.
Przetestowałem twój kod na gcc 4.1.0 i wynik jest dokładnie ten sam.
Można by to zgłosić jako błąd
http://savannah.nongnu.org/bugs/?func=additem&group=avr-libc
Wojtek Kaniewski
Guest
Sun Sep 03, 2006 12:52 pm
Zbych napisał(a):
Quote:
Przetestowałem twój kod na gcc 4.1.0 i wynik jest dokładnie ten sam.]
Sprawdziłem z różnymi poziomami optymalizacji i błędny kod był
generowany tylko dla -Os. Dla -O0, -O1, -O2 i -O3 kod był poprawny, co
więcej, dla -O3 był krótszy niż -Os.
Quote:
Błędy w gcc lepiej zgłaszać twórcom gcc, nie avr-libc.
w.
Zbych
Guest
Sun Sep 03, 2006 1:05 pm
Wojtek Kaniewski przemówił ludzkim głosem:
Quote:
Błędy w gcc lepiej zgłaszać twórcom gcc, nie avr-libc.
Racja, ale z moich obserwacji wynika, że to twórcy avr-libc głównie
grzebią w porcie gcc na avr.
Zbych
Guest
Sun Sep 03, 2006 1:36 pm
Quote:
Grzegorz Kurczyk przemówił ludzkim głosem:
Rozwiązałem to wstawką assemblerową, ale czy ktoś z Grupowiczów spotkał
się z podobnym problemem w nowszych wersjach WinAVR.
Przetestowałem twój kod na gcc 4.1.0 i wynik jest dokładnie ten sam.
Przyszedł mi jeszcze jeden pomysł do głowy, po zmianie deklaracji na taką:
register struct {
volatile char WaitRC: 1;
} Flags asm("r17");
Generowany kod wydaje się być poprawny (gcc 4.1.0, optymalizacja na
rozmiar):
71 0008 01C0 rjmp .L2
72 .L3:
11:main.c **** while (Flags.WaitRC) wdt_reset();
74 .LM1:
75 /* #APP */
76 000a A895 wdr
77 /* #NOAPP */
78 .L2:
79 000c 8091 0000 lds r24,r17
80 0010 80FD sbrc r24,0
81 0012 FBCF rjmp .L3
12:main.c ****
13:main.c **** }
83 .LM2:
Piotrek Sz.
Guest
Sun Sep 03, 2006 3:40 pm
Zbych <abuse@onet.pl> napisał(a):
Quote:
Grzegorz Kurczyk przemówił ludzkim głosem:
Rozwiązałem to wstawką assemblerową, ale czy ktoś z Grupowiczów spotkał
się z podobnym problemem w nowszych wersjach WinAVR.
Przetestowałem twój kod na gcc 4.1.0 i wynik jest dokładnie ten sam.
Przyszedł mi jeszcze jeden pomysł do głowy, po zmianie deklaracji na taką:
register struct {
volatile char WaitRC: 1;
} Flags asm("r17");
Generowany kod wydaje się być poprawny (gcc 4.1.0, optymalizacja na
rozmiar):
71 0008 01C0 rjmp .L2
72 .L3:
11:main.c **** while (Flags.WaitRC) wdt_reset();
74 .LM1:
75 /* #APP */
76 000a A895 wdr
77 /* #NOAPP */
78 .L2:
79 000c 8091 0000 lds r24,r17
80 0010 80FD sbrc r24,0
81 0012 FBCF rjmp .L3
12:main.c ****
13:main.c **** }
83 .LM2:
I to będzie TO , bo przy poprzedniej deklaracji struktury , gcc3.4.6 ostrzegał:
../Test4.c:8: warning: volatile register variables don't work as you might wish
Piotrek
--
Wysłano z serwisu Usenet w portalu Gazeta.pl ->
http://www.gazeta.pl/usenet/
Grzegorz Kurczyk
Guest
Sun Sep 03, 2006 4:02 pm
Użytkownik Piotrek Sz. napisał:
Quote:
register struct {
volatile char WaitRC: 1;
} Flags asm("r17");
Niestety moje wersja WinAVR nie łyka takiej deklaracji
error: address of global register variable `Flags' requested
Trzeba się będzie przesiąść na nowszą wersję, ale słyszałem, ze są
jakieś problemy z kompilacją źródeł napisanych na starsze wersje (coś
związane z obsługą przerwań w AVR-kach)
Póki co wstawka assemblerowa działa jak należy :-)
Dzięki Wszystkim za pomoc
Pozdrawiam
Grzegorz
Grzegorz Kurczyk
Guest
Sun Sep 10, 2006 8:34 pm
Użytkownik Grzegorz Kurczyk napisał:
Quote:
Trzeba się będzie przesiąść na nowszą wersję, ale słyszałem, ze są
jakieś problemy z kompilacją źródeł napisanych na starsze wersje (coś
związane z obsługą przerwań w AVR-kach)
Niestety WinAVR-20060421 zachowuje sie identycznie
Pozostaje mi wstawka assemblerowa...
Pozdrawiam
Grzegorz