<!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>