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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-05-26T09:24:12+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23154&amp;mode</id>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2020-05-26T09:24:12+01:00</updated>
<published>2020-05-26T09:24:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227586#p227586</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227586#p227586"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227586#p227586"><![CDATA[
<div class="quotetitle">abel11 napisał(a):</div><div class="quotecontent"><br />O ile z samym nazwaniem tego adresowaniem bitowym się nie zgodzę<br /></div><br />Tylko, że to nie ja wymyśliłem takie określenie. Po prostu takie się znajduje w różnych materiałach. To tylko określenie pewnego mechanizmu.<br />Nie da się ukryć, że procesory mogą wykonywać operacje na poszczególnych bitach i to robią, natomiast nie każdy kompilator wykorzystuje wszystkie te możliwości.<br />Jak przeczytasz to co pisałem, to zwróć uwagę, że nigdzie nie napisałem, że taka możliwość obejmuje pełną przestrzeń adresową.<br />Co do przykładu z umieszczeniem takich flag w przestrzeni rejestrów. Tak będzie to szybkie i skuteczne a przy tym można zaoszczędzić RAM.<br />Z tym, że nic nie stoi na przeszkodzie, aby tak zorganizowane flagi umieścić poza obszarem rejestrów.<br />Dojdzie operacja załadowania danej do rejestru, ale zauważ, że generalnie tak to działa. Na przykład jeżeli dodajesz dwie zmienne typu bajt,<br />to najpierw te zmienne są wczytywane do rejestrów a potem dodawanie odbywa się już na rejestrach (instrukcja ADD). Wynik dopiero z rejestru jest wrzucany z powrotem do RAM. I jakoś nikt nie krzyczy, że to jest nieefektywne. Po prostu tak to działa i już. No w C może jest jeszcze inaczej bo tam jest jeszcze domyślna promocja do int, ale nigdy nie analizowałem, co tak naprawdę kompilator tworzy.<br />Co do samego pakowania kilku flag do jednego bajtu, może i to nie ma wielkiego sensu w przypadku dużych procesorów.<br />Ale w przypadku maluchów jest o co walczyć. Każdy bajt ma znaczenie. Zajmowanie ram'u po 1 bajcie na każdą 1 bitową flagę jest moim zdaniem marnotrawstwem.<br />I dla mnie jest to &quot;ograniczenie&quot; C,  a nie brak fizycznych możliwości procesorów w tym zakresie. Pisząc w asm nie stanowi to problemu. <br />Jasne jest taki wybór procesorów, że w ogóle nie ma problemu, dobiera się procesor odpowiedni do zadania i można wziąć większy.<br />Zwrócę uwagę na jeszcze jedną istotna sprawę. Operowanie bezpośrednio na bitach daje atomowość. <br />W C poprzez maskowanie i sekwencje odczytaj, modyfikuj zapisz tą atomowość się traci. Można się przez to wpakować w tarapaty, a przyczynę znaleźć ciężko.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 32 minutach ]</span></strong><br /><br /><div class="quotetitle">abel11 napisał(a):</div><div class="quotecontent"><br />W kwestii wspomnianego wcześniej bitbanding'u, domyślam się, że chodzi o PMP (Parell Master Port) i podłączanie np. zewnętrznej pamięci do całego portu, co umożliwia równoległą transmisję danych z względnie duża prędkością. Rozwiązanie to nie daje nagle bitowi własnego adresu na magistrali, w dalszym ciągu operuje się na porcie (bajcie SFR) i numerach bitów. Budowa procesorów nie pozwala i nie pozwalała na adresowanie pojedynczego bitu, pozwala na adresowanie całego bajtu i wyłuskanie bitu po numerze i ta kwestia się raczej nie zmieni w najbliższym czasie.<br /></div><br />Nie tu chodzi o zupełnie inny mechanizm:<br /><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/Behcjiic.html"  class="postlink">http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/Behcjiic.html</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 26 maja 2020, o 09:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-05-25T23:28:51+01:00</updated>
<published>2020-05-25T23:28:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227584#p227584</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227584#p227584"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227584#p227584"><![CDATA[
Na wstępie, żeby rozwiać ewentualne wątpliwości, jestem zwolennikiem kulturalnej dyskusji na argumenty, a takową zwykle obie strony kończą zadowolone, nawet jeśli nie uda się uzyskać konsensusu.<br /><br />W kwestii wspomnianego wcześniej bitbanding'u, domyślam się, że chodzi o PMP (Parell Master Port) i podłączanie np. zewnętrznej pamięci do całego portu, co umożliwia równoległą transmisję danych z względnie duża prędkością. Rozwiązanie to nie daje nagle bitowi własnego adresu na magistrali, w dalszym ciągu operuje się na porcie (bajcie SFR) i numerach bitów. Budowa procesorów nie pozwala i nie pozwalała na adresowanie pojedynczego bitu, pozwala na adresowanie całego bajtu i wyłuskanie bitu po numerze i ta kwestia się raczej nie zmieni w najbliższym czasie.<br /><br /><div class="quotetitle">auers napisał(a):</div><div class="quotecontent"><br />język c<br /><br />    sbrc bajt_na_flagi,moja_flaga<br />    rjmp omin_kod<br />    kod:<br /><br />GeSHi<br /><br />I bez narzutu w dodatkowych operacjach, czy cyklach.<br /></div><br />Przyznam, że &quot;zintegrowanie&quot; bitu rejestru z kodem programu, znacząco poprawia sytuację w kwestii marnowania pamięci jak i cykli zegara.<br />Ciekawe rozwiązanie, umieścił bym je obok ztablicowanych wartości np. sin/cos (w gruncie rzeczy bardzo podobnie to działa), w niewielkim stopniu ogranicza możliwości operacji na zmiennej (trudniej ustawić takiego boola jako element operacji matematycznej) ale z pewnością oszczędza miejsce. <br /><br />O ile z samym nazwaniem tego adresowaniem bitowym się nie zgodzę, ponieważ adres ma komórka pamięci, a bit ma numer, to muszę oddać koledze, że udowodnił sensowność tego pomysłu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17861">abel11</a> — 25 maja 2020, o 23:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2020-05-25T20:17:32+01:00</updated>
<published>2020-05-25T20:17:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227580#p227580</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227580#p227580"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227580#p227580"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Potrzebne jest 8bit na rejestr przechowujący flagi - tu się zgadzamy<br /></div><br />Tak zgadzam się, przy 1 bicie i tak trzeba zająć cały bajt, ale przy większej ilości flag, ma to sens. <br /><div class="quotetitle">abel11 napisał(a):</div><div class="quotecontent"><br />Powiedz mi jak odczytasz te flagi bez 8b maski albo kilku zbędnych instrukcji ASM<br /></div><br />Tak jak pisałem wyżej, już całe lata nie pisałem w asm, ale spróbuję.<br />Najczęściej flaga jest po to aby sygnalizowała jakiś stan.<br />Czyli nie musimy jej odczytywać po to aby zapisać do innej zmiennej, tylko sprawdzamy jej status i wykonujemy jakiś kod.<br />Czyli używamy instrukcji do testowania stanu bitu:<br />w c<br />[syntax=c]if(moja_flaga){<br />kod;<br />}[/syntax]<br />w asm,<br />[syntax=c]sbrc bajt_na_flagi,moja_flaga <br />rjmp omin_kod<br />kod:[/syntax]<br />I bez narzutu w dodatkowych operacjach, czy cyklach.<br />Natomiast jak już chcesz odczytać stan bitu i go gdzieś zapisać to:<br />[syntax=c]bst bajt_na_flagi,moja_flaga  ; Store bit  in T Flag<br />bld inny_bajt,inna_flaga ; Load from T Flag[/syntax]  <br />Czyli w sumie 2 cykle zegara.<br />Widzisz, ja tu problemu z wydajnością nie widzę. <br />Owszem czasami będą dodatkowe instrukcje ale to specyfika procesorów RISC które jednak mają tych instrukcji mniej.  <br />Z drugiej strony czasami ważniejsza jest optymalizacja pamięci, lub np. atomowość niż sama wydajność kodu .<br />Wszytko zależy od zastosowania.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 8 minutach ]</span></strong><br /><br /><div class="quotetitle">fofex napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">auers napisał(a):</div><div class="quotecontent">Poczytaj np. o bitbanding'u.<br /></div><br />Ta lektura bynajmniej nie potwierdza Twojej tezy.</div><br />Nie wiem czy chcesz się czegoś dowiedzieć, czy coś mi chcesz udowodnić.<br />Jeżeli punk 1 to mogę jeszcze Ci coś napisać.<br />Jeżeli 2 to zakończmy tą dyskusję i każdy niech pozostanie przy swoim zdaniu.<br />Każdy ma prawo do swojej opini.<br />Twierdziłeś,że procesory nie mogą adresować poszczególnych bitów.<br />Podesłałem Ci mapę 8051 gdzie tam jest wprost adresowanie bitowe.<br />Podesłałem Ci informację o bitbandingu który się stosuje właśnie po to aby bezpośrednio operować na bitach a ty Ciągle, że to nie potwierdza mojej tezy.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 10 minutach ]</span></strong><br /><br />Sorry nie zwróciłem uwagi, że to kto inny.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 11 minutach ]</span></strong><br /><br /><div class="quotetitle">fofex napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">auers napisał(a):</div><div class="quotecontent">Poczytaj np. o bitbanding'u.<br /></div><br />Ta lektura bynajmniej nie potwierdza Twojej tezy.</div><br />To niby jakiej tezy?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 25 maja 2020, o 20:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2020-05-25T20:07:14+01:00</updated>
<published>2020-05-25T20:07:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227578#p227578</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227578#p227578"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227578#p227578"><![CDATA[
<div class="quotetitle">auers napisał(a):</div><div class="quotecontent"><br />Poczytaj np. o bitbanding'u.<br /></div><br />Ta lektura bynajmniej nie potwierdza Twojej tezy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 25 maja 2020, o 20:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-05-25T19:41:00+01:00</updated>
<published>2020-05-25T19:41:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227577#p227577</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227577#p227577"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227577#p227577"><![CDATA[
Potrzebne jest 8bit na rejestr przechowujący flagi - tu się zgadzamy<br />Powiedz mi jak odczytasz te flagi bez 8b maski albo kilku zbędnych instrukcji ASM <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=17861">abel11</a> — 25 maja 2020, o 19:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2020-05-25T19:08:15+01:00</updated>
<published>2020-05-25T19:08:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227575#p227575</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227575#p227575"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227575#p227575"><![CDATA[
Pozwolę się nie zgodzić z tobą. Lata temu pisałem w asm zarówno na 8051 jak i na AVR kiedy jeszcze nawet atmeg nie było.<br />Wykorzystywałem pojedyncze bity na flagi o ile były mi potrzebne. Nikomu wówczas nie przyszło do głowy, aby na jeden bit tracić cały bajt. Ale to były inne czasy.<br />Po przesiadce na C byłem &quot;w szoku&quot;, że tego nie oferuje.<br />Wiadomo, że jak masz tylko 1 bit to i tak tracisz cały bajt. Ale przy 8 bitach możesz spokojnie wykorzystać jeden bajt na 8 różnych flag.<br />W C też się to da uzyskać, ale musisz albo zadeklarować unię, albo maskować. I uzyskasz wówczas dostęp do poszczególnych bitów. Czyli się da, tylko kompilator C wprost sam z siebie tego nie oferuje.<br />Aby to uzyskać nie rezerwuje się w pamięci dla osobnych adresów na bajt i nr bitu, tylko tworzysz odpowiedni kod który odpowiednio odczytuje/zapisuje dane tam gdzie chcesz.<br />Dla zobrazowania przykład:  <br />[syntax=c]#define moja_flaga 1<br />#define druga_flaga 2<br />register uint8_t bajt_na_flagi;[/syntax]<br /> i Jak chcesz coś zapisać do flagi to w asm byłoby:<br />[syntax=c]sbr bajt_na_flagi,moja_flaga[/syntax]<br />a teraz wyzerowanie drugiej flagi:<br />[syntax=c]cbr bajt_na_flagi,druga_flaga;[/syntax]<br /><br />I ile pamięci zostało wykorzystane. I myślisz, że kompilator nie byłby wstanie tego ogarnąć?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 20 minutach ]</span></strong><br /><br />Moim zdaniem jeżeli chodzi o C, to niestety kuleje jeżeli chodzi o operacje 1 bitowe.<br />Najprostszy przykład skasowanie jednego bitu na wyjściu PORT'u. <br />W asm jedna linijka:<br />[syntax=c]cbi PORTA,1[/syntax]<br />A w C pobierz stan portu, zaneguj maskę, zrób AND, dopiero ustaw port.<br />Kompilator długo nie wiedział o instrukcjach sbi, cbi, na szczęście od jakiegoś czasu już to ogarnia.<br />Aby była jasność odkąd przesiadłem się na C już nie wróciłem do asm (i większość rzeczy zapomniałem). <br />Nie ma porównania jeżeli chodzi o szybkość tworzenia kod, jego czytelność itd.<br />Z jego brakami można żyć i po przyzwyczajeniu się, nawet się tego nie odczuwa. <br />Natomiast nie jest to język idealny i część rzeczy których w nim nie ma, nie wynika z tego że procesory tego nie oferują tylko, taka specyfika języka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 25 maja 2020, o 19:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-05-25T18:11:17+01:00</updated>
<published>2020-05-25T18:11:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227573#p227573</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227573#p227573"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227573#p227573"><![CDATA[
Nie stworzysz zmiennych które zajmują tylko jeden bit ponieważ:<br />1) Pamięć jest adresowana co 8 bitów, więc musisz zaadresować CAŁY bajt<br />2) Dopiero w bajcie możesz ustawiać/kasować bit.<br />Z tego wynika, że musisz zająć 2 bajty żeby zaadresować pojedynczy bit albo możesz zająć 1 bajt robiąc to tak jak teraz się to robi.<br /><br />Jeśli masz blok pamięci jak niżej<br />[syntax=c]adr. komórki, wartość<br />0x01          0b0001 0010<br />0x02          0b0011 0100[/syntax]<br />Jak chciał byś zaadresować 5 bit w komórce 0x1 wykorzystując 1 bit ?<br />SBR 0x01, #5 ; już masz 8 bitów na ustawienie 1 (nie wiem czy w AVR będzie dokładnie tak wyglądała składnia asm)<br /><br />Żeby stworzyć pamięć &quot;adresowaną&quot; bitowo musiał byś najpierw zaadresować bajt na dane, a później dla każdego bitu wykorzystać cały kolejny bajt na numer bitu lub maskę (gdzieś trzeba zapisać numer bitu dla instrukcji SBR, CBR, SBRS, SBRC), w ten sposób otrzymujesz boola który zajmuje 2 bajty... rezultat jest gorszy niż aktualne rozwiązanie w C.  Jak byś chciał sterować wykonywaniem kodu dla odczytania 1 boola, to miał byś 1-3 cykle zegara na sam SBRS/SBRC, nie wspominając o zajęciu co najmniej 2 bajtów pamięci programu na instrukcję i pomijaną instrukcję plus 1 bajt na wartość domyślną, w sumie masz 3 bajty progmem + 1 bajt w ramie i 3-5 cykli zegara, nie wspominając że taka zmienna była by po prostu małym podprogramem więc jeszcze instrukcja skoku, albo powielanie tych kilu instrukcji w każdym odwołaniu do zmiennej.<br />Natomiast stary dobry MOV zajmuje 1 bajt i przenosi 8/16 bit za jednym cyklem zegara.<br />Podobnie działają pola bitowe w strukturach, masz dane na jednym bajcie, a przesunięcia bitowe kompilator przypisuje w czasie kompilacji - w dalszym ciągu adresuje 1 bajt i porównuje go z maską/przesunięciem bitowym.<br /><br />Tak na chłopski rozum, jak mi to jeszcze w technikum tłumaczył nauczyciel. Bajt to jak szuflada z 8 przegródkami, najpierw kompilator musi wiedzieć która szufladę ma wysunąć, a później z której przegrody coś Ci podać. Jeśli ktoś by Tobie powiedział podaj mi coś z 2 przegrody, w sytuacji kiedy masz 1000 szuflad to byś spojrzał na takiego delikwenta z politowaniem i tyle. Właśnie tak działa pamięć w uC; w 8051 czyli architekturze Harvardzkiej masz jeszcze banki pamięci w których są umieszczone SFR jak i ogólny RAM, do przykładu powyżej każdy bank to szafka z szufladami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17861">abel11</a> — 25 maja 2020, o 18:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2020-05-25T16:27:12+01:00</updated>
<published>2020-05-25T16:27:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227570#p227570</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227570#p227570"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227570#p227570"><![CDATA[
No ale tak to jest realizowane, jest obszar adresowy bitowo, a takie same adresy ma również standardowo adresowana pamięć.<br />Aby było jednoznaczne do czego się odwołujesz, używa się różnych instrukcji asm.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 16 minutach ]</span></strong><br /><br />Masz link np. do architektury 8051 który ma obszar adresowany bitowo:<br /><a href="http://staff.uz.zgora.pl/mkoziol/mcs51/budowa51/pamiec.html"  class="postlink">http://staff.uz.zgora.pl/mkoziol/mcs51/budowa51/pamiec.html</a><br />Natomiast jak zajrzysz do listy rozkazów avr, są tam instrukcje:<br />SBR, CBR, SBRS, SBRC.<br />Nic nie stoi na przeszkodzie aby tworzyć zmienne/flagi typu bool które będą zajmowały w pamięci tylko jeden bit.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 25 maja 2020, o 16:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-05-25T16:07:03+01:00</updated>
<published>2020-05-25T16:07:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227569#p227569</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227569#p227569"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227569#p227569"><![CDATA[
Mówisz o operacjach bitowych na SFR, to nie jest adresowanie pojedynczych bitów, masz po prostu w OPCODE instrukcji zaszyty adres komórki pamięci i numer bitu, ewentualnie ustawiasz maskę na numer bitu w rejestrze. Zastanów się dlaczego instrukcja SBI (Set Bit in I/O Register) wymaga 2 cykli zegara, a instrukcja MOV (Move Between Registers) oraz MOVW(Copy Register Word) wymagają tylko po jednym cyklu, pomimo że MOVW przenosi 16b w 8 bitowym procku.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17861">abel11</a> — 25 maja 2020, o 16:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2020-05-25T15:15:33+01:00</updated>
<published>2020-05-25T15:15:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227568#p227568</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227568#p227568"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227568#p227568"><![CDATA[
Poczytaj o zamianie liczb dziesiętnych na binarne i odwrotnie bo: <br />0b11111111 = 255; a nie 1.<br />0b00000001 = 1;<br />Reszta Ok, tylko nie wiem czemu ma to służyć, bo na porcie nic się nie zmienia.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 8 minutach ]</span></strong><br /><br /><div class="quotetitle">abel11 napisał(a):</div><div class="quotecontent"><br />Nie spotkałem się z takimi procesorami, adresowanie pojedynczych bitów wydaje mi się w ogóle mocno nietrafionym pomysłem, ponieważ potrzebny jest adres komórki pamięci, która przechowuje sam bit, plus kolejna komórka pamięci na samą maskę bitową.<br /></div><br />To zajrzyj do noty dowolnej atmegi.  Nawet one mają bitowe adresowanie obszaru I/O. A na dowolnym rejestrze możesz wykonać operacje ustawienia/odczytu pojedyńczego bitu.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 42 minutach ]</span></strong><br /><br />Dodam jeszcze, że takie obszary pamięci adresowane bitowo były dostępne na takich dziadkach jak 8051 i są dostępne na współczesnych 32 bitowcach.<br />Poczytaj np. o bitbanding'u.<br />Tak, że z tym nietrafionym pomysłem niestety ale nietrafiłeś. Jest to bardzo wydajne rozwiązanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 25 maja 2020, o 15:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-05-25T15:17:19+01:00</updated>
<published>2020-05-25T15:14:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227567#p227567</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227567#p227567"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227567#p227567"><![CDATA[
Nie, wartość nextbit = 1 to 1, a nie 255.<br />Czyli nextbit = 0b00000001;<br /><br />Jeśli wpiszesz coś takiego<br />nextbit = 0b11111111;<br />To będzie tak jak w Twoim przykładzie<br /><br /><div class="quotetitle">auers napisał(a):</div><div class="quotecontent"><br />Akurat tu się nie do końca zgadzam. Są procki które umożliwiają adresowanie bitowe (pewnych obszarów pamięci), jak również mają instrukcje asm do operowania na poszczególnych bitach. To jest bardziej cecha i ograniczenie C niż samych procesorów.<br /></div><br />Nie spotkałem się z takimi procesorami, adresowanie pojedynczych bitów wydaje mi się w ogóle mocno nietrafionym pomysłem, ponieważ potrzebny jest adres komórki pamięci, która przechowuje sam bit, plus kolejna komórka pamięci na samą maskę bitową. Co daje wolniejszy zapis, wolniejszy odczyt i większe zużycie pamięci, jedyne miejsce gdzie to miało by sens to CPLD i FGPA bo tam bit to po prostu wyjście układu bramek/LUT, wiec operujesz na tylu bitach na ilu trzeba. <br />Jak masz jakieś info gdzie można poczytać o uC z adresowaniem bitowym będę wdzięczny za link albo cośkolwiek, bo zainteresowałeś mnie tym.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17861">abel11</a> — 25 maja 2020, o 15:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dzajo16]]></name></author>
<updated>2020-05-25T14:57:50+01:00</updated>
<published>2020-05-25T14:57:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227566#p227566</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227566#p227566"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227566#p227566"><![CDATA[
[syntax=c]// jeśli zmienna nextbit ma wartość 1 to jeśli dobrze rozumiem w pamięci ma postać:<br />nextbit = 0b11111111;<br /><br />// np.PORTA ma takie ustawienie <br />PORTA = 0b00000010;<br /><br />// czy dopuszczalne jest takie działanie w wyniku którego <br />//pin PA1 będzie ustawiony dalej na 1<br /><br />PORTA = (nextbit &amp; PORTA);<br /><br />// po operacji wyobrażam sobie, że PORTA ma postać<br />PORTA = 0b00000010;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9311">dzajo16</a> — 25 maja 2020, o 14:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2020-05-24T22:31:37+01:00</updated>
<published>2020-05-24T22:31:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227553#p227553</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227553#p227553"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227553#p227553"><![CDATA[
<div class="quotetitle">abel11 napisał(a):</div><div class="quotecontent"><br />kompilator nie dzieli jednej komórki pamięci na pojedyncze bity po jednym dla każdego boola, bo procesor nie był by w stanie takich komórek zaadresować (adresowane są 8 bitowe komórki, a nie pojedyncze bity).<br /></div><br />Akurat tu się nie do końca zgadzam. Są procki które umożliwiają adresowanie bitowe (pewnych obszarów pamięci), jak również mają instrukcje asm do operowania na poszczególnych bitach. To jest bardziej cecha i ograniczenie C niż samych procesorów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 24 maja 2020, o 22:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[abel11]]></name></author>
<updated>2020-05-24T22:18:30+01:00</updated>
<published>2020-05-24T22:18:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227552#p227552</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227552#p227552"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227552#p227552"><![CDATA[
1) Sprawdź jak wygląd plik stdbool.h masz tam coś w tym stylu:<br />[syntax=c]#define true 0x1<br />#define false 0x0[/syntax]Ponieważ wykonujesz operację logiczną &amp; której wynikiem może być tylko 1 lub 0, kompilator nie mógł by przypisać tam czegoś innego niż 1 lub 0. Tak czy siak zmiennej zostanie przypisany rozmiar równy rozmiarowi komórki pamięci w zależności od procesora czyli w 8 bitowym będzie to 8bit (tyle samo ma char), kompilator nie dzieli jednej komórki pamięci na pojedyncze bity po jednym dla każdego boola, bo procesor nie był by w stanie takich komórek zaadresować (adresowane są 8 bitowe komórki, a nie pojedyncze bity).<br /><br />2) Ciężko powiedzieć na podstawie 4 liniowego wycinku kodu co autor miał na myśli nadając taki typ. Być może to ma być potem przekazane jako adres do odczytu z tablicy i później jest dalej przeliczane, może jest przekazywane jako argument do funkcji która przyjmuje typ char, albo miał taki kaprys wiedząc że i tak tyle samo pamięci zajmie bool jak i char.  W kwestii nazewnictwa zmiennych to nazwa zmiennej powinna sama się tłumaczyć, tak samo nazwa funkcji/metody itp. więc tu zmienna przechowuje 1 bit jak w nazwie <em>nextbit</em>, może to trochę mylące, że nie ma typu bool ale nazwa tłumaczy co będzie w zmiennej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17861">abel11</a> — 24 maja 2020, o 22:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2020-05-24T21:42:16+01:00</updated>
<published>2020-05-24T21:42:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227551#p227551</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227551#p227551"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227551#p227551"><![CDATA[
<div class="quotetitle">dzajo16 napisał(a):</div><div class="quotecontent"><br />Dlaczego np. nie użyto tutaj typu bool jeśli chce się przechować stan 1 lub 0 tylko akurat char jak do stringa?<br /></div><br />Bo w C nie ma typu &quot;bool&quot; (No może i jest).  A wyniki operacji logicznych zwracane są do typów całkowitych, może to być char, int, uint8_t bez różnicy.<br /><div class="quotetitle">dzajo16 napisał(a):</div><div class="quotecontent"><br />Wynik z typu unsigned long wpisujemy do char, to zachodzi tutaj jakaś niejawna konwersja.<br /></div><br />Nie ma żadnej konwersji. Do zmiennej nextbit zwracany jest wynik operacji logicznej !=  co daje 0 lub 1.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 24 maja 2020, o 21:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dzajo16]]></name></author>
<updated>2020-05-24T21:34:03+01:00</updated>
<published>2020-05-24T21:34:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227550#p227550</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227550#p227550"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227550#p227550"><![CDATA[
To jeszcze dwa pytania:<br />1.Zastanawia mnie jak to działa. Bo to są rożne typy. Wynik z typu unsigned long wpisujemy do char, to zachodzi tutaj jakaś niejawna konwersja.<br />2. Dlaczego np. nie użyto tutaj typu bool jeśli chce się przechować stan 1 lub 0 tylko akurat char jak do stringa?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9311">dzajo16</a> — 24 maja 2020, o 21:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[auers]]></name></author>
<updated>2020-05-24T18:39:45+01:00</updated>
<published>2020-05-24T18:39:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227549#p227549</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227549#p227549"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227549#p227549"><![CDATA[
<div class="quotetitle">dzajo16 napisał(a):</div><div class="quotecontent"><br />Typ unsigned char ma jeden bit, więc podejrzewam, że wynik będzie zapisany binarnie.<br /></div><br />Coś tu przekombinowałeś.<br />Typ char to nie jeden bit tylko bajt, a każdy wynik/liczba w komputerach jest zapisywana binarnie.<br />Natomiast sam wynik operacji logicznej będzie 0 lub 1.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7806">auers</a> — 24 maja 2020, o 18:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dzajo16]]></name></author>
<updated>2020-05-24T17:58:08+01:00</updated>
<published>2020-05-24T17:58:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227546#p227546</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227546#p227546"/>
<title type="html"><![CDATA[Problem ze zrozumieniem zapisu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23154&amp;p=227546#p227546"><![CDATA[
Witam,<br /><br /> spotkałem się z takim zapisem i nie jestem pewien czy dobrze to rozumiem:<br /><br />[syntax=c]unsigned long regval = 0x00304D10;<br /><br />unsigned char nextbit;<br />unsigned long regmask = 0x1000000;<br /><br />nextbit = (regval &amp; regmask) != 0;[/syntax]<br /><br />Moje pytanie jak będzie wyglądała wartość wpisana do zmiennej nextbit. Typ unsigned char ma jeden bit, więc podejrzewam, że wynik będzie zapisany binarnie. W związku z tym wyobrażam sobie dwie możliwości: <br /><br />[syntax=c]// pierwsza możliwość<br />nextbit = 0b01111111 // dla wartości True<br />nextbit = 0b00000000 // dla wartości False<br /><br />// lub druga możliwość<br />nextbit = 1 // dla wartości True<br />nextbit = 0 // dla wartości False[/syntax]<br /><br />Nie wiem czy/i któraś jest prawidłowa. Bardzo proszę o pomoc <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=9311">dzajo16</a> — 24 maja 2020, o 17:58</p><hr />
]]></content>
</entry>
</feed>