WinAVR przeoptymalizował :-)

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

Reply to
Grzegorz Kurczyk
Loading thread data ...

volatile unsigned int Licznik;

Powinno pomoc.

Pozdrawiam Tomek

Reply to
Tomasz Sliwa

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

Reply to
MarcinB

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

Regards, /J.D.

Reply to
Jan Dubiec

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

Pozdrawiam

Reply to
Grzegorz Kurczyk

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.

Reply to
Piotr Wyderski

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.