dziwne zachowanie WINAVR czyli AVR-GCC

Feb 17, 2004 6 Replies

witam,



wczoraj sciagnelem najnowsza wersje ze strony, napisalem prosty programik na AT90S8535, ustawilem licznik aby przepelnialo sie 1000/sec dopisalem odp. procedurke ujmuj±c± a w niej if ( DELAY ) DELAY--;



to dzia³a , ale , potem mam funkcje :



void delay(unsigned int time ) { DELAY=time; while(DELAY); }



i teraz, dziwna sprawa polega na tym, ze jak skompiluje bez optymizacji , to funjca delay dziala, natomiast jesli skompiluje z parametrem " -O3 " to mimo tego, ze w DELAY jest wartosc zero, nie chce wyjsc z petli while. Troche tego nie rozumiem.



debugowalem dwoma programami : avr-studio v4.07 i vmlab w obydwu mialem takie same objawy.


jak zadeklarowales DELAY?

j.

Piter wrote: ...

A podglądałeś wygenerowany kod? IMHO ta pętla jest przez kompilator zupełnie usuwana (co jest zgodne z dokumentacją).

BTW> dlaczego nie używasz gotowych funkcji _delay_loop_1 lub _delay_loop_2

Pozdrawiam,

nie - tego nie robilem, wiedzialem ze cos za duzo usuwa, lecz nie wiedzialem dlaczego - dalej nie wiem, jak mozna usunac tak± funkcje ?

hmm, trudno powiedziec, chyba ich nie znam, dopiero sie ucze - raczkuje

DELAY jest zadeklarowane globalnie tez jako "unsigned int"

zadelkaruj DELAY jako volatile unsigned int. To powinno powstrzymac kompilator od nadmiernej optymalizacji

j.

A dlaczego nie, przecież z punktu widzenia kompilatora nic sensownego nie robi oprócz zmieniania wartości jakiejś zmiennej, która jest dalej nie używana (i nie jest volatile). Kuknij do dokumentacji GCC opisującej co może zrobic kompilator na poszczególnych poziomach optymalizacji.

Przyzwyczaj się też, że oglądanie wyprodukowanego assemblera będzie normalną praktyką (avr-objdump twoim przyjacielem 8-).

Jak to mówią - najlepiej się uczyć na cudzych błędach 8-) Twój problem (plus jego odmiana z "niewidzeniem" zmian wykonanych przez obsługę przerwania w wartosci zmiennych globalnych) pojawia się średnio raz na tydzień na forum AVR-GCC na AVRFreaks. Tak zwany "problem" volatile występuje równiez jako FAQ #1 w dokumentacji avr-libc.

Pozdrawiam,

tak - racja, doskokowy internet ma w tym przypadku duze wady z ktorymi musze sie pogodzic i mêczyæ.

dzieki za wszystkie odpowiedzi - wieczorkiem wzmagan C.D.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required