<div dir="ltr"><div>Moje data konstantní nejsou, je to obsah MOdbus zprávy ze Spotprocessoru. Jediné co je konstantní je poloha těch dat v Modbus zprávě, RX[7] až RX[10]. </div><div>Kam se ta data zapíší záleží na jiné části Modbus zprávy. </div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">Zdravi<br>Jirka Sloupenský OK1MWW</div></div><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">st 18. 12. 2024 v 14:09 odesílatel Miroslav Mraz <<a href="mailto:mrazik@volny.cz">mrazik@volny.cz</a>> napsal:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Už dlouho s AVR nedělám, ale pořád mám nástroje, tak jsem trochu <br>
experimentoval.<br>
Mějme nějaká data v RAM (const je zde nepodstatné) např.<br>
static const uint8_t RX_Data[] = { 0x90, 0xab, 0xcd, 0xef, 0xab, 0xcd, <br>
0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef,};<br>
a funkci<br>
static void test_swap () {<br>
const uint32_t PowerIO = __builtin_bswap32 (((uint32_t *)(RX_Data + <br>
7))[0]);<br>
printf("0x%08lX\n", PowerIO);<br>
}<br>
Funguje to správně, ale na 8-bitu to není příliš efektivní. Funkce<br>
static void test_shift () {<br>
uint32_t PowerIO = 0ul;<br>
const unsigned b = 7u, e = b + sizeof(PowerIO);<br>
for (unsigned n=b; n<e; n++) {<br>
PowerIO <<= 8;<br>
PowerIO |= RX_Data [n];<br>
}<br>
printf("0x%08lX\n", PowerIO);<br>
}<br>
funguje stejně a při optimalizaci -Os a pokud jsou data opravdu <br>
konstantní a překladač vidí jejich hodnoty už v době překladu, je to <br>
daleko efektivnější. Smyčka se rozbalí do jednotlivých kroků, posun o 8 <br>
bitů chápe překladač jako přechod na jiný byte, takže to jednotlivé byty <br>
ze vstupu nasype přesně tam, kam je potřeba a nic víc vlastně nedělá, <br>
není to potřeba. Lokální proměnné b,e,n se vůbec neprojeví takže na typu <br>
nezáleží.<br>
<br>
Mrazík<br>
<br>
<br>
On 18. 12. 24 13:26, Pavel Hudeček wrote:<br>
> Nedávno jsem potřeboval posílat ven SN procesoru, udělal jsem to takhle:<br>
> u64=0ULL;<br>
> u64 <<= 8; u64 |= SIGROW.SERNUM5;<br>
> u64 <<= 8; u64 |= SIGROW.SERNUM4;<br>
> u64 <<= 8; u64 |= SIGROW.SERNUM3;<br>
> u64 <<= 8; u64 |= SIGROW.SERNUM2;<br>
> u64 <<= 8; u64 |= SIGROW.SERNUM1;<br>
> u64 <<= 8; u64 |= SIGROW.SERNUM0;<br>
> <br>
> Ale vlastně nevím jak je to tam s těma indiánama, možná to má bejt <br>
> obráceně, tady mi to naštěstí nevadí:-)<br>
> <br>
> PH<br>
> <br>
_______________________________________________<br>
HW-list mailing list - sponsored by <a href="http://www.HW.cz" rel="noreferrer" target="_blank">www.HW.cz</a><br>
<a href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
</blockquote></div>