WinAVR i volatile na zmiennej w rejestrze

Sep 03, 2006 7 Replies

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


Grzegorz Kurczyk przemówił ludzkim głosem:

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

formatting link

Zbych napisał(a):

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.

Błędy w gcc lepiej zgłaszać twórcom gcc, nie avr-libc.

w.

Wojtek Kaniewski przemówił ludzkim głosem:

Racja, ale z moich obserwacji wynika, że to twórcy avr-libc głównie grzebią w porcie gcc na avr.

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:

Zbych snipped-for-privacy@onet.pl napisał(a):

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

Użytkownik Piotrek Sz. napisał:

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

Użytkownik Grzegorz Kurczyk napisał:

Niestety WinAVR-20060421 zachowuje sie identycznie :-( Pozostaje mi wstawka assemblerowa...

Pozdrawiam Grzegorz

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required