[OT] Re: Arduino - 32 bitu promenna ze 4 byte
Miroslav Šinko
sinkomiro na gmail.com
Čtvrtek Prosinec 19 01:39:43 CET 2024
len mne prichadzaju maily od tohto konkretneho pod nespravnym subjectom
"Arduino - 32 bitu promenna ze 4 byte"?
oznacil som OT, ale nie som si isty, ci mi to len zle neretazi TB. aj
ked historia starsich mailov na Arduino vlakno nadvazuje (nechal som
naschval cast historie)
miro
On 18.12.2024 14:28, Martin Záruba wrote:
> Jak jste dopadl pokud jde o data ze SpotProcessoru. Původně jsem něco
> takového chtěl napsat jako podprogram do našeho serveru, ale je to fuška
> a pokud to dává rozumné výsledky, nemá cenu to programovat.
>
> Děkuji
>
> Martin Záruba
>
> Dne 18.12.2024 v 14:12 Jirka Mww napsal(a):
>> 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
>> >
Další informace o konferenci Hw-list