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



Teraz jest 25 sty 2026, o 07:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 20 cze 2016, o 11:31 
Offline
Nowy

Dołączył(a): 19 kwi 2014
Posty: 18
Pomógł: 0

Czy może mi ktoś wytłumaczyć taką rzecz.

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

Powoduje to zarezerwowanie w pamięci ram 1 bajta. To dla mnie jest jasne i logiczne.

Natomiast użycie tej zmiennej w funkcji main powoduje zajęcie 4 bajtów flash. Przynajmniej o tyle zwiększa się program po kompilacji.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Tu właśnie troszkę zgłupiałem.
Z góry dziękuje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2016, o 12:20 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Użycie zmiennej musi powodować zajęcie pamięci flash, bo tam właśnie są zapisane operacje, które ma wykonać mikrokontroler. W tym przypadku będzie to prawdopodobnie instrukcja STS kopiująca zawartość rejestru do odpowiedniej komórki pamięci. Zajmuje ona dwa słowa 16-bitowe, czyli 4 bajty.

Dlaczego przypisanie niezerowej wartości zajmuje więcej pamięci flash? Otóż kompilator avr-gcc przechowuje (prawie) cały czas wartość zerową w rejestrze R1, więc jeśli przypisujemy zmiennej wartość zerową, ma ją gotową w rejestrze R1. Wystarczy ją przepisać do odpowiedniej komórki pamięci RAM. Kiedy przypisujemy zmiennej wartość różną od zera, musi ona być najpierw wpisana do któregoś z rejestrów, a dopiero później skopiowana do RAM. Stąd jedna instrukcja (słowo 16-bitowe, czyli 2 bajty) więcej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2016, o 12:57 
Offline
Moderator
Avatar użytkownika

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

andrews napisał(a):
Użycie zmiennej musi powodować zajęcie pamięci flash, bo tam właśnie są zapisane operacje, które ma wykonać mikrokontroler. W tym przypadku będzie to prawdopodobnie instrukcja STS kopiująca zawartość rejestru do odpowiedniej komórki pamięci. Zajmuje ona dwa słowa 16-bitowe, czyli 4 bajty.


Nie o to chodzi ;) sprawa jest banalnie prosta

Jeśli definiujesz zmienną albo stałą dosłowną w RAM, no to nie ma co się dziwić, że zostanie na to zmarnowany FLASH ;)

Bo jak myślicie - skąd się później ma wziąć ta wartość w zmiennej ? NO MUSI być gdzieś przechowana w pamięci FLASH prawda ? i to z tej pamięci w prologu przed funkcją main (w jednej z funkcji inicjalizacyjnych) są przypisywane dane

dlatego też początkujący często się dziwią - w takim obrazowym bardziej przykładzie , gdy napiszą sobie

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


czyli stworzyliśmy właśnie stałą dosłowną a dokładniej mówiąc literał w pamięci RAM "jakis tekst" .... A przecież on się sam nie zalęgnie w pamięci RAM :lol: .... dlatego kompilator najpierw pakuje taki sam tekst do FLASH aby w prologu przed main - zapisać go do RAM - żeby mógł zadziałać w tej linii programu czyli ?


.... czyli MARNUJEMY nie tylko pamięć RAM ale i FLASH

wtedy gdy zrobimy to tak

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


to wyświetlamy ten sam tekst ale już z pamięci FLASH i w ogóle nie tracimy pamięci RAM....

Dlatego trzeba zrozumieć - że podobnie jest ze zmiennymi liczbowymi i stałymi dosłownymi bo przykład z góry


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


i pytanie autora pokazuje fakt, że autor na razie KOMPLETNIE nie zdaje sobie sprawy z tego:

1. co to są zmienne globalne
2. że zmienne globalne inicjowane są ZEREM i nie trzeba ich zerować w programie .... dlaczego ? Ano dlatego, że to zerowanie robione jest tu programowo i pójdzie na to kilka bajtów jak widać

3. że przypisanie wartości innej niż ZERO będzie wymagało - umieszczenie tej wartości przecież w pamięci FLASH i jej przypisanie w tej linii stąd jeszcze więcej bajtów tracisz

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

_________________
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: 20 cze 2016, o 13:50 
Offline
Nowy

Dołączył(a): 19 kwi 2014
Posty: 18
Pomógł: 0

Co do zerowania.
Wiem, że zmienne globalne inicjowane są zerem. W moim programie zeruję flagę w przerwaniu, po uprzednim przypisaniu jej wartości 1 w pętli głównej.

Dziękuje jednak za wyjaśnienie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2016, o 14:00 
Offline
Moderator
Avatar użytkownika

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

pawkrol napisał(a):
Wiem, że zmienne globalne inicjowane są zerem. W moim programie zeruję flagę w przerwaniu

Ta wypowiedź pokazuje że nie wiesz do końca co to znaczy, że zmienne globalne inicjalizowane są zerem ... więc doprecyzuję ;)

KAŻDA zmienna globalna - zanim odpali się główna funkcja programu main() ... jest ZEROWANA przez program inicjalizacyjny i nie ma to NIC WSPÓLNEGO z tym, że ty zerujesz czy tam jakkolwiek ustawiasz tę zmienną w przerwaniu, czy poza przerwaniem.... to nie istotne.... Z punktu widzenia programu, który piszesz to DWIE CAŁKIEM inne operacje, bo nad zerowaniem zmiennych globalnych nie masz kontroli - ona ZAWSZE się odbędzie. A to co ty robisz ze zmienną gdzieś w swoim kodzie - nie ważne gdzie to jak mówiłem CAŁKIEM inna rzecz i nie ważne czy ją zerujesz czy co tam do niej zapisujesz

mam nadzieję, że teraz jaśniej

_________________
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: 20 cze 2016, o 14:11 
Offline
Nowy

Dołączył(a): 19 kwi 2014
Posty: 18
Pomógł: 0

Tak. Bardzo dziękuję za obszerne wytłumaczenie.

Wysłano z Mi4c



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2016, o 15:29 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

mirekk36 napisał(a):
Nie o to chodzi sprawa jest banalnie prosta

A ja wiem na pewno, że o to chodzi.

Różnica 4 bajtów w zajętości flash po dopisaniu w funkcji mian():
flaga=0;
i 6 bajtów po dopisaniu w funkcji main():
flaga=1;
o której pisał autor w pierwszym poście, wynikają dokładnie z tego, co napisałem. Można zrobić próbę (zmienna jako volatile, żeby kompilator nie zoptymalizował): skompilować kod z przypisaniami i bez, i sprawdzić w pliku *.lss

To, że stałe, które wpisujemy do zmiennych muszą być zapisane we flash to też oczywista sprawa. W tym przypadku akurat stała o wartości 1 przypisywana do zmiennej 'flaga' będzie zawarta w instrukcji LDI, więc nie zajmie jakiegoś dodatkowego miejsca. Niemniej po każdym przypisaniu jest generowany kod, który to przypisanie musi zrealizować, a który też jest zapisywany we flash.

mirekk36 napisał(a):
Jeśli definiujesz zmienną albo stałą dosłowną w RAM, no to nie ma co się dziwić, że zostanie na to zmarnowany FLASH

Ale umieszczenie stałej 1-bajtowej w pamięci flash na pewno nie zajmie 4 czy 6 bajtów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2016, o 16:07 
Offline
Moderator
Avatar użytkownika

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

andrews napisał(a):
A ja wiem na pewno, że o to chodzi.

A czepiasz się słówek, bo ty opowiadasz komuś kto zaczyna, i pewnie jeszcze nie zna asemblera, czyli np instrukcji STS, LDI i innych tam ;) a ja wyjaśniam to obrazowo i jedno z drugim się nie kłóci ani ja nie zaprzeczam tobie ;) ... I nawet nie zamierzam na takim etapie wyjaśnień wgłębiać się w plik *.lss bo jest to zupełnie niepotrzebne - warto jedynie zrozumieć o co chodzi w ogólnych regułach działania kompilatora - a nie w tym czy tam jest STS czy LDI czy co innego ;)

------------------------ [ Dodano po: 1 minucie ]

andrews napisał(a):
Ale umieszczenie stałej 1-bajtowej w pamięci flash na pewno nie zajmie 4 czy 6 bajtów.


jak wyżej ;) .... co to ma za znaczenie ? chcesz ze mną o asemblerze porozmawiać czy pomóc autorowi w tak podstawowym pytaniu ? ;)

_________________
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: 20 cze 2016, o 16:49 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Różnica 4 czy też 6 bajtów wynika z tego, że kompilator wygenerował kod, który musi zrealizować przypisanie wartości do zmiennej wpisane w funkcji main(). Tak też wytłumaczyłem autorowi pytania zgodnie z prawdą.

Stwierdzenie "nie o to chodzi" to zarzut, że moje wytłumaczenie było nieprawidłowe.

mirekk36 napisał(a):
A czepiasz się słówek..

Być może, ale niektóre słówka są bardzo istotne ;)

mirekk36 napisał(a):
bo ty opowiadasz komuś kto zaczyna, i pewnie jeszcze nie zna asemblera, czyli np instrukcji STS, LDI

mirekk36 napisał(a):
chcesz ze mną o asemblerze porozmawiać czy pomóc autorowi w tak podstawowym pytaniu ? :)

Nie. Chciałem wytłumaczyć autorowi, skąd dokładnie wzięła się różnica w zajętości flash, o której pisał i miałem wrażenie, że zrobiłem to dobrze ;). Zakładam, że jeśli będzie dociekliwy (a odnoszę wrażenie, że jest) i czegoś nie zrozumie, to może zawsze zadać dodatkowe pytanie lub poszukać informacji gdzie indziej. Może się przy okazji czegoś dowie, nauczy... Poza tym miałem nadzieję, że czytają to forum też mniej początkujący i lepiej znający temat, których zainteresuje to, co napisałem.

No ale skoro nie tłumaczę wystarczająco obrazowo (bo na pewno nie błędnie), to postaram się w przyszłości powstrzymać od odpowiedzi ;)

Pozdrawiam

PS. ...i tak na wszelki wypadek: ja się nie obrażam, za stary na to jestem i już mi się nie chce :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2016, o 17:11 
Offline
Moderator
Avatar użytkownika

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

andrews napisał(a):
PS. ...i tak na wszelki wypadek: ja się nie obrażam, za stary na to jestem i już mi się nie chce

Ja też już chyba jestem za stary na takie obrażanie się - i myślę, że znowu nieco omylnie zrozumiałeś moje słowa

andrews napisał(a):
Stwierdzenie "nie o to chodzi" to zarzut, że moje wytłumaczenie było nieprawidłowe.


Może trochę zbyt skrótowo napisałem "nie o to chodzi" ale kompletnie nie miałem na myśli, że nie masz racji i dlatego wyżej to wyjaśniałem precyzyjnie ;) co miałem na myśli ... a jeśli źle mnie zrozumiałeś to bardzo cię przepraszam, bo kompletnie nie chodziło mi o sugerowanie, że nie masz racji tylko ja inaczej podszedłem do wyjaśnień. Szkoda już nawet dalej mielić ten temat bo teraz to autor dostał i uproszczone wyjaśnienie a na dodatek jeszcze mega precyzyjne bo w asemblerze prawie ;)

andrews napisał(a):
No ale skoro nie tłumaczę wystarczająco obrazowo (bo na pewno nie błędnie), to postaram się w przyszłości powstrzymać od odpowiedzi

Proszę cię ... proszę - no mam nadzieję, że teraz cię przekonałem co miałem na myśli ok ?

_________________
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: 20 cze 2016, o 17:25 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Napisałem przecież, że się nie obrażam, i to jest prawdą.

Jeśli chodzi o resztę mojej wypowiedzi, to nie wszystko tak do końca pisałem całkiem poważnie ;)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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