<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=58&amp;t=16697&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-11-03T12:02:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=16697&amp;mode</id>
<entry>
<author><name><![CDATA[kojot]]></name></author>
<updated>2016-11-03T12:02:29+01:00</updated>
<published>2016-11-03T12:02:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173587#p173587</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173587#p173587"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173587#p173587"><![CDATA[
Tak, to prawie cytat z książki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />W książce była funkcja <span style="text-decoration: underline">void funkcja <strong>(int t[])</strong></span><br />A ja stworzyłem <span style="text-decoration: underline">void test <strong>(void) </strong></span><br /><br />Byłem ciekaw czy program (stos) w obu przypadkach zachowa się tak samo <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. <br />Jeszcze raz dziękuję za wszystkie odpowiedzi, bardzo mi pomogliście <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Pozdrawiam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3382">kojot</a> — 3 lis 2016, o 12:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-11-03T11:32:14+01:00</updated>
<published>2016-11-03T11:32:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173585#p173585</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173585#p173585"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173585#p173585"><![CDATA[
Wyżej kolega PJS odpowiedział na jedno pytanie to ja dodam tylko<br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />PS. Planuje Pan stworzyć na temat Asemblera (same podstawy) jakiś poradnik ?<br /></div><br />Ostatnio użytkownik andrews zrobił fajny wstęp do łączenia C z asemblerem<br /><br />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ść ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zobaczymy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 lis 2016, o 11:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2016-11-03T11:21:32+01:00</updated>
<published>2016-11-03T11:21:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173584#p173584</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173584#p173584"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173584#p173584"><![CDATA[
Tablice nie są odkładane na stosie. Są do funkcji przekazywane przez wskaźnik. To tak w skrócie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 3 lis 2016, o 11:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kojot]]></name></author>
<updated>2016-11-03T11:03:00+01:00</updated>
<published>2016-11-03T11:03:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173583#p173583</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173583#p173583"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173583#p173583"><![CDATA[
Dziękuję za pełną odpowiedź i cierpliwość <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Wiele mi to wyjaśnia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br />Właśnie zrozumiałem gdzie był mój błąd i problem w zrozumieniu tego wszystkiego. <br />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…<br /><br />No to jeszcze mam jedno pytanie dla pewności <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Taki przykład:<br />[syntax=c]uint8_t i;<br />uint8_t tab&#91;200&#93;;<br />void test (void);<br /><br />int main (void)<br />{<br />test();<br />}<br />void test (void)<br />{<br />while(i&lt;200)<br />{<br />tab&#91;i&#93;=5;<br />i++;<br />}<br />}[/syntax] <br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Oczywiście będę jeszcze przerabiał wskaźniki, teraz chciałem ustalić co przy takim zapisie będzie działo się ze stosem. <br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Lubię wiedzieć jak coś działa od podszewki. Łatwiej zrozumieć dlaczego gwoździe krzywo wbijam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Zasób pytań się wyczerpał, a teraz idę pobawić się młotkiem  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />. <br /><br />PS. Planuje Pan stworzyć na temat Asemblera (same podstawy) jakiś poradnik ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3382">kojot</a> — 3 lis 2016, o 11:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-11-03T10:46:54+01:00</updated>
<published>2016-11-03T10:46:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173581#p173581</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173581#p173581"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173581#p173581"><![CDATA[
<div class="quotetitle">PJS napisał(a):</div><div class="quotecontent"><br />Jak sam piszesz Mirku będzie odłożony adres<br /></div><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 lis 2016, o 10:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2016-11-03T10:04:48+01:00</updated>
<published>2016-11-03T10:04:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173573#p173573</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173573#p173573"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173573#p173573"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />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 <br /><br />[syntax=c]void test( void);[/syntax]<br /><br />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 ?<br /></div><br />Jak sam piszesz Mirku będzie odłożony adres  <img src="https://forum.atnel.pl/images/smilies/icon_twisted.gif" alt=":twisted:" title="Szalony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 3 lis 2016, o 10:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-11-02T23:13:09+01:00</updated>
<published>2016-11-02T23:13:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173551#p173551</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173551#p173551"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173551#p173551"><![CDATA[
<div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />Tu jest moje pytanie, co dzieje się z zmienną i ? <br />- Wykonywana jest jej kopia na stos ?<br /></div><br /><br />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<br /><br />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 <br /><br />[syntax=c]void test( void);[/syntax]<br /><br />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 ?<br /><br />Ty wewnątrz swojej funkcji zwiększasz wartość zmiennej globalnej i<br /><br />... i to wszystko<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />- Czy ta funkcja będzie korzystała i wykonywała operacje bezpośrednio na komórce RAMu w której się znajduje ?<br /></div><br />NO DOKŁADNIE TAK ! .... bo działasz wprost na zmiennej globalnej<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />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 ?<br /></div><br />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 &quot;Mikrokontrolery ATmega w praktyce&quot; 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.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 7 minutach ]</span></strong><br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />d)Wracając do przykładu, program trafia na while (1)<br />Czy wykorzystanie samego polecenia while (1) może nam zwiększyć stos ?<br /></div><br />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 ....<br /><br />Po kompilacji ZAWSZE masz plik o nazwie *.lss - zajrzyj sobie do niego <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> 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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 10 minutach ]</span></strong><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />e)Dalej program trafia na inkrementacje i++; <br />Czy to polecenie również może na chwilę zwiększyć wartość stosu ?<br /></div><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />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<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 11 minutach ]</span></strong><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />e)Wchodzimy w funkcję test() <br />I tu jest jasne że stos przyrośnie ale czy można precyzyjnie określić o ile bez pomocy jakiegoś algorytmu albo symulatora ?<br /></div><br />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.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 14 minutach ]</span></strong><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />- w tym momencie zmienna i, o zwiększonej wartości została zapisana, no właśnie nie mogę dojść gdzie ? <br />Chyba, że operacje były wykonywane bezpośrednio na komórce w której znajduje się zmienna.<br /></div><br /><br />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 ? <br /><br />ot wykonuje się prosty rozkaz asemblera<br /><br />[syntax=asm]sts ZMIENNA, rejstr[/syntax]<br /><br />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.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 19 minutach ]</span></strong><br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />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ć…<br /></div><br />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ę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... 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 <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><br /><br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 lis 2016, o 23:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2016-11-02T23:02:52+01:00</updated>
<published>2016-11-02T23:02:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173550#p173550</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173550#p173550"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173550#p173550"><![CDATA[
<div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />c)Program trafia na funkcje główną int main (void) <br />Tu jest moje pytanie, co dzieje się z zmienną i ? <br />- Wykonywana jest jej kopia na stos ?<br />- Czy ta funkcja będzie korzystała i wykonywała operacje bezpośrednio na komórce RAMu w której się znajduje ?<br /></div><br />Ta zmienna siedzi w RAM poza obszarem przeznaczonym dla stosu i nie jest &quot;kopiowana&quot; na stos. Funkcje odwołują się bezpośrednio do niej (poprzez jej adres w RAMie)<div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />Tu też jest moje kolejne pytanie o specyfikator volatile. <br />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 ?<br /></div><br />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 &quot;tworzy&quot; kod maszynowy, który może być zoptymalizowany przez &quot;wrzucenie&quot; 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. <em>Volatile</em> 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). <br />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.<br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />e)Dalej program trafia na inkrementacje i++; <br />Czy to polecenie również może na chwilę zwiększyć wartość stosu ?<br /></div><br />Zmienna i jest globalna, więc operacja na niej nie zwiększy w tym przypadku stosu. <br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />e)Wchodzimy w funkcję test() <br />I tu jest jasne że stos przyrośnie ale czy można precyzyjnie określić o ile bez pomocy jakiegoś algorytmu albo symulatora ?<br /></div><br />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.<br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />f)  Wychodzimy z funkcji test() <br />- w tym momencie zmienna i, o zwiększonej  wartości została zapisana, no właśnie nie mogę dojść gdzie ? <br />Chyba, że operacje były wykonywane bezpośrednio na komórce w której znajduje się zmienna.<br /></div><br />Dokładnie są wykonywane bezpośrednio na niej, a nie na jej kopii na stosie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 2 lis 2016, o 23:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kojot]]></name></author>
<updated>2016-11-02T21:08:40+01:00</updated>
<published>2016-11-02T21:08:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173540#p173540</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173540#p173540"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173540#p173540"><![CDATA[
Not jeszcze troszkę popytam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Nigdy wcześniej nie miałem do czynienia z programowaniem, postaram się być nieco bardziej precyzyjny ale nie wiem czy mi to wyjdzie. <br /><br />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ć. <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent">chodziło mi o zmienne globalne które wykorzystywane są w danej funkcji.<br /></div><br /><br />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.<br /><br />Wewnątrz funkcji mogą być TYLKO:<br /><br />1. albo zmienne automatyczne (lokalne) i jest to pięknie opisane w rozdziale o funkcjach w C<br />2. albo zmienne opatrzone specyfikatorem static, które są lokalne dla funkcji ale zachowują się podobnie jak globalne - to też jest opisane w BB<br /><br />to jest BARDZO WAŻNE, mówienie że wewnątrz funkcji są zmienne globalne jest kardynalnym błędem jak wspominałem ok?</div><br /><br />No właśnie już mam kłopoty <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i nie wiem czy przypadkiem nie wynika to z błędnego rozumienia jak działa kompilacja i sam program po kompilacji. <br />Po za tym mówiłem o zmiennej która była zdefiniowana na samym początku programu,  zanim zaczęła się jakakolwiek funkcja. <br />Nie podważam tego co mi Pan wyżej napisał ani tego co jest w książce. <br /><br />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ą… <br />[syntax=c]uint8_t i;<br />void test (void);<br />int main (void)<br />{<br />while (1)<br />{<br /><br /> i++;<br /> test();<br />}<br />}<br />void test (void)<br />{<br /> i++;<br />}[/syntax]<br /><br />Nasz program startuje z pamięci FLASH:<br />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. <br />A że jest to zmienna globalna, to na dzień dobry zajmie 1bajt w pamięci RAM a jej wartość będzie równa 0. <br />Czyli możemy powiedzieć że program trafił na definicję zmiennej i. <br /><br />b)Dalej jest deklaracja funkcji void test (void)<br /><br />c)Program trafia na funkcje główną int main (void) <br />Tu jest moje pytanie, co dzieje się z zmienną i ? <br />- Wykonywana jest jej kopia na stos ?<br />- Czy ta funkcja będzie korzystała i wykonywała operacje bezpośrednio na komórce RAMu w której się znajduje ? <br /><br />Tu też jest moje kolejne pytanie o specyfikator volatile. <br />Przeczytałem ten rozdział kilka razy i zapewne jeszcze parę razy go przeczytam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. <br />W książce jest bardzo fajnie opisany i z niej wiem co on robi i kiedy go stosować.  <br /> W tym rozdziale jest taki fragment. <br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />&quot;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”<br /></div><br />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 ?<br /><br />d)Wracając do przykładu, program trafia na while (1)<br />Czy wykorzystanie samego polecenia while (1) może nam zwiększyć stos ?<br /><br />e)Dalej program trafia na inkrementacje i++; <br />Czy to polecenie również może na chwilę zwiększyć wartość stosu ?<br /> <br />e)Wchodzimy w funkcję test() <br />I tu jest jasne że stos przyrośnie ale czy można precyzyjnie określić o ile bez pomocy jakiegoś algorytmu albo symulatora ?<br /><br />f)  Wychodzimy z funkcji test() <br />- w tym momencie zmienna i, o zwiększonej  wartości została zapisana, no właśnie nie mogę dojść gdzie ? <br />Chyba, że operacje były wykonywane bezpośrednio na komórce w której znajduje się zmienna. <br />Gdy dorzucę wyświetlanie zawartości zmiennej o nazwie i w funkcjach main() oraz test() to widzę że mi ta wartość fajnie przyrasta. <br /><br />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ć… <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Proszę o wyrozumiałość, zapewne dostaje Pan mnóstwo takich pytań i ciągle przewalają się te same błędy. <br />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. <br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3382">kojot</a> — 2 lis 2016, o 21:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-11-02T16:09:23+01:00</updated>
<published>2016-11-02T16:09:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173479#p173479</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173479#p173479"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173479#p173479"><![CDATA[
<div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />chodziło mi o zmienne globalne które wykorzystywane są w danej funkcji.<br /></div><br />UWAGA! ... znowu przypominam <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> 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.<br /><br />Wewnątrz funkcji mogą być TYLKO:<br /><br />1. albo zmienne automatyczne (lokalne) i jest to pięknie opisane w rozdziale o funkcjach w C<br />2. albo zmienne opatrzone specyfikatorem static, które są lokalne dla funkcji ale zachowują się podobnie jak globalne - to też jest opisane w BB<br /><br />to jest BARDZO WAŻNE, mówienie że wewnątrz funkcji są zmienne globalne jest kardynalnym błędem jak wspominałem ok?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Chodzi mi o rozdziały o specyfikatorach volatile oraz register.<br /></div><br /><br />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.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />Obiecuje już nie zaśmiecać forum<br /></div><br />Absolutnie nie zaśmiecasz forum - skąd takie pomysły ?<br /><br />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<br /><br />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ć <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to już w ogóle jest fajnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 lis 2016, o 16:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kojot]]></name></author>
<updated>2016-11-02T15:57:55+01:00</updated>
<published>2016-11-02T15:57:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173477#p173477</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173477#p173477"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173477#p173477"><![CDATA[
Długa droga jeszcze... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Jeśli chodzi o EEPROM to faktycznie, gdzieś mi to umknęło… <br />Na pewno przejrzę Bloga.<br /><br />[syntax=c]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 ?[/syntax]<br />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.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent">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 ?<br /></div><br />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<br /></div><br />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. <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />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.<br /></div><br />Chodzi mi o rozdziały o specyfikatorach  volatile oraz register. <br /><br />Z góry dziękuję za wszystkie odpowiedzi. <br />Obiecuje już nie zaśmiecać forum <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3382">kojot</a> — 2 lis 2016, o 15:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-11-02T14:12:41+01:00</updated>
<published>2016-11-02T14:12:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173462#p173462</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173462#p173462"/>
<title type="html"><![CDATA[Re: Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173462#p173462"><![CDATA[
<div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />- Dla pamięci EEPROM i tu niespodzianka, poszczególne elementy tablicy przyjęły zupełnie przypadkowe wartości.<br /></div><br />Żadna niespodzianka - kolega po prostu opowiada rzeczy z kosmosu, proszę wybaczyć .... <br /><br />[syntax=c]a=tt&#91;i&#93;;[/syntax]<br /><br />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<br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />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).<br /></div><br />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<br /><br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=W7f0EnDzS_M" >https://www.youtube.com/watch?v=W7f0EnDzS_M</a><!-- m --><br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=ix0EBtdiviY" >https://www.youtube.com/watch?v=ix0EBtdiviY</a><!-- m --><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />Czy w tym procesorze (ATMEGA1284-PU) również może się zdarzyć że jakieś dane z EEPROMu polecą w kosmos.<br /></div><br />Z każdego procka mogą polecieć w kosmos jeśli nie zadbasz np o BODLEVEL<br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />Dlaczego ustawienie BODLEVEL może mieć wpływ na EEPROM ?<br /></div><br />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 ?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 4 minutach ]</span></strong><br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />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 ?<br /></div><br />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<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />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 ?<br /></div><br />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 ?<br /><br /><div class="quotetitle">kojot napisał(a):</div><div class="quotecontent"><br />Gdzie znajduje się rejestry mikrokontrolera który używany jest do optymalizacji dostępu do zmiennych globalnych, to jest element stosu ?<br /></div><br />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<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 9 minutach ]</span></strong><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />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.<br /></div><br />to jest w GREENBOOKU<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 lis 2016, o 14:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kojot]]></name></author>
<updated>2016-11-02T13:52:24+01:00</updated>
<published>2016-11-02T13:52:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173459#p173459</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173459#p173459"/>
<title type="html"><![CDATA[Zmienne globalne, EEPROM, stos.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16697&amp;p=173459#p173459"><![CDATA[
Witam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> . <br />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. <br />Kawał dobrej roboty Panie Mirku <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br />Muszę jeszcze tylko zrobić sobie streszczenie, do którego będzie można szybko sięgnąć i znaleźć potrzebne rzeczy, ale nie o tym...<br /><br />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ń. <br />Z góry przepraszam jeśli użyłem niefachowej terminologii lub coś pokręciłem.<br /><br />1. Jak wiadomo zmienne globalne zawsze automatycznie inicjowane są wartością 0. To jest fakt oczywisty i niezaprzeczalny. <br />Jestem praktykiem i łatwiej mi coś zapamiętać jeśli sprawdzę to „namacalnie”.  <br />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. <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />uint8_t c; <br />uint8_t i; <br /><br />uint8_t tt&#91;10&#93; EEMEM;<br /><br />int main (void)<br /><br />{<br />uint8_t a;<br /><br /> while(c&lt;10)<br />{<br />  a=tt&#91;i&#93;;<br /> <br />  lcd_init();<br /> lcd_locate(0,0);<br /> lcd_int(a);<br /> <br /> i++;<br /> c++;<br /> _delay_ms(1000);<br />}<br />}[/syntax]<br />- Dla pamięci RAM oczywiście wszystkie komórki przyjęły wartość 0. <br />- Dla pamięci FLASH komórki przyjęły wartość 0.<br />- Dla pamięci EEPROM i tu niespodzianka, poszczególne elementy tablicy przyjęły zupełnie przypadkowe wartości.<br /><br /> Zacząłem szukać przyczyny. <br />Upload EEPROM image ustawione na form build. <br />W fusach EESAVE odznaczone, zresztą sprawdzałem obie opcje. <br />Używam nowy Atmel toolchain, środowisko Eclipse, mkAVR Calculator, ATMEGA32, zestaw ATB 1.03.<br />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.  <br />Zastanawia mnie tylko dlaczego tak jest ?. <br /><br />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). <br />Czytając Pana wypowiedź na jednym z postów <a href="http://forum.atnel.pl/topic5370.html"  class="postlink">http://forum.atnel.pl/topic5370.html</a> 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.<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />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<br /></div><br />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. <br /><br />3. Moje ostatnie pytanie. <br />Dotyczy ono funkcji i zachowania stosu. <br />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.<br />[syntax=c]uint8_t i;<br />uint8_t z;<br />uint8_t tt&#91;10&#93; EEMEM;<br /><br />void test0 (void);<br />void test1 (void);<br />void test2 (void);<br /><br />int main (void)<br />{<br /><br />test0();<br />test1();<br />test2();<br /><br />}<br /><br />void test0 (void)<br />{<br />tt&#91;0&#93;=3;<br />}<br /><br />void test1 (void)<br />{<br />z=3;<br />}<br /><br />void test2 (void)<br />{<br />while(i&lt;10)<br />{<br />tt&#91;i&#93;=0;<br />i++;<br />}<br />}[/syntax]<br /><br />Proszę mnie sprostować jeśli coś źle zrozumiałem. <br />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 ?<br />Czy w ten sposób stos przyrośnie:<br />- dla funkcji test0()  tt[0]=3 o 2 bajty (1 element tablicy i adres powrotu),<br />- dla funkcji test1() o 2 bajty,<br />- dla  funkcji test2() o 12 bajtów (1 bajt powrotu, 1 bajt na zmienną &quot;i&quot; oraz 10 na tablicę).<br /><br />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 ? <br />Gdzie znajduje się rejestry mikrokontrolera który używany jest do optymalizacji dostępu do zmiennych globalnych,  to jest element stosu ?<br /> <br />Przepraszam jeśli moje pytania są bzdurne, po prostu próbuję szybko opanować ten język i w pełni zrozumieć pewne mechanizmy. <br /><br />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 ?<br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Pozdrawiam<br />Paweł<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3382">kojot</a> — 2 lis 2016, o 13:52</p><hr />
]]></content>
</entry>
</feed>