Jak wyłączyć optymalizację kompilatora WinAVR dla pętli z zmienną globalną?
WinAVR =?ISO-8859-2?Q?przeoptymalizowa=B3_=3A-=29?=
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
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
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
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
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
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.