Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 25 kwi 2024, o 02:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 19 lis 2013, o 01:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 lip 2013
Posty: 143
Pomógł: 1

Bawiłem się dzisiaj różnymi funkcjami bibliotecznymi i sprawdzałem ilość zużywanej przez nie pamięci :)

Wpisując :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

kompilator grzecznie kulturalnie wyrzucił (dla ATMega8):
Program: 100 bytes (1.2% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)

ale kiedy w funkcji _delay_ms() użyłem wyrażenia:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

kompilator poinformował mnie że zjadł pół procesora :lol:
Program: 3640 bytes (44.4% Full)
(.text + .data + .bootloader)
Data: 264 bytes (25.8% Full)
(.data + .bss + .noinit)
Pewnie większość osób to wie ale ja osobiście byłem w głębokim szoku... Cały "program" miał może 20 linii kodu.... Myślę że dla początkujących jak ja przypadkowe zastosowanie funkcji w ten sposób byłoby niezłą zagadką :shock: Program w assemblerze ma 1800 linii podczas gdy program w którym wykorzystuję enkoder,lcd2x16,IR i rozbudowane menu tmf'a zajmuje 1400 :o

PS. kolejny argument żeby bibliotekę delay.h omijać szerokim łukiem :roll:

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 07:17 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27225
Lokalizacja: Szczecin
Pomógł: 1041

Ale natknąłeś się na to co niestety przechodzi z bólem każdy początkujący w C a nie wiesz o pewnej oczywistej rzeczy, którą po raz kolejny wytłumaczę ... bo pewnie w Bluebooku umknęło ? ;)

Do funkcji opóźniających typu _delay_xx() w AVR GCC przekazujemy TYLKO I WYŁĄCZNIE stałe dosłowne. Co ciekawe mogą to być wtedy nawet liczby zmiennoprzecinkowe np: 0.3 ;)

Pod żadnym pozorem nie można używać zmiennych a szczególnie jeszcze robić takich obliczeń w nawiasach w miejscu argumentu ;) ... dlaczego i skąd się bierze nagle takie zwiększenie objętości kodu ? ... to dość proste ....

otóż argumentem funkcji jest liczba zmiennoprzecinkowa - która jednak, gdy podamy ją w postaci stałej dosłownej zostaje zawsze zamieniona przez kompilator na liczbę całkowitą i dzięki temu kompilator nie musi dociągać biblioteki do obsługi liczb zmiennoprzecinkowych ;) to stąd następuje taki przyrost kodu .... Przez dociągnięcie tej biblioteki - stąd podstawowy wniosek że przede wszystkim należy unikać jak ognia liczb zmiennoprzecinkowych - szczególnie w małych prockach .....

No zwykle w tym momencie ktoś się dziwi - to jak to ? w takim razie jak uzyskać zmienną ilość opóźnienia jeśli nie można zastosować zmiennej jako argument - ano można można .... ale z kolei tak (też ten sposób już niejednokrotnie pokazywałem na forum nie tylko w książce) ;) zobacz:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


jak widzisz wystarczy jedna mała funkcja i po zawodach ;) wtedy możesz jej użyć tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


bez obaw że ci kod przyrośnie i będzie się coś źle działo.


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 10:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 paź 2013
Posty: 62
Pomógł: 2

Prawda!
Dzięki tej malutkiej funkcji upchnąłem w jednym ze swoich początkujących programów 3 (słownie TRZY) zmienne opóźnienia i zmieściłem się z tym w ATTINY13 :D
my_delay ( u mnie zwana opozniarka :D) częto ratuje życie :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 11:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 lip 2013
Posty: 143
Pomógł: 1

generalnie staram się nigdy tej biblioteki nie używać bo poznany dzięki Tobie Mirku mechanizm timerów programowych jest równie prosty w obsłudze a ma charakter nieblokujący :) nie sposób zapamiętać niestety każdego słowa z książki nawet jeśli czyta się ją kilka razy od deski do deski :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 11:26 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27225
Lokalizacja: Szczecin
Pomógł: 1041

krzysztof napisał(a):
nie sposób zapamiętać niestety każdego słowa z książki nawet jeśli czyta się ją kilka razy od deski do deski


Ależ to zrozumiałe i dlatego opisałem to jeszcze raz - co za problem ;) im częściej to się na forum pojawi tym częściej ktoś trafi na to ;)

A jeśli chodzi o delaye to jak najbardziej najlepiej ich unikać jak ognia. Nie mniej z nimi jest tak jak np z alkoholem ;) też jest dla ludzi ale trzeba stosować z umiarem i z głową ;)

Myślę, że kiedyś pokażę taką ciekawostkę ... jak z delaya zrobić prawie timer programowy :lol: .... oczywiście to będzie proteza i nie warto tego stosować na co dzień szczególnie rozumiejąc już normalne timery programowe - ale myślę że takie inne spojrzenie na pewne podejście do zagadnienia - zawsze pomoże komuś inaczej bądź lepiej zrozumieć co oznacza "NIEBLOKUJĄCY charakter" funkcji itp ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 14:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

Genialne w swej prostocie :) ! Nie używam co prawda delay, ale warto wiedzieć co tam siedzi i jak to obejść, a przy okazji stosowanie makr mi się utrwala ;)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 16:46 
Offline
Użytkownik

Dołączył(a): 10 lip 2013
Posty: 93
Lokalizacja: Puławy
Pomógł: 0

Ok a jak działa ta funkcja delay()?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jest lepsza? Co to robi? :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2013, o 17:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1960
Lokalizacja: Lipsko
Pomógł: 125

NOP w asemblerze to znaczy nic nie rób i zajmuje to 1 cykl zegarowy. Warunek While będzie wykonywany tyle razy ile będzie zawierać zmienna n plus parę cykli na obsługę samej pętli. Takie coś potrzebne jest już do bardzo dokładnych wyliczeń. Pamiętam jak mozolnie w Commodore+4 dobierałem ilość NOP żeby wyjść z obrazem poza ramkę obrazu czyli zamiast oryginalnych 25 lini uzyskałem 33(!) linie tekstowe. Każdy NOP był tam na wagę złota, bo inaczej wszystko się rozjeżdżało i nie było synchronizacji.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 10 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO