Kacper
Guest
Sun Apr 01, 2007 8:39 pm
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ł
Patryk Sielski
Guest
Sun Apr 01, 2007 9:23 pm
Kacper <elkacper@gazeta.pl> pisze:
Quote:
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.
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.
--
Pozdrawiam,
Patryk Sielski
http://www.usprawnienia.pl
Kacper
Guest
Mon Apr 02, 2007 7:48 am
Quote:
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.
--
Pozdrawiam,
Patryk Sielski
http://www.usprawnienia.pl
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ł
Maksymilian Dutka
Guest
Mon Apr 02, 2007 8:31 am
Quote:
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.
(...)
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.
--
Pozdrawiam
Maksymilian Dutka
Kacper
Guest
Mon Apr 02, 2007 9:31 am
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" <maxdutka@usunpoczta.onet.pl> napisał w
wiadomości news:euqbp2$soj$1@nemesis.news.tpi.pl...
Quote:
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.
(...)
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.
--
Pozdrawiam
Maksymilian Dutka
Maksymilian Dutka
Guest
Mon Apr 02, 2007 1:04 pm
Kacper napisał(a):
Quote:
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?
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.
--
Pozdrawiam
Maksymilian Dutka