<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <div class="moz-cite-prefix">Programování sice není moje hobby a
      dělám jen jednodušší věci s 8 bit silabsama, ale zrovna před pár
      dny jsem se divil, jak optimalizuje Keil. Protože UART mám už
      obsazený, napsal jsem si pro diagnostiku sériový výstup, který pak
      čtu osciloskopem. <br>
    </div>
    <div class="moz-cite-prefix">Vypadá to takhle.</div>
    <div class="moz-cite-prefix"><font face="Times New Roman">void
        Zobraz()<br>
        {<br>
                                                // prenos 438,6 KBd,
        idle level=high, 8 bit<br>
        byte Znakdp; byte i=2;<br>
        Test=0;                            // start impulz<br>
        Znakdp=Znakdisp;<br>
        Test=Znakdp&1;            // bit 0<br>
        Znakdp>>=1;                      <br>
        Test=Znakdp&1;            // bit 1<br>
        Znakdp>>=1;            <br>
        Test=Znakdp&1;            // bit 2<br>
        Znakdp>>=1;            <br>
        Test=Znakdp&1;            // bit 3<br>
        Znakdp>>=1;            <br>
        Test=Znakdp&1;            // bit 4<br>
        Znakdp>>=1;            <br>
        Test=Znakdp&1;            // bit 5<br>
        Znakdp>>=1;            <br>
        Test=Znakdp&1;            // bit 6<br>
        Znakdp>>=1;                <br>
        Test=Znakdp&1;            // bit 7<br>
        do { i--; }<br>
        while(i);<br>
        Test=1;                            // stop impulz<br>
        }                    <br>
      </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">Bylo mi
        divné, že jedna rotace vychází na 7 strojových cyklů, když
        silabsácká 8051 má většinu instrukcí na jeden strojový cykl
        (jednu periodu oscilátoru). Tak jsem se podíval, jak to
        překládá. Tady je výpis přenosu jednoho bitu.</font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">MOV A, R6<br>
        CLR C<br>
        RRC, A<br>
        MOV R6, A<br>
        RRC A<br>
        MOV A0.0H, C</font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman"><br>
      </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">Takže
        místo aby to nechal v A a jen po každé rotaci zkopíroval carry
        bit do výstupu (tady je to A0.0H, tedy bit 0 portu P2), měl to v
        registru R6 a po každé rotaci to tam strkal zpátky. Carry
        vynuluje, protože má "naučené", že rotace v céčku není rotace
        jako v asm, ale že ten carry se maže. Takže pak dělá ještě jednu
        rotaci, aby ten nejnižší bit přepsal do carry a carry do portu. </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman"><br>
      </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">Když jsem
        chtěl o kousek zpozdit stop bit, původně jsem napsal </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">i=0; </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">i++;</font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">To mi při
        překladu úplně vyhodil. Asi proto, že i se tam dál nepoužívá?
        Když jsem ale napsal <br>
      </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">do { i--;
        }<br>
        while(i);</font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">tak to už
        mi tam nechal. Ostatně proměnná Znakdp se taky pak už dál
        nepoužívá a po každé rotaci jí cpal zpátky do R6. Nevím, jestli
        je v tom nějaký záměr, nebo to tak zkrátka funguje a mám být
        rád, že to funguje... Bohužel, staré silabsácké IDE nezvládá
        kombinovat céčko a assembler. Kolega používá microvision a tam
        to jde, překladač Keil je v tom stejný. Nové simplicity studio
        by s tím snad už taky nemělo mít problém. Zatím jsem neměl sílu
        a důvod na něj přejít.<br>
      </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman"><br>
      </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">Ono teda s
        assemblerem je u silabsů trochu problém, protože ty mcu mají
        pipeline a jak si načítá instrukce dopředu a při nějakém skoku
        to zahodí a začne znova, podle situace je některá instrukce
        různě dlouhá. Snad jen skoky a volání. Takže assembler a céčko
        jsem kombinoval jen na starých 8051, kde to pro přesné časování
        ještě mělo význam a časovače tam byly hodně omezené.<br>
      </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman"><br>
      </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman">Anděl</font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman"><br>
      </font></div>
    <div class="moz-cite-prefix"><font face="Times New Roman"><br>
      </font></div>
    <div class="moz-cite-prefix">Dne 18.05.2024 v 21:47 Miroslav Mraz
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:b9f1d89d-008f-4e3a-982d-d2657f0f7e05@volny.cz">Hm, je to
      složité, bůhví jak to funguje, kód z toho leze dost hnusný, prostě
      to nebudu používat. U ARM jsem to nepoužíval taky a šlo to. To
      jen, že v původních příkladech to bylo použito, tak jsem to
      zkoušel taky. Moc se to nepovedlo.
      <br>
      <br>
      Mrazík
      <br>
      <br>
      On 18. 05. 24 20:00, Jindroush wrote:
      <br>
      <blockquote type="cite">On 18.05.2024 15:32, Miroslav Mraz wrote:
        <br>
        <blockquote type="cite">Víte někdo jak správně používat -flto
          při překladu pomocí gcc ? V poslední době se mi stává, že to
          vyoptimalizuje i funkce, které jsou tam opravdu potřebné. Ale
          je to u složitějších bare-metal projektů RISC-V a tak se mi
          nedaří vystopovat proč. Clang tím asi tak netrpí, tam se to
          zdá v pořádku.
          <br>
          Setkali jste se s tím třeba na ARM nebo AVR ? </blockquote>
        Ja tohle videl a pouzival u MSVC, tak jsem si aspon precet man,
        abych vedel, jak to u GCC funguje. Pisou tam zajimavou vec:
        <br>
        <br>
        <blockquote type="cite">it is necessary to make certain whole
          program assumptions. The compiler needs to know what functions
          and variables can be accessed by libraries and runtime outside
          of the link-time optimized unit. When supported by the linker,
          the linker plugin (see -fuse-linker-plugin) passes information
          to the compiler about used and externally visible symbols.
          When the linker plugin is not available, -fwhole-program
          should be used to allow the compiler to make these
          assumptions, which leads to more aggressive optimization
          decisions. </blockquote>
        Tutaj: <a class="moz-txt-link-freetext" href="https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html">https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html</a>
        <br>
        <br>
        -- <br>
        Jindroush<a class="moz-txt-link-rfc2396E" href="mailto:jindroush@seznam.cz"><jindroush@seznam.cz></a>
        <br>
        <br>
      </blockquote>
      _______________________________________________
      <br>
      HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
      <br>
      <a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
      <br>
      <a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
      <br>
    </blockquote>
    <p><br>
    </p>
  </body>
</html>