WinAVR i volatile na zmiennej w rejestrze

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

Reply to
Grzegorz Kurczyk
Loading thread data ...

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

Reply to
Zbych

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.

Reply to
Wojtek Kaniewski

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.

Reply to
Zbych

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:
Reply to
Zbych

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

Reply to
Piotrek Sz.

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

Reply to
Grzegorz Kurczyk

Użytkownik Grzegorz Kurczyk napisał:

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

Pozdrawiam Grzegorz

Reply to
Grzegorz Kurczyk

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.