<?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=24&amp;t=14615&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-02-22T22:15:25+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=24&amp;t=14615&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-02-22T22:15:25+01:00</updated>
<published>2016-02-22T22:15:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154458#p154458</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154458#p154458"/>
<title type="html"><![CDATA[Re: Zapychanie stosu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154458#p154458"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Jakiś delay w kodzie i niech każda z funkcji wyświetli wskaźnik stosu na LCD. Kompilator powinien to puścić.<br />To może być ciekawe doświadczenie.<br /></div><br />No tak doświadczenie może być bardzo ciekawe - zwykle przepełnienie stosu objawia się w programach tak - że programista szuka tygodniami błędu w CAŁKOWICIE innym miejscu zanim na końcu dopiero zorientuje się, że chodzi o stos <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> opisuję to i metodę sprawdzania wolnej pamięci RAM która nie została użyta na zmienne globalne i stos w Greenbooku. Czasem gdy występują dziwne zjawiska w programie i wydaje się że jesteśmy bezsilni a powodem są kosmici <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> - to pierwsze co stosuję, to właśnie tę metodę aby się upewnić że nie sypie mi się stos zanim nie stracę znowu kilku tygodni na szukanie problemu w całkiem innym miejescu <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> — 22 lut 2016, o 22:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[APAP75]]></name></author>
<updated>2016-02-22T19:09:45+01:00</updated>
<published>2016-02-22T19:09:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154432#p154432</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154432#p154432"/>
<title type="html"><![CDATA[Re: Zapychanie stosu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154432#p154432"><![CDATA[
Myślę, że koledze Jarecki chodziło bardziej o to co się stanie, gdy wskaźnik stosu osiągnie swoje maksimum (minimum).<br /><br />Spróbuj i daj znać - funkcja A wywoła funkcję B, ta z kolei funkcję C a ta funkcję A itp.<br />Jakiś delay w kodzie i niech każda z funkcji wyświetli wskaźnik stosu na LCD. Kompilator powinien to puścić.<br />To może być ciekawe doświadczenie.<br /><br />A swoją drogą - nie bardzo wiem jak i czy w ogóle można wywołać funkcję main(). Nie znajduje się ona na pewno pod adresem zerowym.<br /><br />A... nie używaj zmiennych globalnych i static...   <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=6195">APAP75</a> — 22 lut 2016, o 19:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2016-02-22T13:04:42+01:00</updated>
<published>2016-02-22T13:04:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154405#p154405</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154405#p154405"/>
<title type="html"><![CDATA[Re: Zapychanie stosu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154405#p154405"><![CDATA[
A jak koniecznie chcesz wracać do początku bez zmiany wyników utworzonych przez kolejne funkcje to mając świadomość takiej sytuacji zrób sobie dodatkową flagę, która w wypadku ustawienia, będzie przy każdym powrocie w funkcji wywołującej informować o zignorowaniu wyniku, który właśnie przyszedł z wywołanej przed chwilą funkcji. To tylko jeden ze sposobów, a rozwiązań w zależności od potrzeb może być dużo więcej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 22 lut 2016, o 13:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-02-22T12:09:42+01:00</updated>
<published>2016-02-22T12:09:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154404#p154404</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154404#p154404"/>
<title type="html"><![CDATA[Re: Zapychanie stosu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154404#p154404"><![CDATA[
<div class="quotetitle">Jarecki napisał(a):</div><div class="quotecontent"><br />to tylko takie głośne przemyślenia<br /></div><br />No to właśnie - masz dobre przemyślenia - że ze stosem byłaby masakra <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> wąż w pewnym momencie zacząłby zjadać własny ogon aż by się zadławił <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> — 22 lut 2016, o 12:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2016-02-22T12:07:04+01:00</updated>
<published>2016-02-22T12:07:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154403#p154403</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154403#p154403"/>
<title type="html"><![CDATA[Re: Zapychanie stosu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154403#p154403"><![CDATA[
Wiem że to paskudne rozwiązanie i nie mam zamiaru go stosować <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> to tylko takie głośne przemyślenia <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=2511">Jarecki</a> — 22 lut 2016, o 12:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-02-22T12:03:55+01:00</updated>
<published>2016-02-22T12:03:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154402#p154402</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154402#p154402"/>
<title type="html"><![CDATA[Re: Zapychanie stosu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154402#p154402"><![CDATA[
<div class="quotetitle">jnk0le napisał(a):</div><div class="quotecontent"><br />Oczywiście mowa o powrocie do punktu wyjścia - na początek maina to poprzez reset można co najwyżej.<br /></div><br />Można też o wiele czyściej np za pomocą watchdog'a ale nie w tym rzecz - warto zaznaczyć, że takie pisanie programów nie ma sensu, które w ramach normalnej pracy będą dokonywać resetu procka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 22 lut 2016, o 12:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jnk0le]]></name></author>
<updated>2016-02-22T11:54:09+01:00</updated>
<published>2016-02-22T11:54:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154401#p154401</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154401#p154401"/>
<title type="html"><![CDATA[Re: Zapychanie stosu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154401#p154401"><![CDATA[
<div class="quotetitle">Jarecki napisał(a):</div><div class="quotecontent"><br /><a href="https://obrazkiforum.atnel.pl/2511/9fcd594e128b831a6a74fc34c670e9ab.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2511/9fcd594e128b831a6a74fc34c670e9ab.png" alt="Obrazek" /></a><br />Rys. 2.<br /><br />Co się jednak stanie kiedy kolejne funkcję będą się wykonywać w sposób pokazany na rysunku 2? czy stos zostanie w końcu zapełniony i program zawiesi się? Funkcja A wywołuje funkcję B, ta z kolei wywołuje funkcję C a funkcja C wywołuje funkcję main bo powiedzmy jest taka potrzeba aby program zaczął wykonywać się od początku. Jak myślicie program się wysypie czy może kompilator tak skompiluje kod że będzie on działał poprawnie bez ryzyka zapełnienia stosu?<br /></div><br />GCC tak właśnie optymalizuje generowany kod jeśli wyniki z ostatniej funkcji są zwracane do main() - ostatnia funkcja zawiera 'ret' a reszta zwykłe jmp/rjmp albo leżą jedna za drugą. Jakiekolwiek ręczne obejścia skończą się wysypaniem stosu.<br /><br />EDIT:<br />Oczywiście mowa o powrocie do punktu wyjścia - na początek maina to poprzez reset można co najwyżej. <br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">asm volatile(&quot;jmp 0&quot; ::);</div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8491">jnk0le</a> — 22 lut 2016, o 11:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-02-22T11:47:09+01:00</updated>
<published>2016-02-22T11:47:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154399#p154399</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154399#p154399"/>
<title type="html"><![CDATA[Re: Zapychanie stosu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154399#p154399"><![CDATA[
<div class="quotetitle">Jarecki napisał(a):</div><div class="quotecontent"><br />ta z kolei wywołuje funkcję C a funkcja C wywołuje funkcję main bo powiedzmy jest taka potrzeba aby program zaczął wykonywać się od początku. Jak myślicie program się wysypie czy może kompilator tak skompiluje kod że będzie on działał poprawnie bez ryzyka zapełnienia stosu?<br /></div><br /><br />Wiesz najgorszym z możliwych pomysłów i to koszmarnych jest właśnie takie podejście i tłumaczenie że:<br /><br /><div class="quotetitle">Jarecki napisał(a):</div><div class="quotecontent"><br />a funkcja C wywołuje funkcję main bo powiedzmy jest taka potrzeba<br /></div><br />Sorki ale to jest już KOMPLETNIE hmmmm .... no żeby jakoś delikatnie to określić nonsens ...<br /><br />Uwierz mi, że NIGDY ale to NIGDY tak się nie robi a sposobów aby program się rozpoczął całkowicie od nowa jest MILION. Przy czym nawet takie podejście aby w toku normalnego działania program miał się resetować to też jakieś koszmarne podejście ...<br /><br />Tyle tytułem próby wybicia tobie z głowy takich pomysłów ....<br /><br />-------------------------------------------------<br /><br />Chcesz wiedzieć jak to się robi ? można ci pomóc i dużo podpowiedzieć ale najpierw trzeba byłoby wiedzieć co chcesz zrobić - zrealizować. Więc lepiej napisz o tym a nie pytaj co będzie ze stosem gdy będziesz wywoływał z funkcji C funkcję main() ... bo widać, że sam i to dobrze przeczuwasz że będzie masakra amerykańską piłą tarczową.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 22 lut 2016, o 11:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2016-02-22T11:02:12+01:00</updated>
<published>2016-02-22T11:02:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154398#p154398</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154398#p154398"/>
<title type="html"><![CDATA[Zapychanie stosu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14615&amp;p=154398#p154398"><![CDATA[
Witam, pisząc program zacząłem zastanawiać się nad jedną rzeczą... <br /><a href="https://obrazkiforum.atnel.pl/2511/0289527a4682c3d640935cdd56b3e845.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2511/0289527a4682c3d640935cdd56b3e845.png" alt="Obrazek" /></a><br />Rys. 1.<br /><br />Na rysunku 1 zamieściłem poprawny schemat blokowy, który ilustruje pracę programu. W funkcji main znajduje się pętla nieskończona while a co jakiś czas wywoływana jest funkcja A, która wywołuje funkcję B a ta z kolei funkcję C. Ta ostatnia czyli funkcja C zwraca wynik, następnie funkcja B również zwraca wynik i podobnie funkcja A. Program działa prawidłowo a stos za każdym razem wejścia w kolejne funkcje &quot;powiększa się&quot; a po ich wykonaniu &quot;pomniejsza&quot;.<br /><br /><a href="https://obrazkiforum.atnel.pl/2511/9fcd594e128b831a6a74fc34c670e9ab.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2511/9fcd594e128b831a6a74fc34c670e9ab.png" alt="Obrazek" /></a><br />Rys. 2.<br /><br />Co się jednak stanie kiedy kolejne funkcję będą się wykonywać w sposób pokazany na rysunku 2? czy stos zostanie w końcu zapełniony i program zawiesi się? Funkcja A wywołuje funkcję B, ta z kolei wywołuje funkcję C a funkcja C wywołuje funkcję main bo powiedzmy jest taka potrzeba aby program zaczął wykonywać się od początku. Jak myślicie program się wysypie czy może kompilator tak skompiluje kod że będzie on działał poprawnie bez ryzyka zapełnienia stosu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 22 lut 2016, o 11:02</p><hr />
]]></content>
</entry>
</feed>