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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-04-16T17:42:40+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=20602&amp;mode</id>
<entry>
<author><name><![CDATA[procek87]]></name></author>
<updated>2018-04-16T17:42:40+01:00</updated>
<published>2018-04-16T17:42:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206858#p206858</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206858#p206858"/>
<title type="html"><![CDATA[Re: Tablica dla Wnikliwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206858#p206858"><![CDATA[
Dziękuje andrews za szczegółowe wyjaśnienie bardzo cenny kawał wiedzy bardzo cennej dla początkującego jak narazie czytam książkę BB i nie zbaczam z kursu choć czasem właśnie dobrze coś dokładniej przeanalizować .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17263">procek87</a> — 16 kwi 2018, o 17:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2018-04-15T20:01:58+01:00</updated>
<published>2018-04-15T20:01:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206827#p206827</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206827#p206827"/>
<title type="html"><![CDATA[Re: Tablica dla Wnikliwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206827#p206827"><![CDATA[
<div class="quotetitle">procek87 napisał(a):</div><div class="quotecontent"><br />Zastanawia mnie po zdefiniowaniu tablicy gdzie jest przetrzymywany ten adres zawarty w nazwie tab ?<br />Bo przecież nazwa zawiera adres ,na który patrzy wskaźnik do elementu uint8_t tak to odebrałem po przeczytaniu rozdziału o Wskaźnikach.<br /><br />Asembler odpowiedziałby na moje pytania ale nie znam go i bardzo ciężko mi analizować plik .lss może ktoś pomoże, i opisze co i gdzie się dzieje z tą tablicą w asemblerze <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ?<br /></div><br />Nie zrozum mnie źle. To nie jest jakaś złośliwość czy brak chęci pomocy. Ja już raz odpowiedziałem na Twoje pytanie dość szczegółowo w innym wątku, tylko aby zrozumieć, trzeba już mieć jakąś wiedzę np. dotyczącą budowy i zasady działania mikrokontrolera, jego listy rozkazów, assemblera itp.<br />Ty tej wiedzy jeszcze nie masz, dlatego nie zrozumiałeś, więc zadajesz następne pytania. Odpowiedź na te pytania zapewne zrodzi następne pytania itd. W ten sposób można napisać na forum całą książkę, a forum do tego nie służy.<br /><br />Ale OK, spróbuję jeszcze raz (ostatnie podejście), oczywiście w dużym uproszczeniu i postaram się jak najprzystępniej dla początkującego. Opis dotyczy zmiennych globalnych i nie uwzględnia procesu inicjowania wartości zmiennych wartościami podanymi przez programistę, aby nie zaciemniać sprawy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Zmienne lokalne są alokowane na stosie, a to już zupełnie inna historia.<br />[syntax=c]uint16_t zmienna_a = 5468;<br />uint8_t tab&#91;&#93;={1,2,4,8,16,32,64,128};<br />uint8_t zmienna_b = 1;<br />uint8_t wsk = NULL;[/syntax]<br />Kiedy kompilator C napotka taką definicję tablicy myśli sobie tak:<br /><br /><em>Programista chce mieć do dyspozycji zmienną <strong>zmienna_a</strong> typu <strong>uint16_t</strong>. Trzeba zarezerwować odpowiednią ilość bajtów pamięci RAM w pierwszej dostępnej lokalizacji. Aktualnie pierwszym dostępnym adresem jest 0. Zmienna jest 16-bitowa, więc zajmie 2 bajty.</em><br /><br />Kompilator na podstawie tej definicji robi więc co następuje:<ul><li>zapisuje sobie <strong>w swojej pamięci podręcznej</strong> symbol <em><strong>zmienna_a</strong></em>,</li><li>przypisuje symbolowi adres w pamięci RAM równy początkowi pamięci RAM, np. dla Atmega8 jest to adres <strong>0x0060</strong>,</li><li>przypisuje do symbolu rozmiar, który w tym przypadku wynosi 2 bajty,</li><li>zapamiętuje też inne rzeczy, które w tej chwili nie są dla nas bardzo istotne.</li></ul><br />Na podstawie następnej definicji robi tak:<ul><li>zapisuje sobie <strong>w swojej pamięci podręcznej</strong> symbol <em><strong>tab</strong></em>,</li><li>przypisuje symbolowi adres w pamięci RAM, który jest sumą adresu poprzedniego symbolu i przypisanego mu rozmiaru, czyli (0x0060+0x02)=<strong>0x0062</strong>,</li><li>przypisuje do symbolu rozmiar, który w tym przypadku wynosi (8 elementów) * (1 bajt) = 8 bajtów.</li></ul><br />Na podstawie następnej definicji robi tak:<ul><li>zapisuje sobie <strong>w swojej pamięci podręcznej</strong> symbol <em><strong>zmienna_b</strong></em>,</li><li>przypisuje symbolowi adres w pamięci RAM, który jest sumą adresu poprzedniego symbolu i przypisanego mu rozmiaru, czyli (0x0062+0x08)=<strong>0x006A</strong>,</li><li>przypisuje do symbolu rozmiar, który w tym przypadku wynosi 1 bajt.</li></ul><br />Na podstawie następnej definicji robi tak:<ul><li>zapisuje sobie <strong>w swojej pamięci podręcznej</strong> symbol <em><strong>wsk</strong></em>,</li><li>przypisuje symbolowi adres w pamięci RAM, który jest sumą adresu poprzedniego symbolu i przypisanego mu rozmiaru, czyli (0x006A+0x01)=<strong>0x006B</strong>,</li><li>przypisuje do symbolu rozmiar, który w tym przypadku wynosi 2 bajty.</li></ul><br />Należy pamiętać o tym, że kompilator do tej pory jeszcze nigdzie żadnego adresu nie umieścił w kodzie, po prostu te adresy sobie pamięta.<br /><br />Jeśli teraz napotka w kodzie np. taką linijkę:[syntax=c]wsk = tab;[/syntax]<br />to może wygenerować taki przykładowy kod (sposobów jest oczywiście więcej, więc nigdy nie wiadomo, który sposób kompilator wybierze jako najbardziej optymalny w danym momencie):[syntax=asm]; przypisanie zmiennej 'wsk ' adresu pierwszego elementu tablicy 'tab'<br />; kompilator pamięta, że adres symbolu 'tab' wynosi 0x0062<br />; a adres zmiennej 'wsk' w RAM wynosi 0x006B<br />    ldi r16, 0x62    ; wpisanie młodszego bajtu adresu do rejestru r16<br />    sts 0x006B, r16  ; zapisanie młodszego bajtu adresu 'tab'<br />                     ; do młodszego bajtu zmiennej 'wsk'<br />    ldi r16, 0x00    ; wpisanie starszego bajtu adresu do rejestru r16<br />    sts 0x006C, r16  ; zapisanie starszego bajtu adresu 'tab'<br />                     ; do starszego bajtu zmiennej 'wsk'[/syntax]<br /><br />Jeśli później napotka w kodzie np. taką linijkę:[syntax=c]zmienna_b = tab&#91;3&#93;;[/syntax]<br />to może wygenerować taki przykładowy kod:[syntax=asm]; kompilator pamięta wartość adresu pierwszego elementu tablicy 0x0062<br />; oblicza więc, że adres trzeciego elementu tablicy będzie równy 0x0062+0x03=0x0065<br />; pamięta też adres zmiennej 'zmienna_b' równy 0x006A<br />    lds r16, 0x0065    ; załadowanie wartości trzeciego elementu tablicy 'tab'<br />    sts 0x006A, r16    ; zapisanie wartości r16 do pamięci RAM, pod którym<br />                       ; znajduje się zmienna 'zmienna_b'[/syntax]<br /><br />Wywołanie funkcji, której argumentem jest wskaźnik do tablicy:[syntax=c]//<br />    PORTC = fun(tab);[/syntax]będzie wyglądało mniej więcej tak:[syntax=asm]; do przekazania pierwszego argumentu do funkcji<br />; służą rejestry r25:r24, kompilator musi przed wywołaniem funkcji<br />; umieścić w nich wskaźnik do 'tab'<br />    ldi r24, 0x62   ; umieszczenie w r24 młodszego bajtu<br />                    ; adresu (pierwszego elementu) tablicy 'tab'<br />    ldi r25, 0x00   ; umieszczenie w r25 starszego bajtu<br />                    ; adresu (pierwszego elementu) tablicy 'tab'<br />    call fun        ; wywołanie podprocedury (funkcji) 'fun'[/syntax]<br /><br />Jak widać kompilator w momencie napotkania definicji zmiennej (jakiejkolwiek, nie tylko tablicy) nie musi od razu nigdzie zapisywać wartości przydzielonego jej adresu w pamięci RAM. On ten adres po prostu zapamiętuje w swojej pamięci podręcznej na czas kompilacji i wstawia jego wartość do odpowiednich poleceń assemblera jako ich argumenty dopiero w momencie, gdy w kodzie jest odwołanie do danego symbolu.<br /><br />Oczywiście w rzeczywistości sprawa jest nieco bardziej skomplikowana, ale po szczegóły zapraszam już do wspomnianej wcześniej w innym wątku literatury.<br /><br />Jeżeli nadal nie zrozumiałeś, to ja się już niestety poddaję. Ponieważ interesują Cię takie szczegóły powinieneś jednak duuużo poczytać o budowie i zasadzie działanie mikrokontrolera, o kodzie maszynowym i instrukcjach ASM, a także o zasadzie działania kompilatora, a wtedy na pewno wszystko się wyjaśni.<br /><br />Pozdrawiam<br />Andrzej<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 15 kwi 2018, o 20:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[procek87]]></name></author>
<updated>2018-04-15T19:43:36+01:00</updated>
<published>2018-04-15T19:43:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206824#p206824</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206824#p206824"/>
<title type="html"><![CDATA[Re: Tablica dla Wnikliwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206824#p206824"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">procek87 napisał(a):</div><div class="quotecontent">Zastanawia mnie po zdefiniowaniu tablicy gdzie jest przetrzymywany ten adres zawarty w nazwie tab ?<br /></div><br /><br />Nigdzie nie jest przetrzymywany - ty wciąż po prostu nie możesz zrozumieć tego, że kompilator musi taką tablicę gdzieś umieścić w pamięci, pod jakimś adresem. A skoro tak - to dlatego wszędzie w całym kodzie gdy ktoś posłuży się nazwą to kompilator wie do jakiego adresu się odwołać.</div><br /><br />tab[]={1,2,4,8,16,32,64,128}<br /><br />Mirku rozumiem to że tablica dokładnie tych kilka komórek uint8_t , które są ułożone jedna po drugiej,  i jest na nich etykieta tab[] i to jest tablica w uproszczeniu .<br /><br />Nie rozumiem jednego jeśli nazwa Tab bez nawiasów okrągłych oznacza adres do elementu pierwszego tablicy to skoro tak to ten adres musi być gdzieś przetrzymywany w  dwóch komórkach  pamięci , dlatego że nazwa tablicy jest wskaźnikiem do miejsca pamięci o adresie , zawierającym elementy -1,-2 itd . bajtowe.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />mnie nie razisz dokąd nie piszesz na forum, że napisałem w książce coś - czego nigdy nie napisałem.<br /></div><br /><br />Dyskutujemy dzięki temu się uczymy , dyskusje są budujące , i zmuszają do zastanawiania się. <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=17263">procek87</a> — 15 kwi 2018, o 19:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-04-15T19:09:14+01:00</updated>
<published>2018-04-15T19:09:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206821#p206821</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206821#p206821"/>
<title type="html"><![CDATA[Re: Tablica dla Wnikliwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206821#p206821"><![CDATA[
mnie nie razisz dokąd nie piszesz na forum, że napisałem w książce coś - czego nigdy nie napisałem.<br /><br /><div class="quotetitle">procek87 napisał(a):</div><div class="quotecontent"><br />Zastanawia mnie po zdefiniowaniu tablicy gdzie jest przetrzymywany ten adres zawarty w nazwie tab ?<br /></div><br /><br />Nigdzie nie jest przetrzymywany - ty wciąż po prostu nie możesz zrozumieć tego, że kompilator musi taką tablicę gdzieś umieścić w pamięci, pod jakimś adresem. A skoro tak - to dlatego wszędzie w całym kodzie gdy ktoś posłuży się nazwą to kompilator wie do jakiego adresu się odwołać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 15 kwi 2018, o 19:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[procek87]]></name></author>
<updated>2018-04-15T18:54:35+01:00</updated>
<published>2018-04-15T18:54:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206820#p206820</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206820#p206820"/>
<title type="html"><![CDATA[Tablica dla Wnikliwych]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20602&amp;p=206820#p206820"><![CDATA[
[syntax=c]uint8_t tab&#91;&#93;={1,2,4,8,16,32,64,128};[/syntax]<br /><br />  Zastanawia mnie po zdefiniowaniu tablicy gdzie jest przetrzymywany ten adres zawarty w nazwie tab ?<br /> Bo przecież nazwa zawiera adres ,na który patrzy wskaźnik do elementu uint8_t  tak to odebrałem po przeczytaniu rozdziału o Wskaźnikach.<br /><br /> Asembler odpowiedziałby na moje pytania ale nie znam go i bardzo ciężko mi analizować plik .lss może ktoś pomoże, i opisze co i gdzie się dzieje z tą  tablicą w asemblerze <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ?<br /><br />Przepraszam jeśli kogoś rażę moimi pytaniami w szczególności Mirka, Mirku poproszę o książkę &quot;Asembler dla Początkujących&quot;  Mirosław Kardaś <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> , będzie mi łatwiej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .<br /><br />Pozdrawiam Procek87<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17263">procek87</a> — 15 kwi 2018, o 18:54</p><hr />
]]></content>
</entry>
</feed>