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