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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-10-07T12:47:24+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=19320&amp;mode</id>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-10-07T12:47:24+01:00</updated>
<published>2017-10-07T12:47:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196602#p196602</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196602#p196602"/>
<title type="html"><![CDATA[Re: Funkcja ze wstawkami asemblerowymi (AVR)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196602#p196602"><![CDATA[
Dzięki Panowie, na razie skupię się na tym co napisał Kolega andrews.<br />Podejmę kolejną próbę przerobienia poradnika o wstawkach asemblerowych, bo czuję, że ten sposób podejścia do asemblera chyba mi najbardziej pasuje.<br />Spróbuję napisać plik .S z funkcją bazową tak by był czymś w rodzaju biblioteki do reszty projektu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 7 paź 2017, o 12:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-10-06T16:42:14+01:00</updated>
<published>2017-10-06T16:42:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196554#p196554</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196554#p196554"/>
<title type="html"><![CDATA[Re: Funkcja ze wstawkami asemblerowymi (AVR)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196554#p196554"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"> kod, który piszę na pewno jest mało optymalny<br /></div><br />Ale ta funkcja którą tu pokazałeś WCALE nie jest mało optymalna ... sporo osób robi to w pętli, przy okazji przesuwając bit w zmiennej - i sprawdzając go ... ale to zawsze jest o wiele bardziej czasochłonne niż rozbicie tego na IF() jak zrobiłeś ponieważ to da o wiele optymalniejszy kod <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> więc w jakiś sposób podświadomie to czujesz</div><br />A bo właśnie tego nauczyłem się z poradników, głównie tych o magic ledach <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Bardziej pisałem o &quot;reszcie kodu&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Zresztą, za niedługo, całość opublikuję na forum,to będzie można się zastanowić nad dodatkowymi optymalizacjami.<br />Sprzęt już działa, ale próbuję wycisnąć jeszcze co się da.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 6 paź 2017, o 16:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Nefarious19]]></name></author>
<updated>2017-10-06T16:27:44+01:00</updated>
<published>2017-10-06T16:27:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196551#p196551</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196551#p196551"/>
<title type="html"><![CDATA[Re: Funkcja ze wstawkami asemblerowymi (AVR)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196551#p196551"><![CDATA[
Ja sobie tak myślę że skoro i tak wykorzystujesz 4bity (młodsze) portu które są obok siebie to  zamiast robić to na ifach, mógłbyś przypisać starszą połówkę *data po odwróceniu bitów bezpośrednio do portu. Jak szybko to zrobić? zrobic lookup table z 16 wartosciami np:<br /><br />uint8_t tab[16] = <br />{<br />  0,<br />8,<br />4,<br />12,<br />2,<br />10,<br />6,<br />14,<br />1,<br />9,<br />5,<br />13,<br />3,<br />11,<br />7,<br />15<br /><br />};<br /><br />wtedy odwołujesz się po indeksie i masz odwrócony bajt.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2500">Nefarious19</a> — 6 paź 2017, o 16:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-10-06T15:51:31+01:00</updated>
<published>2017-10-06T15:51:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196549#p196549</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196549#p196549"/>
<title type="html"><![CDATA[Re: Funkcja ze wstawkami asemblerowymi (AVR)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196549#p196549"><![CDATA[
Pisząc w asm, każdą z ośmiu sekwencji trwającą 5 lub 6 taktów zegara:<br />[syntax=asm]// w rejestrze r24 jest załadowana wartość<br />// wskazywana przez argument 'data'<br />  80:   87 ff           sbrs    r24, 7     // 1 takt      |  2 takty<br />  82:   02 c0           rjmp    .+4        // 2 takty     |<br />  84:   c0 9a           sbi     0x18, 0    //             |  2 takty<br />  86:   01 c0           rjmp    .+2        //             |  2 takty<br />  88:   c0 98           cbi     0x18, 0    // 2 takty     |<br />                              // łącznie      5 taktów    |  6 taktów<br />// i tak dla każdego z 8 bitów (czyli łącznie 48 taktów)[/syntax]<br />można zastąpić (przy założeniu, że wszystkie bity ustawiamy na jednym porcie i żadna procedura obsługi przerwania nie modyfikuje w międzyczasie rejestru PORTB):<br />[syntax=c]// w rejestrze r24 jest załadowana wartość wskazywana przez argument 'data'<br />// przeznaczamy np. rejestr r16 na przygotowanie wartości całego portu<br />    in r16, PORTB      // 1 takt<br />// powyższą sekwencję zmieniamy na<br />    bst r24, 7        // 1 takt<br />    bld r16, 0        // 1 takt<br />              // łącznie 2 takty<br />// dla 8 bitów łącznie 16 taktów<br /><br />// przygotowany rejestr r16 wpisujemy do portu <br />    out PORTA, r16[/syntax]<br />Dodatkową zaletą takiego rozwiązania w niektórych przypadkach może być to, że wszystkie bity portu są zmieniane jednocześnie.<br />Niezależnie od tego, czy tu jest to istotne, czy nie, myślę że tu może się znaleźć pole do popisu dla asemblera.<br /><br />Niestety wstawek inline assembler nie lubię pisać, więc nie wyręczę w tym względzie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Można zamiast tego skorzystać z mojego poradnika (<a href="http://forum.atnel.pl/topic16484.html#p171580"  class="postlink">Miksowanie kodu C i ASM przy użyciu GCC</a>) i napisać taką funkcję w osobnym pliku.<br /><br />_________________<br /><a href="http://forum.atnel.pl/topic19149.html#p194736"  class="postlink">AVR-GCC - dane w pamięci FLASH</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 6 paź 2017, o 15:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-06T15:02:02+01:00</updated>
<published>2017-10-06T15:02:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196547#p196547</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196547#p196547"/>
<title type="html"><![CDATA[Re: Funkcja ze wstawkami asemblerowymi (AVR)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196547#p196547"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />kod, który piszę na pewno jest mało optymalny<br /></div><br />Ale ta funkcja którą tu pokazałeś WCALE nie jest mało optymalna ... sporo osób robi to w pętli, przy okazji przesuwając bit w zmiennej - i sprawdzając go ... ale to zawsze jest o wiele bardziej czasochłonne niż rozbicie tego na IF() jak zrobiłeś ponieważ to da o wiele optymalniejszy kod <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> więc w jakiś sposób podświadomie to czujesz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 paź 2017, o 15:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-10-06T14:49:38+01:00</updated>
<published>2017-10-06T14:49:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196544#p196544</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196544#p196544"/>
<title type="html"><![CDATA[Re: Funkcja ze wstawkami asemblerowymi (AVR)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196544#p196544"><![CDATA[
Na razie dzięki za szczegółowy opis, temat podejmę dopiero wieczorem.<br />Na szybko:<br />- temat asemblera do tej pory &quot;odrzucałem&quot;, ale czasem podglądam .lss i poradniki i coś za mgłą jest <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />- Gadżeta używam, ale rzadko, bo niestety nie chce u mnie działać z workspace, który jest na dysku sieciowym i gdy jestem zmuszony przerzucam projekty na dysk lokalny.<br />- kod, który piszę na pewno jest mało optymalny <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ale projekt na nim oparty muszę kończyć wreszcie i stąd desperackie próby &quot;przyspieszenia&quot;, choć to trochę w ramach takiego testu i ostatecznej próby wzięcia byka za rogi (tzn asm)<br />- poradniki  o asm oglądałem, ale niestety poddawałem się szybko, być może po tym wątku przełamię się <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=16487">Zealota</a> — 6 paź 2017, o 14:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-10-06T13:55:57+01:00</updated>
<published>2017-10-06T13:55:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196534#p196534</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196534#p196534"/>
<title type="html"><![CDATA[Re: Funkcja ze wstawkami asemblerowymi (AVR)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196534#p196534"><![CDATA[
ja tak z marszu sam nigdy nie pamiętam ale wtedy też sam zaglądam do swoich poradników - a czy widziałeś może ten ?<br /><br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=4jIIOERYnwY" >https://www.youtube.com/watch?v=4jIIOERYnwY</a><!-- m --><br /><br />Poza tym, kod który pokazałeś można jeszcze nieco zoptymalizować w C a co za tym idzie także w asemblerze ...<br /><br />Ale zanim coś zaproponuję to zapytam bo nie pamiętam ? czy ty piszesz dobrze programy w asemblerze ? czujesz się w nim jak ryba w wodzie? Dlaczego pytam? Bo jeśli nie do końca czujesz się dobry w ASM to niestety swoją wstawką możesz to niechcący zrobić np gorzej (dłużej) niż to zrobi sam C ....<br /><br />dlatego kolejne pytanie - czy sprawdzałeś plik *.lss i jak wygląda kod tej funkcji po kompilacji do ASM ? czy uważasz, że można go skrócić ? Moim zdaniem jest dość bardzo optymalny proszę:<br />[syntax=asm]0000007c &lt;write_byte&gt;:<br />  7c:fc 01       movwr30, r24<br />  7e:db 01       movwr26, r22<br />  80:80 81       ldr24, Z<br />  82:87 ff       sbrsr24, 7<br />  84:02 c0       rjmp.+4      ; 0x8a &lt;write_byte+0xe&gt;<br />  86:c0 9a       sbi0x18, 0; 24<br />  88:01 c0       rjmp.+2      ; 0x8c &lt;write_byte+0x10&gt;<br />  8a:c0 98       cbi0x18, 0; 24<br />  8c:80 81       ldr24, Z<br />  8e:86 ff       sbrsr24, 6<br />  90:02 c0       rjmp.+4      ; 0x96 &lt;write_byte+0x1a&gt;<br />  92:c1 9a       sbi0x18, 1; 24<br />  94:01 c0       rjmp.+2      ; 0x98 &lt;write_byte+0x1c&gt;<br />  96:c1 98       cbi0x18, 1; 24<br />  98:80 81       ldr24, Z<br />  9a:85 ff       sbrsr24, 5<br />  9c:02 c0       rjmp.+4      ; 0xa2 &lt;write_byte+0x26&gt;<br />  9e:c2 9a       sbi0x18, 2; 24<br />  a0:01 c0       rjmp.+2      ; 0xa4 &lt;write_byte+0x28&gt;<br />  a2:c2 98       cbi0x18, 2; 24<br />  a4:80 81       ldr24, Z<br />  a6:84 ff       sbrsr24, 4<br />  a8:02 c0       rjmp.+4      ; 0xae &lt;write_byte+0x32&gt;<br />  aa:c3 9a       sbi0x18, 3; 24<br />  ac:01 c0       rjmp.+2      ; 0xb0 &lt;write_byte+0x34&gt;<br />  ae:c3 98       cbi0x18, 3; 24<br />  b0:8c 91       ldr24, X<br />  b2:83 ff       sbrsr24, 3<br />  b4:02 c0       rjmp.+4      ; 0xba &lt;write_byte+0x3e&gt;<br />  b6:c0 9a       sbi0x18, 0; 24<br />  b8:01 c0       rjmp.+2      ; 0xbc &lt;write_byte+0x40&gt;<br />  ba:c0 98       cbi0x18, 0; 24<br />  bc:8c 91       ldr24, X<br />  be:82 ff       sbrsr24, 2<br />  c0:02 c0       rjmp.+4      ; 0xc6 &lt;write_byte+0x4a&gt;<br />  c2:c1 9a       sbi0x18, 1; 24<br />  c4:01 c0       rjmp.+2      ; 0xc8 &lt;write_byte+0x4c&gt;<br />  c6:c1 98       cbi0x18, 1; 24<br />  c8:8c 91       ldr24, X<br />  ca:81 ff       sbrsr24, 1<br />  cc:02 c0       rjmp.+4      ; 0xd2 &lt;write_byte+0x56&gt;<br />  ce:c2 9a       sbi0x18, 2; 24<br />  d0:01 c0       rjmp.+2      ; 0xd4 &lt;write_byte+0x58&gt;<br />  d2:c2 98       cbi0x18, 2; 24<br />  d4:8c 91       ldr24, X<br />  d6:80 ff       sbrsr24, 0<br />  d8:02 c0       rjmp.+4      ; 0xde &lt;write_byte+0x62&gt;<br />  da:c3 9a       sbi0x18, 3; 24<br />  dc:08 95       ret<br />  de:c3 98       cbi0x18, 3; 24<br />  e0:08 95       ret[/syntax]<br /><br />no ale dobrym przemyśleniem kodu w C - można go jeszcze ciut stuningować <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> przypomnę twoja funkcja wygląda oryginalnie tak:<br /><br />[syntax=c]void write_byte( uint8_t *data, uint8_t *data1 ) {<br /><br />        if ( *data &amp; 0x80 )     SET0_HI; else SET0_LO;<br />        if ( *data &amp; 0x40 )     SET1_HI; else SET1_LO;<br />        if ( *data &amp; 0x20 )     SET2_HI; else SET2_LO;<br />        if ( *data &amp; 0x10 )     SET3_HI; else SET3_LO;<br /><br />        if ( *data1 &amp; 0x08 )    SET0_HI; else SET0_LO;<br />        if ( *data1 &amp; 0x04 )    SET1_HI; else SET1_LO;<br />        if ( *data1 &amp; 0x02 )    SET2_HI; else SET2_LO;<br />        if ( *data1 &amp; 0x01 )    SET3_HI; else SET3_LO;<br />}[/syntax]<br /><br />jak chodzi o to co wyżej pokazałem w ASM z pliku *.lss <br /><br />No to teraz powiedz mi też czy korzystasz w ogóle np z programu Eclipse Gadget bo on też już na pierwszy rzut oka pomaga oceniać pewne nasze działania w C w aspekcie tego jak to wygląda później w ASM we flashu - zobaczmy ile pokazuje zajętości flasha w byle testowym programie pustym prawie z tą funkcją:<br /><br /><img src="https://obrazkiforum.atnel.pl/54/f6cef0a2ef27422884e4b8326db4d5ec.jpg" alt="Obrazek" /><br /><br />no to teraz pomyśl - w KAŻDYM warunku IF() odwołujesz się jakby bezpośrednio do pamięci za pomocą wskaźników *data oraz *data1. Oczywiście jak widać po kodzie ASM na górze kompilator i tak był mądry <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i wrzucił na początku te dane do rejestru, czyli sam zoptymalizował twoje podejście - chodzi o ten fragment:<br /><br />[syntax=asm]0000007c &lt;write_byte&gt;:<br />  7c:fc 01       movwr30, r24<br />  7e:db 01       movwr26, r22<br />  80:80 81       ldr24, Z<br />  82:87 ff       sbrsr24, 7<br />  ......<br />  ......[/syntax]<br /><br />i później jak widzisz - już całość leci tzn jest sprawdzane z rejestru r24 a nie z RAM więc DUŻO szybciej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> oczywiście później jest gdzieś przeładowany znowu na potrzeby *data1<br /><br />ale może by tak od razu w C to zrobić, żeby kompilator zauważył, że my sami mocno kombinujemy w celu polepszenia kodu że tak powiem, to może jeszcze lepiej uda się wymyślić mu dla nas swoją optymalizację ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />w takim razie napiszmy twoją funkcję od nowa ale właśnie na tych zasadach jak to &quot;za twoimi&quot; pleckami zrobił kompilator w ASM<br /><br />[syntax=c]void write_byte( uint8_t *data, uint8_t *data1 ) {<br /><br />    register uint8_t reg = *data;<br /><br />        if ( reg &amp; 0x80 )     SET0_HI; else SET0_LO;<br />        if ( reg &amp; 0x40 )     SET1_HI; else SET1_LO;<br />        if ( reg &amp; 0x20 )     SET2_HI; else SET2_LO;<br />        if ( reg &amp; 0x10 )     SET3_HI; else SET3_LO;<br /><br />        reg = *data1;<br /><br />        if ( reg &amp; 0x08 )    SET0_HI; else SET0_LO;<br />        if ( reg &amp; 0x04 )    SET1_HI; else SET1_LO;<br />        if ( reg &amp; 0x02 )    SET2_HI; else SET2_LO;<br />        if ( reg &amp; 0x01 )    SET3_HI; else SET3_LO;<br />}[/syntax]<br /><br />teraz widzisz co zrobiliśmy ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> idąc w ślad za kompilatorem w ASM sami powołujemy sobie jedną zmienną ze specyfikatorem &quot;register&quot; aby dać znać kompilatorowi (poprosić go) - te stary - powołaj oddzielny rejestr i wrzuć do niego najpierw daną z *data i dalej porównuj już szybciej na tym rejestrze ... zaś w środku funkcji przeładujemy do niego *data1<br /><br />no to LU! - i proszę najpierw rzut oka na Eclipse Gadgeta <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i banan na twarzy - micha się cieszy bo jak widzimy -12 bajtów to znaczy, że pewnie będzie lepiej (choć wiadomo - nie zawsze tak musi być)<br /><br /><img src="https://obrazkiforum.atnel.pl/54/f59d50a19d431e012adb8d03de741d18.jpg" alt="Obrazek" /><br /><br />no ok to zajrzyjmy do pliku *.lss do ASM <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />[syntax=asm]0000007c &lt;write_byte&gt;:<br />  7c:fc 01       movwr30, r24<br />  7e:80 81       ldr24, Z<br />  80:87 ff       sbrsr24, 7<br />  82:02 c0       rjmp.+4      ; 0x88 &lt;write_byte+0xc&gt;<br />  84:c0 9a       sbi0x18, 0; 24<br />  86:01 c0       rjmp.+2      ; 0x8a &lt;write_byte+0xe&gt;<br />  88:c0 98       cbi0x18, 0; 24<br />  8a:86 ff       sbrsr24, 6<br />  8c:02 c0       rjmp.+4      ; 0x92 &lt;write_byte+0x16&gt;<br />  8e:c1 9a       sbi0x18, 1; 24<br />  90:01 c0       rjmp.+2      ; 0x94 &lt;write_byte+0x18&gt;<br />  92:c1 98       cbi0x18, 1; 24<br />  94:85 ff       sbrsr24, 5<br />  96:02 c0       rjmp.+4      ; 0x9c &lt;write_byte+0x20&gt;<br />  98:c2 9a       sbi0x18, 2; 24<br />  9a:01 c0       rjmp.+2      ; 0x9e &lt;write_byte+0x22&gt;<br />  9c:c2 98       cbi0x18, 2; 24<br />  9e:84 ff       sbrsr24, 4<br />  a0:02 c0       rjmp.+4      ; 0xa6 &lt;write_byte+0x2a&gt;<br />  a2:c3 9a       sbi0x18, 3; 24<br />  a4:01 c0       rjmp.+2      ; 0xa8 &lt;write_byte+0x2c&gt;<br />  a6:c3 98       cbi0x18, 3; 24<br />  a8:fb 01       movwr30, r22<br />  aa:80 81       ldr24, Z<br />  ac:83 ff       sbrsr24, 3<br />  ae:02 c0       rjmp.+4      ; 0xb4 &lt;write_byte+0x38&gt;<br />  b0:c0 9a       sbi0x18, 0; 24<br />  b2:01 c0       rjmp.+2      ; 0xb6 &lt;write_byte+0x3a&gt;<br />  b4:c0 98       cbi0x18, 0; 24<br />  b6:82 ff       sbrsr24, 2<br />  b8:02 c0       rjmp.+4      ; 0xbe &lt;write_byte+0x42&gt;<br />  ba:c1 9a       sbi0x18, 1; 24<br />  bc:01 c0       rjmp.+2      ; 0xc0 &lt;write_byte+0x44&gt;<br />  be:c1 98       cbi0x18, 1; 24<br />  c0:81 ff       sbrsr24, 1<br />  c2:02 c0       rjmp.+4      ; 0xc8 &lt;write_byte+0x4c&gt;<br />  c4:c2 9a       sbi0x18, 2; 24<br />  c6:01 c0       rjmp.+2      ; 0xca &lt;write_byte+0x4e&gt;<br />  c8:c2 98       cbi0x18, 2; 24<br />  ca:80 ff       sbrsr24, 0<br />  cc:02 c0       rjmp.+4      ; 0xd2 &lt;write_byte+0x56&gt;<br />  ce:c3 9a       sbi0x18, 3; 24<br />  d0:08 95       ret<br />  d2:c3 98       cbi0x18, 3; 24<br />  d4:08 95       ret[/syntax]<br /><br />nie wiem jak ty - ale moim zdaniem kod nie tylko jest krótszy więc zaoszczędzamy od razu ileś dodatkowych cykli zegara bo jest też bardziej optymalny od poprzedniego.<br /><br />Owszem i tak obydwa pięknie posługują się NAJKRÓTSZYMI instrukcjami<br /><br />sbi<br />cbi<br /><br />na potrzeby banglowania bitami - więc nawet poprzednia wersja nie jest taka zła - no ale ta ciut lepsza <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />czy można jeszcze to jakoś zoptymalizować pisząc to od nowa i w całości tylko jako wstawkę ASM ? nie wiem - pewnie można - ja już dawno nie ćwiczyłem asemblera więc nie wymyślę nic na gwałt ale też mam przeczucie, że no krócej się już nie da <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: 2 minutach ]</span></strong><br /><br />Uwaga na koniec, jeśli ta funkcja wykonuje się szybko - a tobie brakuje czasu to może też (być może - tak się tylko domyślam) być tak, że dookoła tej funkcji masz jakiegoś czaso-pożeracza - tzn np nieoptymalnie zorganizowaną jakąś pętlę gdzie tę funkcję wywołujesz itp itd<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 6 paź 2017, o 13:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-10-06T13:13:05+01:00</updated>
<published>2017-10-06T13:13:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196526#p196526</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196526#p196526"/>
<title type="html"><![CDATA[Funkcja ze wstawkami asemblerowymi (AVR)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19320&amp;p=196526#p196526"><![CDATA[
No i niestety tym razem padło na mnie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br />Potrzebuję ryby <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Jestem wyjątkowo uodporniony na asemblera, a staram się coś poprawić pod względem prędkości.<br />Poniżej kod, który należałoby zastąpić wstawką asemblerową. Kluczowy problemem dla mnie jest przekazanie wartości poprzez wskaźnik.<br />Pokrótce chodzi o zmianę stanu pinów na PORTB, w zależności od wartości bitu (0, 1) w bajcie.<br />[syntax=c]#define SET0_HIPORTB |=  (1&lt;&lt;PB0)<br />#define SET1_HIPORTB |=  (1&lt;&lt;PB1)<br />#define SET2_HIPORTB |=  (1&lt;&lt;PB2)<br />#define SET3_HIPORTB |=  (1&lt;&lt;PB3)<br /><br />#define SET0_LOPORTB &amp;= ~(1&lt;&lt;PB0)<br />#define SET1_LOPORTB &amp;= ~(1&lt;&lt;PB1)<br />#define SET2_LOPORTB &amp;= ~(1&lt;&lt;PB2)<br />#define SET3_LOPORTB &amp;= ~(1&lt;&lt;PB3)<br /><br /><br />/**************** A teraz spróbujemy w asemplerze **************************************/<br />void write_byte( uint8_t *data, uint8_t *data1 ) {<br /><br />if ( *data &amp; 0x80 ) SET0_HI; else SET0_LO;<br />if ( *data &amp; 0x40 )SET1_HI; else SET1_LO;<br />if ( *data &amp; 0x20 )SET2_HI; else SET2_LO;<br />if ( *data &amp; 0x10 )SET3_HI; else SET3_LO;<br /><br />if ( *data1 &amp; 0x08 )SET0_HI; else SET0_LO;<br />if ( *data1 &amp; 0x04 )SET1_HI; else SET1_LO;<br />if ( *data1 &amp; 0x02 )SET2_HI; else SET2_LO;<br />if ( *data1 &amp; 0x01 )SET3_HI; else SET3_LO;<br /><br />// A tu to samo ale w asemblerze :)<br />asm volatile(<br />&quot; &quot;<br />&quot; &quot;<br />&quot; &quot;<br />);[/syntax]<br /><br />Jeśli ktoś miałby chwilkę i trochę chęci, to bardzo proszę o wsparcie.<br />W razie pytań jestem do dyspozycji<br />Dzięki z góry.<br /><br />PS<br />Oczywiście przeglądnąłem poradniki z magick ledami, ale nie pomogły mi <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 6 paź 2017, o 13:13</p><hr />
]]></content>
</entry>
</feed>