Arduino - 32 bitu promenna ze 4 byte
Miroslav Mraz
mrazik na volny.cz
Pondělí Prosinec 16 15:31:34 CET 2024
Ale jo, proti gustu žádný dišputát. Aby to běželo na jiné platformě pro
mne není podstatné. Jediný Big Endian na který jsem narazil je MIPS a s
tím už nechci nic mít, silně mi připomíná PIC (32).
Píšu v C++, takže jsem kdysi vyrobil univerzální třídy u32be, u32le,
u16be, u16le. Tyhle třídy je možné zapouzdřit do struktury a tu pak
naplnit či přečíst pomocí memcpy() daty z/do proudu bytů. Z hlediska
programu je pak v těchto proměnných správná hodnota z hlediska procesoru
ať je Little či Big. Stačí tomu přetížit pár operátorů.
Sice to není složité, ale je to značně nepřehledné a stejně musíte tyhle
třídy na mnohých místech přetypovat, aby překladač věděl, co po něm
vlastně chcete (např. printf). Připadá mi jednodušší plácnout ten swap
přímo na místo, kde je potřeba.
A pak ty síťové funkce mají redundantní názvy - htonx je to samé jako
ntohx. Mě to mate.
Funkce __builtin_bswapXX je zabudovaná přímo v jádru gcc nebo clang,
zatím jsem nenarazil na platformu, kde by nebyla.
Mrazík
On 16. 12. 24 14:43, Petr Labaj wrote:
> No jak to vidím já: tyhle funkce (ntohl atd.) používá síťař, ne arduinista.
> Já bych chtěl být považován raději za síťaře než za arduinistu. ;-)
>
> Sice jméno funkce __builtin_bswap32 je celkem popisné, ale použít
> všeobecně známou funkcí ntohl se mi osobně líbí víc.
> Navíc je u ní zajištěno, že bude fingovat správně i kdyby náhodou člověk
> překládal svůj projekt na jiné HW platformě, která bude třeba Big Endian.
> Tam by __builtin_bswap32 zklamala (kdyby tam byla, což asi nebude,
> protože se bude všude jmenovat nějak jinak), ale ntohl bude vždy
> fungovat správně (a zřejmě tam i vždy bude).
>
> PL
>
>
Další informace o konferenci Hw-list