Arduino - 32 bitu promenna ze 4 byte
Petr Labaj
labaj na volny.cz
Pondělí Prosinec 16 14:43:02 CET 2024
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
******************
Dne 16.12.2024 v 14:18 Miroslav Mraz napsal(a):
> Tyhle funkce sice existují, ale v bare-metal dost problematicky.
> Předpokládá to síťování a to není úplně běžné. Třeba v newlib je to
> zašité v machine/endian.h a samo sebou vše vede přímo na
> __builtin_bswap32, příp. __builtin_bswap16 o kterém jsem se zmínil
> minule. Takže když to použijete rovnou, nemusíte hledat hlavičku,
> která by měla být podle manuálu arpa/inet.h. Pro PC tam skutečně je,
> ale definice těch funkcí je stejně někde jinde (netinet/in.h nebo jinde).
>
> Je to zkrátka bordel.
>
> Mrazík
>
> On 15. 12. 24 23:47, Petr Labaj wrote:
>> Protože se po síti často pohybují jiní indiáni než bydlí v
>> počítačích, tak už odjakživa (co existují sítě) existují funkce
>> ntohs, htons, ntohl, htonl.
>> Je to zkratka z network-to-hardware-short, ... totéž opačně a totéž
>> pro long.
>> Jsou snad vždy a všude (od AVR po superpočítače od IBM), a jsou vždy
>> správně pro danou platformu a maximálně zoptimalizované, protože v
>> síťovém programování se to používá furt.
>> Network order je vždy Big Endian.
>>
>> Takže Vaše použití by pak vypadalo nějak takto:
>> PowerIO = ntohl (*(uint32_t *) (RX_Data+7));
>>
>> PL
Další informace o konferenci Hw-list