Jak wyłączyć optymalizację kompilatora WinAVR dla pętli z zmienną globalną?

WinAVR =?ISO-8859-2?Q?przeoptymalizowa=B3_=3A-=29?=





Poprzedni Następny
Wiadomość
Spis treści
From: Grzegorz Kurczyk <mousetrap_at_nospam_control.slupsk.pl>
Subject: WinAVR =?ISO-8859-2?Q?przeoptymalizowa=B3_=3A-=29?=
Date: Fri, 01 Apr 2005 09:28:26 +0200


Witam
Jest sobie taki fragment programu:

***************************
unsigned int Licznik;

SIGNAL(SIG_OUTPUT_COMPARE0) {
if (Licznik)
Licznik--;
}

int main(void) {
Licznik = 100;
while (Licznik);
}
***************************

oczywiście TIMER0 jest prawidłowo zainicjalizowany i tyka jak trzeba
problem jest z "while (Licznik)" w programie głownym, bo kompilator go
sobie "przeoptymalizował" :)

525:KodM32.c ** Licznik = 100;
2922 .LM298:
2923 0bb2 84E6 ldi r24,lo8(100)
2924 0bb4 90E0 ldi r25,hi8(100)
2925 0bb6 9093 0000 sts (Licznik)+1,r25
2926 0bba 8093 0000 sts Licznik,r24
526:KodM32.c ** while (Licznik);
2932 .L203:
2933 0bc4 0097 sbiw r24,0
2934 0bc6 F1F7 brne .L203

wykombinował sobie, że wartość zmiennej globalnej Licznik ma juz w
rejestrach R24:R25 i testuje sobie w pętli tylko zawartość tych
rejestrów zamiast faktycznej wartości zmiennej Licznik, która
zmniejszana jest w obsłudze przerwania.

Czy Ktoś z szanownych grupowiczów wie jak zmusić kompilator do robienia
pętli na zmiennej, a nie na rejestrach ? Może jakoś lokalnie
wyłaczyć/zmniejszyc optymalizację ?

Pozdrawiam
Grzegorz Kurczyk


Poprzedni Następny
Wiadomość
Spis treści
From: Tomasz Sliwa <tomsliwaXXX_at_nospam_XXXwp.pl>
Subject: Re: WinAVR =?ISO-8859-2?Q?przeoptymalizowa=B3_=3A-=29?=
Date: Fri, 01 Apr 2005 09:42:37 +0200




***************************
unsigned int Licznik;
volatile unsigned int Licznik;

Powinno pomoc.

Pozdrawiam
Tomek

Poprzedni Następny
Wiadomość
Spis treści
From: MarcinB <marcin.spamburzynski_at_nospam_post.spampl>
Subject: Re: WinAVR =?iso-8859-2?q?przeoptymalizowa=B3?= :-)
Date: Fri, 01 Apr 2005 09:42:44 +0200


On Fri, 01 Apr 2005 09:28:26 +0200, Grzegorz Kurczyk wrote:

Witam
Jest sobie taki fragment programu:

***************************
unsigned int Licznik;

SIGNAL(SIG_OUTPUT_COMPARE0) {
if (Licznik)
Licznik--;
}

int main(void) {
Licznik = 100;
while (Licznik);
}
***************************

oczywiście TIMER0 jest prawidłowo zainicjalizowany i tyka jak trzeba
problem jest z "while (Licznik)" w programie głownym, bo kompilator go
sobie "przeoptymalizował" :)

525:KodM32.c ** Licznik = 100; 2922
.LM298:
2923 0bb2 84E6 ldi r24,lo8(100) 2924 0bb4 90E0 ldi
r25,hi8(100) 2925 0bb6 9093 0000 sts (Licznik)+1,r25 2926 0bba 8093
0000 sts Licznik,r24 526:KodM32.c ** while
(Licznik); 2932 .L203:
2933 0bc4 0097 sbiw r24,0
2934 0bc6 F1F7 brne .L203

wykombinował sobie, że wartość zmiennej globalnej Licznik ma juz w
rejestrach R24:R25 i testuje sobie w pętli tylko zawartość tych
rejestrów zamiast faktycznej wartości zmiennej Licznik, która
zmniejszana jest w obsłudze przerwania.

Czy Ktoś z szanownych grupowiczów wie jak zmusić kompilator do
robienia pętli na zmiennej, a nie na rejestrach ? Może jakoś lokalnie
wyłaczyć/zmniejszyc optymalizację ?

Pozdrawiam
Grzegorz Kurczyk

My program doesn't recognize a variable updated within an interrupt
routine

When using the optimizer, in a loop like the following one:

uint8_t flag;
...

while (flag == 0) {
...
}

the compiler will typically optimize the access to flag completely away,
since its code path analysis shows that nothing inside the loop could
change the value of flag anyway. To tell the compiler that this variable
could be changed outside the scope of its code path analysis (e. g. from
within an interrupt routine), the variable needs to be declared like:

volatile uint8_t flag;

pozdr
--
MarcinB

Poprzedni Następny
Wiadomość
Spis treści
From: Grzegorz Kurczyk <mousetrap_at_nospam_control.slupsk.pl>
Subject: Re: WinAVR =?ISO-8859-2?Q?przeoptymalizowa=B3_=3A-=29?=
Date: Fri, 01 Apr 2005 09:50:44 +0200


Dzięki !!!
Już działa. Skleroza nie boli ;-)

Pozdrawiam

Poprzedni Następny
Wiadomość
Spis treści
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: WinAVR =?iso-8859-2?q?przeoptymalizowa=B3?= :-)
Date: 01 Apr 2005 09:42:53 +0200


On Fri, 01 Apr 2005 09:28:26 +0200, Grzegorz Kurczyk <mousetrap_at_nospam_control.slupsk.pl> wrote:
Witam
Jest sobie taki fragment programu:

***************************
unsigned int Licznik;
Zmień to na "volatile unsigned int Licznik;" i wszystko będzie dobrze.

Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: WinAVR przeoptymalizował :-)
Date: Fri, 1 Apr 2005 14:20:48 +0200


Grzegorz Kurczyk wrote:

To nie kompilator przeoptymalizował, tylko Ty narzuciłeś
na zmienną licznik zbyt słabe ograniczenia. To tak a propos
niedawnej dyskusji o C. :-)

Pozdrawiam
Piotr Wyderski

PS. właściwym rozwiązaniem jest zaproponowane już volatile.