Arduino - 32 bitu promenna ze 4 byte

Jirka Mww jirka.mww na gmail.com
Středa Prosinec 18 14:12:42 CET 2024


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].
Kam se ta data zapíší záleží na jiné části Modbus zprávy.
Zdravi
Jirka Sloupenský  OK1MWW


st 18. 12. 2024 v 14:09 odesílatel Miroslav Mraz <mrazik na volny.cz> napsal:

> Už dlouho s AVR nedělám, ale pořád mám nástroje, tak jsem trochu
> experimentoval.
> Mějme nějaká data v RAM (const je zde nepodstatné) např.
> static const uint8_t RX_Data[] = { 0x90, 0xab, 0xcd, 0xef, 0xab, 0xcd,
> 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef,};
> a funkci
> static void test_swap () {
>    const uint32_t PowerIO = __builtin_bswap32 (((uint32_t *)(RX_Data +
> 7))[0]);
>    printf("0x%08lX\n", PowerIO);
> }
> Funguje to správně, ale na 8-bitu to není příliš efektivní. Funkce
> static void test_shift () {
>    uint32_t PowerIO = 0ul;
>    const unsigned b = 7u, e = b + sizeof(PowerIO);
>    for (unsigned n=b; n<e; n++) {
>      PowerIO <<= 8;
>      PowerIO  |= RX_Data [n];
>    }
>    printf("0x%08lX\n", PowerIO);
> }
> funguje stejně a při optimalizaci -Os a pokud jsou data opravdu
> konstantní a překladač vidí jejich hodnoty už v době překladu, je to
> daleko efektivnější. Smyčka se rozbalí do jednotlivých kroků, posun o 8
> bitů chápe překladač jako přechod na jiný byte, takže to jednotlivé byty
> ze vstupu nasype přesně tam, kam je potřeba a nic víc vlastně nedělá,
> není to potřeba. Lokální proměnné b,e,n se vůbec neprojeví takže na typu
> nezáleží.
>
> Mrazík
>
>
> On 18. 12. 24 13:26, Pavel Hudeček wrote:
> > Nedávno jsem potřeboval posílat ven SN procesoru, udělal jsem to takhle:
> >                  u64=0ULL;
> >                  u64 <<= 8; u64 |= SIGROW.SERNUM5;
> >                  u64 <<= 8; u64 |= SIGROW.SERNUM4;
> >                  u64 <<= 8; u64 |= SIGROW.SERNUM3;
> >                  u64 <<= 8; u64 |= SIGROW.SERNUM2;
> >                  u64 <<= 8; u64 |= SIGROW.SERNUM1;
> >                  u64 <<= 8; u64 |= SIGROW.SERNUM0;
> >
> > Ale vlastně nevím jak je to tam s těma indiánama, možná to má bejt
> > obráceně, tady mi to naštěstí nevadí:-)
> >
> > PH
> >
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20241218/1698474c/attachment.htm>


Další informace o konferenci Hw-list