RTV forum PL | NewsGroups PL

Zachowanie zmiennej volatile w rejestrze w WinAVR - Pętla 'while' i R17

WinAVR i volatile na zmiennej w rejestrze

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Zachowanie zmiennej volatile w rejestrze w WinAVR - Pętla 'while' i R17

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 Sad
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 Sad
Pozostaje mi wstawka assemblerowa...

Pozdrawiam
Grzegorz

elektroda NewsGroups Forum Index - Elektronika Polska - Zachowanie zmiennej volatile w rejestrze w WinAVR - Pętla 'while' i R17

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map
Nasz serwis wykorzystuje pliki cookies. Korzystanie z witryny oznacza zgodę na ich zapis lub odczyt zgodnie z ustawieniami przeglądarki. Informacja o ciasteczkach