WinAVR przeoptymalizował :-)

Apr 01, 2005 5 Replies

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


volatile unsigned int Licznik;

Powinno pomoc.

Pozdrawiam Tomek

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

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

Regards, /J.D.

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

Pozdrawiam

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.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required