ciekawa kompilacja

Apr 01, 2007 5 Replies

Szanowni porad¼cie co¶ bo szlag jasny trafi. Znam jêzyk C mo¿e nie jak haker ale sobie radzê, z tego tez powodu i tego ¿e C jest uznanym jêzykiem programowania zdecydowa³em siê na programowanie uProców (ATMEGA) w C. Okazuje siê ¿e znac jêzyk to piku¶, najciekawsze to nauczyæ siê ( i to dos³ownie) kompilatora. Ten skurczybyk nie daje mi spokoju. Co jaki¶ czas daje o sobie znaæ jego nieobliczalno¶æ. Jak tu pisaæ programy jak kompilator swoimi widzimisiami pieprzy (tak PIEPRZY) mi w kodzie. Dla przyk³adu:



while(1) { alarm=204; lcdliczba(alarm); _delay_ms(200); lcdliczba(178); _delay_ms(210); _delay_ms(230); beep(); }


Pêtla nieskoñczona,powiem tylko ¿e lcdliczba to procedura z moich obs³uguj±cych LCD 2x16 wy¶wietlaj±ca liczbê, na koñcu buzzer pipczy. Dzia³a to tak ¿e na LCD-ku dostajê 204 które sobie mruga ( a w³a¶ciwie faluje bo przy takich szybkich zmianach tak to wygl±da). i nic wiêcej. Wiêc pytam JAKIM KURCZE PRAWEM !!! Oczywi¶cie jak wypierniczê optymalizacjê (domy¶lne "s" zmianiam na "0") to leci dwie liczby jedna za drug± i pipczy mi buzzer wiêc dzia³a tak jak powinien. Dodam ¿e ¿adne po¶rednie opcje optymalizacji nie dzia³aj± - tylko ca³kowite wy³±czenie. Czy jest jaki¶ sposób na takie pisanie kodu ¿eby ten wariat kompilator mi nie pitoli³? Wy³±czenie optymalizacji wiadomo nie wchodzi w grê bo kod siê robi w cholerê du¿y. £atwiej siê pisze w C szczególnie co¶ wiêkszego ale widzê ¿e jednak assembler rz±dzi.


Rafa³



Kacper snipped-for-privacy@gazeta.pl pisze:

Z avr/delay.h

The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz).

The maximal possible delay is 262.14 ms / F_CPU in MHz.

Zast±p te _delay_ms(230); na kilka mniejszych delayów i powinno byæ git.

Ano w³a¶nie zapomnia³em dodaæ ¿e Atmel leci na zegarze wew. 1MHz wiêc dzielenie nic nie zmieni. Poza tym dlaczego dzia³a³oby bez optymalizacji a przy w³±czonej ju¿ nie. No i ostatecznie przy b³êdzie spowodowanym opó¿nieniem nie dzia³a³by LCD bo tam te¿ czasy regulujê z delay.h Zatem to nie opó¼nienia. Je¿eli zmieniaj±c ustawienia optymalizacjiprogram dzia³a albo nie to chyba tu trzeba szukaæ przyczyny.

Rafa³

Zobacz jaki kod assemblera został wygenerowany przez kompilator. Możliwe że gdzieś zapomniałeś o volatile. Optymalizator zadziałał jak najbardziej poprawnie: przyspieszył działanie programu ;).

Jeżeli chcesz aby coś nie zostało zoptymalizowane to musisz dawać volatile.

Czy mo¿na jako¶ blokowaæ obszary ktorych ma nie optymalizowaæ, czy dotyczy do tylko zmiennych. Dotychczas stosowa³em volatile do zmiennych, a mo¿na jako¶ szerzej?

Rafa³

PS. A przy okazji jak deklarowaæ zmienne których chcê u¿ywaæ w programie g³ównym i podprocedurach? Sprawdza³em ju¿ volatile i dzia³a³o ale nie wiem czy to poprawnie.

U¿ytkownik "Maksymilian Dutka" snipped-for-privacy@usunpoczta.onet.pl> napisa³ w wiadomo¶ci news:euqbp2$soj$ snipped-for-privacy@nemesis.news.tpi.pl...

Kacper napisał(a):

O ile pamiętam można też przed funkcjami dopisywać. Inne metoda to rozbić projekt na kilka plików "C" i nie wszystkim włączać optymalizację. Problemy po optymalizacji przeważnie wynikają z tego iż jednak jest coś nie tak w kodzie, posprawdzaj czy gdzieś nie wychodzisz poza tablice itp. Kod po optymalizacji wygląda inaczej i czasem dopiero wtedy wychodzą jakieś błędy zrobione w kodzie.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required