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



Teraz jest 26 lut 2025, o 00:26


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 2 lis 2016, o 13:52 
Offline
Użytkownik

Dołączył(a): 09 mar 2014
Posty: 26
Pomógł: 0

Witam :) .
Na początek, jestem początkujący i dopiero od miesiąca stawiam pierwsze kroki w pisaniu programów ale dzięki BB, są to dość spore kroki.
Kawał dobrej roboty Panie Mirku :)
Muszę jeszcze tylko zrobić sobie streszczenie, do którego będzie można szybko sięgnąć i znaleźć potrzebne rzeczy, ale nie o tym...

Jak do tej pory przerobiłem kilka razy same podstawy C a teraz piszę, kombinuję i przerabiam przykłady z książki i zrodziło się kilka pytań.
Z góry przepraszam jeśli użyłem niefachowej terminologii lub coś pokręciłem.

1. Jak wiadomo zmienne globalne zawsze automatycznie inicjowane są wartością 0. To jest fakt oczywisty i niezaprzeczalny.
Jestem praktykiem i łatwiej mi coś zapamiętać jeśli sprawdzę to „namacalnie”.
Utworzyłem sobie tablicę (zakres globalny) a w funkcji głównej programu napisałem algorytm, który na wyświetlaczu co 1s wyświetla wartość poszczególnych elementów tablicy.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

- Dla pamięci RAM oczywiście wszystkie komórki przyjęły wartość 0.
- Dla pamięci FLASH komórki przyjęły wartość 0.
- Dla pamięci EEPROM i tu niespodzianka, poszczególne elementy tablicy przyjęły zupełnie przypadkowe wartości.

Zacząłem szukać przyczyny.
Upload EEPROM image ustawione na form build.
W fusach EESAVE odznaczone, zresztą sprawdzałem obie opcje.
Używam nowy Atmel toolchain, środowisko Eclipse, mkAVR Calculator, ATMEGA32, zestaw ATB 1.03.
Oczywiście to nie jest jakiś poważny problem, napisałem sobie prosty algorytm który poprzez przycisk kasuje zawartość tej tablicy. Potem wszystko działa poprawie.
Zastanawia mnie tylko dlaczego tak jest ?.

2. Panie Mirku co Pan myśli o wykonywaniu kopi zapasowej do pamięci EEPROM mikrokontrolera w razie utraty zasilania oraz dodatkowo co 12h (tak na wszelki wypadek gdyby po kilku latach podtrzymanie zwiodło).
Czytając Pana wypowiedź na jednym z postów http://forum.atnel.pl/topic5370.html odniosłem wrażenie, że raczej jeśli są to bardzo ważne dane to, jest Pan raczej sceptyczny do tego typu rozwiązań. Możliwe że odniosłem złudne wrażenie.
Cytuj:
Chodzi mianowicie o to że po pierwsze - jeśli już trzymać dane w eeprom, to bezwzględnie trzeba pamiętać o fusebitach od BODLEVEL i utrzymywać odpowiedni poziom napięcia ... bo ? ... no bo możemy stracić zawartość eeprom .... Jeśli będziemy używać procka w jakichś szczególnie skrajnych warunkach pracy - no chociażby w aucie to nawet pomimo ustawionego Bodlevela i tak się nieraz przejedziemy na tym, że dane polecą w kosmos .... Ale to już każdy pewnie sam się musi o tym przekonać na własnej skórze

Czy w tym procesorze (ATMEGA1284-PU) również może się zdarzyć że jakieś dane z EEPROMu polecą w kosmos. Może mi Pan polecić jakieś niezawodne rozwiązanie ? Dlaczego ustawienie BODLEVEL może mieć wpływ na EEPROM ? Gdzie znajdę coś więcej na ten temat ? Tablice będą spore, nawet od 2kb do 4kb.

3. Moje ostatnie pytanie.
Dotyczy ono funkcji i zachowania stosu.
O ile rozumiem jak zachowuje się stos w przypadku takiej funkcji void funkcja (uint8t a) o tyle zastanawia mnie co będzie działo się ze stosem, gdy utworzę coś takiego.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Proszę mnie sprostować jeśli coś źle zrozumiałem.
Gdy z poziomu głównej funkcji main () wchodzę w poszczególne funkcje testx() to znaczy, że za każdym razem zostanie wykonana kopia wszystkich zmiennych globalnych na stos ? A po zakończeniu działania funkcji dojdzie do zapisu bezpośrednio na tych zmiennych ?
Czy w ten sposób stos przyrośnie:
- dla funkcji test0() tt[0]=3 o 2 bajty (1 element tablicy i adres powrotu),
- dla funkcji test1() o 2 bajty,
- dla funkcji test2() o 12 bajtów (1 bajt powrotu, 1 bajt na zmienną "i" oraz 10 na tablicę).

Rozumiem że gdybym te same działania umieścił w funkcji głównej main() to stos również przyrośnie o podane wyżej wartości tylko że bez adresów powrotu ?
Gdzie znajduje się rejestry mikrokontrolera który używany jest do optymalizacji dostępu do zmiennych globalnych, to jest element stosu ?

Przepraszam jeśli moje pytania są bzdurne, po prostu próbuję szybko opanować ten język i w pełni zrozumieć pewne mechanizmy.

W książce, chyba w rozdziale o stosie jest informacja, że w dalszej części w ćwiczeniach praktycznych, znajduje się przykład kodu dzięki któremu można kontrolować co się z nim dzieje ale jeszcze nie znalazłem. Zapewne w przeciągu dwóch tygodni się do tego dokopie jednak jeśli to nie problem to proszę o jakieś informację w którym rozdziale i ewentualnie gdzie jeszcze mogę znaleźć jakieś sensowne opracowanie tematu ?
Pytania kieruję do Pana Mirka ale oczywiście jeśli ktoś zna dobrze temat to również zapraszam do dyskusji, chętnie skorzystam z każdej pomocy ;)

Pozdrawiam
Paweł



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2016, o 14:12 
Offline
Moderator
Avatar użytkownika

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

kojot napisał(a):
- Dla pamięci EEPROM i tu niespodzianka, poszczególne elementy tablicy przyjęły zupełnie przypadkowe wartości.

Żadna niespodzianka - kolega po prostu opowiada rzeczy z kosmosu, proszę wybaczyć ....

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


w ten sposób NA PEWNO nie odczytujesz danych z EEPROM .... popatrz w książce a Bluebooku bo tam masz przykład dostępu do EEPROM - chociażby w lekcji o LCD

kojot napisał(a):
2. Panie Mirku co Pan myśli o wykonywaniu kopi zapasowej do pamięci EEPROM mikrokontrolera w razie utraty zasilania oraz dodatkowo co 12h (tak na wszelki wypadek gdyby po kilku latach podtrzymanie zwiodło).

To niestety również pomysł z kosmosu - dlaczego nie czytasz mojego BLOGA, już BARDZO DAWNO temu opisałem prawidłowy sposób postępowania z pamięcią EEPROM w prockach AVR

https://www.youtube.com/watch?v=W7f0EnDzS_M
https://www.youtube.com/watch?v=ix0EBtdiviY

------------------------ [ Dodano po: 2 minutach ]

kojot napisał(a):
Czy w tym procesorze (ATMEGA1284-PU) również może się zdarzyć że jakieś dane z EEPROMu polecą w kosmos.

Z każdego procka mogą polecieć w kosmos jeśli nie zadbasz np o BODLEVEL

kojot napisał(a):
Dlaczego ustawienie BODLEVEL może mieć wpływ na EEPROM ?

W książce pod koniec opisuję znaczenie fusebitów no ale i w internecie znajdziesz co najmniej milard wyjaśnień do czego są akurat te fusebity. A są do tego aby wykonać reset procka przy nieprawidłowym poziomie zasilania (zbyt niskim) ustawiamy ten poziom. To chyba oczywiste że jeśli w trakcie zapisu do EEPROM który jest stosunkowo długotrwały zabraknie napięcia to ???.... to jak myślisz co się stanie ?

------------------------ [ Dodano po: 4 minutach ]

kojot napisał(a):
Gdy z poziomu głównej funkcji main () wchodzę w poszczególne funkcje testx() to znaczy, że za każdym razem zostanie wykonana kopia wszystkich zmiennych globalnych na stos ?

A gdzież to kolega wyczytał takie .... no żeby znowu użyć słowa kosmos - to tak absurdalne informacje ??? Od razu wyjaśniam - że NIGDY w życiu nie ma takiego zjawiska .... to absurd niestety

------------------------ [ Dodano po: 9 minutach ]

kojot napisał(a):
Rozumiem że gdybym te same działania umieścił w funkcji głównej main() to stos również przyrośnie o podane wyżej wartości tylko że bez adresów powrotu ?

Stos zawsze przyrasta i jest zwalniany przy wchodzeniu i wychodzeniu z funkcji - NIEZALEŻNIE z jakiego poziomu jest ona wywoływana. Co za różnica czy z funkcji main() czy jakiejkolwiek innej funkcji ?

kojot napisał(a):
Gdzie znajduje się rejestry mikrokontrolera który używany jest do optymalizacji dostępu do zmiennych globalnych, to jest element stosu ?

nie ma czegoś takiego w ogóle - jak jakiś tajemniczy rejestr do optymalizacji dostępu do zmiennych globalnych ... no tutaj to już kolega coś może sobie wymyślił albo może hmmm nie wie jak zapytać - więc musiałbyś doprecyzować pytanie

------------------------ [ Dodano po: 9 minutach ]

Cytuj:
W książce, chyba w rozdziale o stosie jest informacja, że w dalszej części w ćwiczeniach praktycznych, znajduje się przykład kodu dzięki któremu można kontrolować co się z nim dzieje ale jeszcze nie znalazłem.

to jest w GREENBOOKU

_________________
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: 2 lis 2016, o 15:57 
Offline
Użytkownik

Dołączył(a): 09 mar 2014
Posty: 26
Pomógł: 0

Długa droga jeszcze... ;)
Jeśli chodzi o EEPROM to faktycznie, gdzieś mi to umknęło…
Na pewno przejrzę Bloga.

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

Znalazłem już wcześniej w BB do czego służy ten bit, zastawiałem się tylko czy może być jeszcze jakiś inny powód. Ale już wszystko jasne.

Cytuj:
Cytuj:
Gdy z poziomu głównej funkcji main () wchodzę w poszczególne funkcje testx() to znaczy, że za każdym razem zostanie wykonana kopia wszystkich zmiennych globalnych na stos ?

A gdzież to kolega wyczytał takie .... no żeby znowu użyć słowa kosmos - to tak absurdalne informacje ??? Od razu wyjaśniam - że NIGDY w życiu nie ma takiego zjawiska .... to absurd niestety

Przepraszam, faktycznie bzdurę napisałem, chodziło mi o zmienne globalne które wykorzystywane są w danej funkcji. Ale już mi Pan odpowiedział na pytanie.

Cytuj:
nie ma czegoś takiego w ogóle - jak jakiś tajemniczy rejestr do optymalizacji dostępu do zmiennych globalnych ... no tutaj to już kolega coś może sobie wymyślił albo może hmmm nie wie jak zapytać - więc musiałbyś doprecyzować pytanie.

Chodzi mi o rozdziały o specyfikatorach volatile oraz register.

Z góry dziękuję za wszystkie odpowiedzi.
Obiecuje już nie zaśmiecać forum ;)
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2016, o 16:09 
Offline
Moderator
Avatar użytkownika

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

kojot napisał(a):
chodziło mi o zmienne globalne które wykorzystywane są w danej funkcji.

UWAGA! ... znowu przypominam ;) NIGDZIE i nigdy w życiu w książce nie napisałbym, że wewnątrz funkcji są zmienne globalne! Nie ma takich w funkcji - mówię ci zapamiętaj to bo będziesz miał później sam przez to kłopoty w zrozumieniu wielu rzeczy.

Wewnątrz funkcji mogą być TYLKO:

1. albo zmienne automatyczne (lokalne) i jest to pięknie opisane w rozdziale o funkcjach w C
2. albo zmienne opatrzone specyfikatorem static, które są lokalne dla funkcji ale zachowują się podobnie jak globalne - to też jest opisane w BB

to jest BARDZO WAŻNE, mówienie że wewnątrz funkcji są zmienne globalne jest kardynalnym błędem jak wspominałem ok?

------------------------ [ Dodano po: 2 minutach ]

Cytuj:
Chodzi mi o rozdziały o specyfikatorach volatile oraz register.


No to są specyfikatory opisane i chodzi hmmm no trudno mi tu to od nowa opisywać ale nie służą one do optymalizacji zmiennych. Jeśli już to volatile może służyć do zmiany sposobu optymalizacji ale dostępu do zmiennych w pamięci RAM. Krótko mówiąc volatile wyłącza tę optymalizację. Zaś register może choć nie musi spowodować aby kompilator użył rejestru do obsługi zmiennej - ale żeby to lepiej zrozumieć to już warto byłoby chociaż troszkę liznąć asemblera.

------------------------ [ Dodano po: 5 minutach ]

kojot napisał(a):
Obiecuje już nie zaśmiecać forum

Absolutnie nie zaśmiecasz forum - skąd takie pomysły ?

Ja osobiście milion razy bardziej wolę takie pytania do książki - gdy widać, że ktoś czyta tą książkę i czasem czegoś nie zrozumie - .... bo wtedy widać, że sam próbujesz ogarniać wszystko ładnie - a gdy się zatniesz to dopytujesz o konkrety. Można wtedy też konkretnie podpowiadać .... i myślę, że dzięki temu łatwiej idzie dalej nauka

Zamiast jak to robią niektórzy czytelnicy - którzy piszą mi na PW. ...... aaaaa nie tam, ja nie będę zadawał pytań żeby nie zaniżać poziomu albo żeby się nie ośmieszać. A co tu jest ośmieszającego albo zaniżającego poziom ? ... Mi się wydaje że na tym polega nauka - a jeszcze jak można kogoś podpytać ;) to już w ogóle jest fajnie ;)

_________________
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: 2 lis 2016, o 21:08 
Offline
Użytkownik

Dołączył(a): 09 mar 2014
Posty: 26
Pomógł: 0

Not jeszcze troszkę popytam ;)

Nigdy wcześniej nie miałem do czynienia z programowaniem, postaram się być nieco bardziej precyzyjny ale nie wiem czy mi to wyjdzie.

W praktyce, całe to moje pytanie o stos, zmienne i funkcje sprowadza się do tego, że chciałbym dokładnie i precyzyjnie nauczyć się określać ile w danym miejscu programu może zajmować stos. Teraz może to nie jest aż tak bardzo potrzebne ale w przyszłości może się przydać.

Cytuj:
Cytuj:
chodziło mi o zmienne globalne które wykorzystywane są w danej funkcji.


UWAGA! ... znowu przypominam NIGDZIE i nigdy w życiu w książce nie napisałbym, że wewnątrz funkcji są zmienne globalne! Nie ma takich w funkcji - mówię ci zapamiętaj to bo będziesz miał później sam przez to kłopoty w zrozumieniu wielu rzeczy.

Wewnątrz funkcji mogą być TYLKO:

1. albo zmienne automatyczne (lokalne) i jest to pięknie opisane w rozdziale o funkcjach w C
2. albo zmienne opatrzone specyfikatorem static, które są lokalne dla funkcji ale zachowują się podobnie jak globalne - to też jest opisane w BB

to jest BARDZO WAŻNE, mówienie że wewnątrz funkcji są zmienne globalne jest kardynalnym błędem jak wspominałem ok?


No właśnie już mam kłopoty ;) i nie wiem czy przypadkiem nie wynika to z błędnego rozumienia jak działa kompilacja i sam program po kompilacji.
Po za tym mówiłem o zmiennej która była zdefiniowana na samym początku programu, zanim zaczęła się jakakolwiek funkcja.
Nie podważam tego co mi Pan wyżej napisał ani tego co jest w książce.

Dlatego aby wyjaśnić z czym mam problem napisałem przykład i jeśli jest tka możliwość, to bardzo proszę o jakąś pomoc w wyjaśnieniu krok po kroku, co tu się dzieje ze stosem i zmienną…
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nasz program startuje z pamięci FLASH:
a) Na początku znajduje naszą zmienną o nazwie i która znajduje się poza ciałem głównym funkcji int main (void), dlatego będzie miała zakres widoczności globalny, czyli będą ja widziały wszystkie funkcje w tym przypadku w ramach jednego pliku projektu.
A że jest to zmienna globalna, to na dzień dobry zajmie 1bajt w pamięci RAM a jej wartość będzie równa 0.
Czyli możemy powiedzieć że program trafił na definicję zmiennej i.

b) Dalej jest deklaracja funkcji void test (void)

c) Program trafia na funkcje główną int main (void)
Tu jest moje pytanie, co dzieje się z zmienną i ?
- Wykonywana jest jej kopia na stos ?
- Czy ta funkcja będzie korzystała i wykonywała operacje bezpośrednio na komórce RAMu w której się znajduje ?

Tu też jest moje kolejne pytanie o specyfikator volatile.
Przeczytałem ten rozdział kilka razy i zapewne jeszcze parę razy go przeczytam ;).
W książce jest bardzo fajnie opisany i z niej wiem co on robi i kiedy go stosować.
W tym rozdziale jest taki fragment.
Cytuj:
"Kompilator nie widząc tego przydomku zakłada, że taka zmienna nigdy nie będzie mogła się zmienić bez wiedzy kompilatora. Założenie to czyni już na etapie kompilacji i w wyniku tego często, jeśli np. w jakiejś funkcji ma wykonywać operacje na tejże zmiennej, pozwala sobie na optymalizację, mającą na celu przyśpieszenie działania programu. W mikrokontrolerach jest to szczególnie istotne. Optymalizacja taka polega najczęściej na tym że bezpośrednio po wejściu do funkcji main() czy jakiejkolwiek innej, kompilator zapamiętuje sobie zawartość komórki tej pamięci w podręcznym i wolnym rejestrze mikrokontrolera”

Moje pytanie brzmi, co to jest ten podręczny rejestr mikrokontrolera i gdzie on się fizycznie znajduje ? Tu jest mowa o stosie czy jeszcze czymś innym ? Czy po prostu wyrwałem coś z kontekstu i przez to się pogubiłem ?

d) Wracając do przykładu, program trafia na while (1)
Czy wykorzystanie samego polecenia while (1) może nam zwiększyć stos ?

e)Dalej program trafia na inkrementacje i++;
Czy to polecenie również może na chwilę zwiększyć wartość stosu ?

e) Wchodzimy w funkcję test()
I tu jest jasne że stos przyrośnie ale czy można precyzyjnie określić o ile bez pomocy jakiegoś algorytmu albo symulatora ?

f) Wychodzimy z funkcji test()
- w tym momencie zmienna i, o zwiększonej wartości została zapisana, no właśnie nie mogę dojść gdzie ?
Chyba, że operacje były wykonywane bezpośrednio na komórce w której znajduje się zmienna.
Gdy dorzucę wyświetlanie zawartości zmiennej o nazwie i w funkcjach main() oraz test() to widzę że mi ta wartość fajnie przyrasta.

Troszkę mi wyszła rozprawa o wbijaniu gwoździa, ale jak ktoś nigdy nie trzymał młotka w ręku a uparł się że trzeba coś wbić… ;)
Proszę o wyrozumiałość, zapewne dostaje Pan mnóstwo takich pytań i ciągle przewalają się te same błędy.
Postanowiłem napisać bo trudno czasem się przebić przez gąszcz informacji i wyłuskać to co jest istotne, a co ważniejsze sprawdzone i prawdziwe.

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2016, o 23:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

kojot napisał(a):
c) Program trafia na funkcje główną int main (void)
Tu jest moje pytanie, co dzieje się z zmienną i ?
- Wykonywana jest jej kopia na stos ?
- Czy ta funkcja będzie korzystała i wykonywała operacje bezpośrednio na komórce RAMu w której się znajduje ?

Ta zmienna siedzi w RAM poza obszarem przeznaczonym dla stosu i nie jest "kopiowana" na stos. Funkcje odwołują się bezpośrednio do niej (poprzez jej adres w RAMie)
kojot napisał(a):
Tu też jest moje kolejne pytanie o specyfikator volatile.
Moje pytanie brzmi, co to jest ten podręczny rejestr mikrokontrolera i gdzie on się fizycznie znajduje ? Tu jest mowa o stosie czy jeszcze czymś innym ? Czy po prostu wyrwałem coś z kontekstu i przez to się pogubiłem ?

Rejestry to specjalne komórki mikrokontrolera, do których odwołuje się on zazwyczaj innymi rozkazami maszynowymi niż w przypadku RAM - dostęp do nich jest też szybszy. Szczególnym rodzajem rejestru jest tzw. akumulator. Gdy tworzysz zmienną (np. twoją i) to kompilator "tworzy" kod maszynowy, który może być zoptymalizowany przez "wrzucenie" odwołań do tej zmiennej do takiego rejestru, a nie bezpośrednio do komórki/ek RAM, gdzie znajduje się ta zmienna. Wtedy, gdy np. w jakimś przerwaniu następuje modyfikacja tej zmiennej, to jest to robione na komórce RAM, a nie na rejestrze. Wynikiem tego w rejestrze jest nie zmieniona wartość zmiennej i po powrocie z przerwania może nastąpić błędne działanie z tego wynikłe. Volatile ma temu zapobiec i jest to tylko polecenie języka C, a nie fizyczna komórka w mikrokontrolerze - ale kompilator może to i tak zignorować (choć zazwyczaj tego nie czyni).
Stos to obszar RAM, który kompilator niejako odizolowuje od reszty pamięci i nie pozwala tam wrzucać zmiennych globalnych i jest czymś innym od rejestrów.
kojot napisał(a):
e)Dalej program trafia na inkrementacje i++;
Czy to polecenie również może na chwilę zwiększyć wartość stosu ?

Zmienna i jest globalna, więc operacja na niej nie zwiększy w tym przypadku stosu.
kojot napisał(a):
e) Wchodzimy w funkcję test()
I tu jest jasne że stos przyrośnie ale czy można precyzyjnie określić o ile bez pomocy jakiegoś algorytmu albo symulatora ?

Teoretycznie tak, ale w praktyce może być różnie - zależy to od opcji optymalizacji kompilatora, lub np.tego, że kompilujemy dla debagowania itp.
kojot napisał(a):
f) Wychodzimy z funkcji test()
- w tym momencie zmienna i, o zwiększonej wartości została zapisana, no właśnie nie mogę dojść gdzie ?
Chyba, że operacje były wykonywane bezpośrednio na komórce w której znajduje się zmienna.

Dokładnie są wykonywane bezpośrednio na niej, a nie na jej kopii na stosie.

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lis 2016, o 23:13 
Offline
Moderator
Avatar użytkownika

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

kojot napisał(a):
Tu jest moje pytanie, co dzieje się z zmienną i ?
- Wykonywana jest jej kopia na stos ?


Ale zobacz - czy możesz w tym miejscu - TERAZ otworzyć sobie BLUEBOOKA na rozdziale gdzie opisuję jak działa funkcja. Spróbuj go przeczytać - i później zastanów się czy zadasz to pytanie. Wydaje mi się, że nie zadasz gdy przeczytasz - no chyba , że czegoś nie zrozumiesz. Ale wtedy wolałbym pytanie o to czego nie rozumiesz ... konkretnie

Jak może być wykonywana kopia na stosie jakiejś tam zmiennej globalnej i ? absolutnie nie ... no toż zobacz, że w tym rozdziale WYRAŹNIE piszę .... no bardzo WYRAŹNIE, że na stosie zostanie odłożony powiedzmy adres powrotu funkcji oraz ... ew argumenty przekazane do funkcji albo jej zmienne lokalne. A ty przekazujesz jakiś argument do funkcji test() ? no nie - bo przecież masz

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


więc nie przekazujesz argumentu. Czy tworzysz wewnątrz funkcji jakąś zmienną lokalną ? No nie tworzysz więc co ma być odłożone na stosie ?

Ty wewnątrz swojej funkcji zwiększasz wartość zmiennej globalnej i

... i to wszystko

------------------------ [ Dodano po: kilkunastu sekundach ]

kojot napisał(a):
- Czy ta funkcja będzie korzystała i wykonywała operacje bezpośrednio na komórce RAMu w której się znajduje ?

NO DOKŁADNIE TAK ! .... bo działasz wprost na zmiennej globalnej

------------------------ [ Dodano po: 5 minutach ]

kojot napisał(a):
Moje pytanie brzmi, co to jest ten podręczny rejestr mikrokontrolera i gdzie on się fizycznie znajduje ? Tu jest mowa o stosie czy jeszcze czymś innym ? Czy po prostu wyrwałem coś z kontekstu i przez to się pogubiłem ?

Już wcześniej tobie pisałem - że NIGDY tego w szczegółach nie zrozumiesz - dokąd nie zapoznasz się z językiem programowania asembler, rozumiesz ? Dlatego też również o tym odkładaniu na stos itp opowiadam w sposób przybliżony dla początującego, żeby ogólnie miał orientację. A jak chcesz aż takie szczegóły - chociaż zapewniam że one na samym początku drogi nie są aż tak potrzebne i troszkę zakręcą ci w głowie na tym etapie, to kup książkę z BTC np "Mikrokontrolery ATmega w praktyce" Pana Baranowskiego i czytaj i o asemblerze i o przykładach. Postaraj się napisać BYLE Najprostszy program w asemblerze - to później zaczniesz głębiej rozumieć na czym polega stos, dowiesz się przede wszystkim o rejestrach procesora itp .... Z punktu widzenia języka C do codziennych zastosowań nie jest to aż takie ważne przynajmniej jak mówię na początku.

------------------------ [ Dodano po: 7 minutach ]

kojot napisał(a):
d) Wracając do przykładu, program trafia na while (1)
Czy wykorzystanie samego polecenia while (1) może nam zwiększyć stos ?

Tu znowu odeślę cię do asemblera - bo while to jest zwykła pętla ... i kompilator może ją w zależności od miejsca w całym programie skompilować ją różnie. Może tak się zdarzyć, że coś trafi na stos w jakimś tam przypadku - ale pisanie programów w C nie polega na ciągłej analizie programu w asemblerze ... a ty tego byś chciał - dodatkowo nie znając asemblera ....

Po kompilacji ZAWSZE masz plik o nazwie *.lss - zajrzyj sobie do niego ;) zobaczysz tam swój cały program w C skompilowany do asemblera - wtedy znając asembler będziesz wiedział co w brzuchu programu się dzieje ;)

------------------------ [ Dodano po: 10 minutach ]

Cytuj:
e)Dalej program trafia na inkrementacje i++;
Czy to polecenie również może na chwilę zwiększyć wartość stosu ?

W tym konkretnym przypadku NIE .... ale równie dobrze mógłbym powiedzieć, że TAK ... np jeśli będzie to zmienna 16-bitowa i w trakcie wykonywania kilku rozkazów asemblera które mają zwiększyć jej wartość o jeden, nastąpi przerwanie - wtedy nagle stos wzrośnie ;)

Mówię ci na tym etapie nie zaprzątaj sobie głowy aż takimi szczegółami ... a jeśli chcesz i się uprzesz - to jeszcze raz powtarzam jak mantrę - ZACZNIJ od nauki asemblera

------------------------ [ Dodano po: 11 minutach ]

Cytuj:
e) Wchodzimy w funkcję test()
I tu jest jasne że stos przyrośnie ale czy można precyzyjnie określić o ile bez pomocy jakiegoś algorytmu albo symulatora ?

Pewnie, że można - zajrzyj do pliku *.lss - zobaczysz przy okazji co to jest PROLOG i EPILOG funkcji i ile rzeczy jest odkładanych na stos a ile zdejmowanych o których programista w C wcale nie musi wiedzieć - zaprzątać sobie głowy. I znowu - chcesz zrozumieć - zacznij od nauki asemblera.

------------------------ [ Dodano po: 14 minutach ]

Cytuj:
- w tym momencie zmienna i, o zwiększonej wartości została zapisana, no właśnie nie mogę dojść gdzie ?
Chyba, że operacje były wykonywane bezpośrednio na komórce w której znajduje się zmienna.


eeeeeeh no panie, panie - a gdzie miałaby być zapisana ... no gdzie ? .... no nie żartuj - po to zwiększasz wartość zmiennej żeby jej wartość przyrosła - czyli liczba w tej komórce pamięci - jeśli czujesz że chciałbyś zrozumieć - co to znaczy, że została zapisana ?

ot wykonuje się prosty rozkaz asemblera

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


i co mówi ci to coś ? No nie mówi bo nie znasz asemblera. A zapewniam cię, że nie trzeba go znać, żeby zrozumieć - że skoro masz komórkę pamięci (jeden bajt - zmienna i) .... i wiesz już że jako globalna zmienna jest zerowana - no toż gdzie byś się spodziewał wartości zwiększonej o JEDEN ? co? w jakiejś innej komórce ? sam chyba czujesz że to byłoby kompletnie bez sensu.

------------------------ [ Dodano po: 19 minutach ]

kojot napisał(a):
Troszkę mi wyszła rozprawa o wbijaniu gwoździa, ale jak ktoś nigdy nie trzymał młotka w ręku a uparł się że trzeba coś wbić…

Dobre porównanie ale złe podejście. Bo jeśli ktoś nie używał nigdy młotka a go dostaje do ręki wraz z gwoździem i dostanie krótkie przeszkolenie, że trzeba przywalić w gwóźdź tą żelazną częścią - to nie mów mi że nie dasz rady. A nie jest ci w tym momencie potrzebna wiedza z zakresu budowy młotka, i wzorów na energię kinetyczną jakiej trzeba użyć aby wbić gwoździa w dechę ;) ... to taka aluzja to twoich wciąż pytań o ten stos i rejestry .... owszem fajnie, że cię to interesuje - ale myślę, że po tym moim poście - zanim zadasz kolejne pytanie o rejestr i o stos - odłożysz na chwilę język C. Złapiesz za książkę o asemblerze i napiszesz kilka programów w asemblerze. GWARANTUJĘ ci że po tym ćwiczeniu - nie będziesz w stanie już pytać się co to jest stos i co to są rejestry :lol:

No chyba że wolisz na razie lecieć z nauką języka C bez asemblera - spokojnie się da - a po asemblera przyjdzie czas sięgnąć mówię ci ;)

_________________
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: 3 lis 2016, o 10:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

mirekk36 napisał(a):
no toż zobacz, że w tym rozdziale WYRAŹNIE piszę .... no bardzo WYRAŹNIE, że na stosie zostanie odłożony powiedzmy adres powrotu funkcji oraz ... ew argumenty przekazane do funkcji albo jej zmienne lokalne. A ty przekazujesz jakiś argument do funkcji test() ? no nie - bo przecież masz

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


więc nie przekazujesz argumentu. Czy tworzysz wewnątrz funkcji jakąś zmienną lokalną ? No nie tworzysz więc co ma być odłożone na stosie ?

Jak sam piszesz Mirku będzie odłożony adres :twisted:

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2016, o 10:46 
Offline
Moderator
Avatar użytkownika

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

PJS napisał(a):
Jak sam piszesz Mirku będzie odłożony adres

No ale tu piszę o tym co będzie odłożone na stos w dalszej kolejności po odłożeniu adresu powrotu funkcji ;)

_________________
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: 3 lis 2016, o 11:03 
Offline
Użytkownik

Dołączył(a): 09 mar 2014
Posty: 26
Pomógł: 0

Dziękuję za pełną odpowiedź i cierpliwość ;)
Wiele mi to wyjaśnia :)
Właśnie zrozumiałem gdzie był mój błąd i problem w zrozumieniu tego wszystkiego.
Nie wiem jak to teraz napisać, po prostu ubzdurałem sobie, że skoro ta zmienna i z mojego wcześniejszego przykładu musi posiadać specyfikator Volatile gdy wykorzystywana jest przez jakąś funkcję oraz obsługę przerwania, to znaczy że w trakcie wchodzenia w funkcję zmienna i bez tego specyfikatora musi trafiać na stos albo inne dziwne miejsce. Teraz widzę że zupełnie nie w tym rzecz. Tego w książce oczywiście nie ma, po prostu sobie coś ubzdurałem…

No to jeszcze mam jedno pytanie dla pewności ;)
Taki przykład:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Mamy sporą tablicę elementów typu uint8_t którą w funkcji test(); zapisuję wartością powiedzmy 5. Rozumiem że takie coś nie jest teraz groźnie dla stosu ? Po prostu wszystko odbędzie się bezpośrednio na elementach tablicy która jest ulokowana w komórkach RAM. A co jeśli będzie to tablica zmiennych typu int (dwa bajty na element) ? Możliwe że znowu coś przekręciłem więc wybaczcie, po prostu zastanawiam, się czy taki stworek to nie jest przypadkiem gwóźdź do trumny programu ;) Oczywiście będę jeszcze przerabiał wskaźniki, teraz chciałem ustalić co przy takim zapisie będzie działo się ze stosem.

Ma Pan racje, na razie skupię się na opanowaniu tego co jest w książce i na podstawach C. Ale na pewno przyjdzie czas, że sięgnę do Asemblera bo mi to nie da spokoju ;) Lubię wiedzieć jak coś działa od podszewki. Łatwiej zrozumieć dlaczego gwoździe krzywo wbijam ;) Zasób pytań się wyczerpał, a teraz idę pobawić się młotkiem :D.

PS. Planuje Pan stworzyć na temat Asemblera (same podstawy) jakiś poradnik ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2016, o 11:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

Tablice nie są odkładane na stosie. Są do funkcji przekazywane przez wskaźnik. To tak w skrócie.

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2016, o 11:32 
Offline
Moderator
Avatar użytkownika

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

Wyżej kolega PJS odpowiedział na jedno pytanie to ja dodam tylko

kojot napisał(a):
PS. Planuje Pan stworzyć na temat Asemblera (same podstawy) jakiś poradnik ?

Ostatnio użytkownik andrews zrobił fajny wstęp do łączenia C z asemblerem

ale to na pewno nie zastąpi podstaw asemblera ... a ja niestety na chwilę obecną nie mam w planach kursu asemblera ale ... ale kto wie może to i dobry pomysł na przyszłość ? ;) zobaczymy

_________________
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: 3 lis 2016, o 12:02 
Offline
Użytkownik

Dołączył(a): 09 mar 2014
Posty: 26
Pomógł: 0

Tak, to prawie cytat z książki ;)

W książce była funkcja void funkcja (int t[])
A ja stworzyłem void test (void)

Byłem ciekaw czy program (stos) w obu przypadkach zachowa się tak samo ;).
Jeszcze raz dziękuję za wszystkie odpowiedzi, bardzo mi pomogliście :)
Pozdrawiam :)



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

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