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



Teraz jest 29 sty 2025, o 11:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 19 maja 2013, o 12:56 
Offline
Użytkownik

Dołączył(a): 31 paź 2012
Posty: 99
Pomógł: 4

Witam.

W ubiegłą środę dotarł do mnie prosto z Hongkongu programatorek więc jak to Mirek mówi , aż mnie ręce świerzbiły żeby sprawdzić czy działa . Zmontowałem więc na kolanie układ z ATmegą 32 którego schematu nie będę prezentował gdyż go po prostu nie mam , 16 LED podpięte do portów A i C i to tyle , wszystko pięknie działa , że miło popatrzeć .

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


kompilując powyższy kod otrzymuję :

AVR Memory Usage
----------------
Device: atmega32

Program: 254 bytes (0.8% Full)
(.text + .data + .bootloader)

Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)

Finished building: sizedummy

wystarczy jednak , że w liniach 36 i 52 usunę komentarze czyli

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


i po kompilacji otrzymuję :

AVR Memory Usage
----------------
Device: atmega32

Program: 4308 bytes (13.1% Full)
(.text + .data + .bootloader)

Data: 264 bytes (12.9% Full)
(.data + .bss + .noinit)

Finished building: sizedummy

Więc moje pytanie dotyczy tej właśnie zajętości pamięci , w jaki sposób ta jedna instrukcja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

powoduje taki jej przyrost ?

Czy jest to typowy objaw czy jednak czegoś nie wiem i robię coś źle ?
Będę wdzięczny za każdą podpowiedź .



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

Dołączył(a): 10 sty 2013
Posty: 844
Lokalizacja: Przemyśl
Zbananowany użytkownik

Pomógł: 43

Delay tak ma...

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


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


u mnie wyszedł taki wynik:
Cytuj:
Device: atmega32

Program: 318 bytes (1.0% Full)
(.text + .data + .bootloader)

Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)


Ale zaznaczam że też dopiero uczę się :P Zresztą, podobny program napisałem niedawno ;)

_________________
Klimatyzacja Przemyśl



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

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Raczej błąd kompilatora. Przyrost pamięci mógłby być tak duży, gdybyś używał floatów (czego nie polecam w AVR).

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



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

Dołączył(a): 10 sty 2013
Posty: 844
Lokalizacja: Przemyśl
Zbananowany użytkownik

Pomógł: 43

Ledes: u mnie był taki sam wynik przed zmianą:

Obrazek

_________________
Klimatyzacja Przemyśl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2013, o 13:40 
Offline
Użytkownik

Dołączył(a): 31 paź 2012
Posty: 99
Pomógł: 4

Dzięki janeczqu , ale bardziej chodzi mi o wyjaśnienie dlaczego tak jest niż zastępowanie inna konstrukcją .

Ledes nie wydaje mi się aby był to błąd kompilatora .



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

Dołączył(a): 10 sty 2013
Posty: 844
Lokalizacja: Przemyśl
Zbananowany użytkownik

Pomógł: 43

No własnie według mnie program tyle "bierze" sobie z powodu przekazywania zmiennej jako argument do delay. Ale to mądrzejsi muszą się wypowiedzieć :P

_________________
Klimatyzacja Przemyśl



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

Dołączył(a): 31 paź 2012
Posty: 99
Pomógł: 4

janeczqu napisał(a):
No własnie według mnie program tyle "bierze" sobie z powodu przekazywania zmiennej jako argument do delay. Ale to mądrzejsi muszą się wypowiedzieć :P


ale w pierwszym przypadku też przekazuję zmienną a do delay i program zajmuje mało , dopiero a=a+10; zwiększa objętość .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2013, o 14:30 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 02 sty 2013
Posty: 11
Pomógł: 1

u mnie po skompilowaniu programu wystąpił błąd
Cytuj:
c:\program files\atmel\avr tools\avr toolchain\bin\../lib/gcc/avr/4.6.2/../../../../avr/include/util/delay.h:164:28: error: __builtin_avr_delay_cycles expects an integer constant.
make: *** [main.o] Error 1

co w wolnym tłumaczenie z pana google brzmi: oczekuje stałą całkowitą.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2013, o 14:35 
Offline
Użytkownik

Dołączył(a): 24 kwi 2013
Posty: 454
Pomógł: 30

@pagosa747
Widocznie kompilator wykminił, że skoro nie ingerujesz w zmienną, to sobie ją zamieni na stałą.



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

Dołączył(a): 10 sty 2013
Posty: 844
Lokalizacja: Przemyśl
Zbananowany użytkownik

Pomógł: 43

Tylko że w pierwszym przypadku "a" jest traktowana przez kompilator (tak przynajmniej mi się wydaje) jako stała.
Dopiero drugi program z pierwszego postu sprawia że na "a" są wykonywane działania i może ona (i ma) różne wartości. Ale to już trzeba któregoś guru pytać.

_________________
Klimatyzacja Przemyśl



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

Dołączył(a): 29 maja 2012
Posty: 47
Pomógł: 5

Jedno wywołanie Delay (ze stałym parametrem) po kompilacji z optymalizacją kodu zajmuje jakieś 12-18 bajtów (kilka instrukcji asm). Zawsze to jedno wywołanie delay będzie zajmować te kilkanaście bajtów - nawet w pętli (o ile delay ma stały parametr!).

Jednak jeśli taki delay w pętli ma zmienny parametr i przy każdej iteracji pętli, ten parametr delaya będzie się zmieniać, to tyle razy ile parametr delay zmieni się - tyle razy nadmiarowo w kodzie zostanie nadpisane 18 bajtów delaya.

Dodatkowo dochodzi tutaj jeszcze chyba taka kwestia, że ten drugi przypadek nawet nie da się skompilować z optymalizacją i trzeba go kompilować bez optymalizacji. Przynajmniej u mnie wyskakuje błąd przy kompilacji z optymalizacją:
Kod:
In file included from ../main.c:10:0:
/usr/lib/gcc/avr/4.5.3/../../../avr/include/util/delay.h: In function ‘main’:
/usr/lib/gcc/avr/4.5.3/../../../avr/include/util/delay.h:153:28: error: __builtin_avr_delay_cycles expects an integer constant.
/usr/lib/gcc/avr/4.5.3/../../../avr/include/util/delay.h:153:28: error: __builtin_avr_delay_cycles expects an integer constant.
/usr/lib/gcc/avr/4.5.3/../../../avr/include/util/delay.h:153:28: error: __builtin_avr_delay_cycles expects an integer constant.
/usr/lib/gcc/avr/4.5.3/../../../avr/include/util/delay.h:153:28: error: __builtin_avr_delay_cycles expects an integer constant.
make: *** [main.o] Błąd 1



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2013, o 15:51 

Pomógł: 0

W manualy do biblioteki AVR'ków jest informacja o tym, że delay musi być kompilowany z optymalizacją i wartość delay'a musi być znana i stała w czasie kompilacji. Inaczej funkcja nie będzie działała prawidłowo a kod programu dostanie "wzdęcia" bo zostaną dołączone biblioteki od operacji zmiennoprzecinkowych.

Dokładny cytat: "In order for these functions to work as intended, compiler optimizations must be enabled, and the delay time must be an expression that is a known constant at compile-time. If these requirements are not met, the resulting delay will be much longer (and basically unpredictable), and applications that otherwise do not use floating-point calculations will experience severe code bloat by the floating-point library routines linked into the application."

Źródło: http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html


Autor postu otrzymał pochwałę


Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2013, o 17:14 
Offline
Użytkownik

Dołączył(a): 31 paź 2012
Posty: 99
Pomógł: 4

pagosa747 napisał(a):
Czy jest to typowy objaw czy jednak czegoś nie wiem i robię coś źle ?
Będę wdzięczny za każdą podpowiedź .


wwojtek jak widzę czegoś jednak nie wiedziałem dzięki za wyjaśnienie .

------------------------ [ Dodano po: 53 minutyach ]

Poprawiony kod wygląda następująco

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


i teraz po kompilacji

AVR Memory Usage
----------------
Device: atmega32

Program: 318 bytes (1.0% Full)
(.text + .data + .bootloader)

Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)

Finished building: sizedummy

**** Build Finished ****

czyli całkiem przyzwoicie

przy okazji tylko taka uwaga do janeczqu warunek powinien być taki
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Poza tym patrzę na te migające diody już trzeci dzień i nie mogę się nacieszyć :)

Tyle frajdy z niczego hehe



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2013, o 21:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 sty 2013
Posty: 844
Lokalizacja: Przemyśl
Zbananowany użytkownik

Pomógł: 43

Cytuj:
przy okazji tylko taka uwaga do janeczqu warunek powinien być taki


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


na swoje usprawiedliwienie napiszę tylko że sam jestem początkujący... :oops:

_________________
Klimatyzacja Przemyśl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 maja 2013, o 22:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

No to teraz do pracy z timerami :) i wyrzucamy delay :)

_________________
sig off ;(



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: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO