Re: C: Arduino : Přesun pole bytů do proměnné unsigned long

Petr Labaj labaj na volny.cz
Středa Listopad 8 19:36:14 CET 2023


Spíš možná SHIFTovat a ORovat.

Skoro si myslím, že při použití funkcí/maker typu htons a ntohs a 
přetypováním ukazatelů nebo unionem se dá udělat i přenositelný a 
spolehlivý kód.
Ale třeba je to jen můj vrozený optimismus/naivita.

PL

*********************

Dne 8.11.2023 v 18:36 Jirka Mww napsal(a):
> Díky za podrobné vysvětlení. Přece ale přenos dat po bytech a jejich 
> následné složení do 32bitove proměnné není zase taková exotika Jak to 
> tedy dělají profesionálové? Mám to opravdu pro jistotu násobit 
> postupně 256 a sčítat?
>
> Dne st 8. lis 2023 18:00 uživatel Jan Waclawek <konfera na efton.sk> napsal:
>
>     Hm, hm. Potom neviem.
>
>     Taketo "prenalepkovanie dat" sa vola "type punning". V podstate
>     existuju 3
>     podoby, jedna je tato, prostrednictvom pretypovania smernika; druha je
>     prostrednictvom unionu; tretia je za pouzitia memcpy().
>
>     Vsetky tri su principialne nespravne, v podstate tym istym
>     sposobom a z
>     tych istych dovodov.
>
>     Programovaci jazyk resp. jeho norma je dohoda medzi programatorom
>     a tvorcom
>     prekladaca o pravidlach, za ktorych prekladac bude robit to, co
>     programator ocakava. Veci, co by odovodnovali ten type punning, v
>     pravidlach neboli.
>
>     Povodne prekladace C boli priamociare a type punning "fungoval",
>     takze si
>     programatori zvykli. Ale zvykli si aj na to, ze prekladace su cim
>     dalej
>     tym chytrejsie a prelozeny kod je rychlejsi a mensi (to sa vola
>     optimalizacie). No lenze chyba lavky, toto su dve protikladne
>     veci; a ked
>     doslo na skutocne dobre optimalizacie, tak sa ukazalo, ze programy
>     pouzivajuce type punning odrazu divne prestali fungovat.
>
>     Takze tvorcovia prekladacov (a ciastocne aj tvorcovia normy) su
>     vystaveni
>     tlaku zo strany programatorov, aby bol ten type punning nejako
>     tolerovany.
>     Do normy sa pridali rozne pochybne polozky o reprezentacii dat v
>     pamati
>     (ak by to bol slusny jazyk, nema to tam co hladat). A prekladace
>     sa zufalo
>     snazia uhadnut, kedy programator type punning pouzil, a nepokazit
>     mu to,
>     pricom vsak zachovat optimalizacie. Naviac toto vsetko podlieha modnym
>     trendom (ano, programatori su tiez len ludia a v programovani su modne
>     trendy), takze napriklad union uz vychadza z mody, teraz je trendy
>     prisahat na memcpy().
>
>     V skratke, ak nechcete problemy, ten vysledok si vyskladate z bytov.
>
>     Naviac, v 8-bitovom mcu je s najvacsou pravdepodobnostou prelozeny
>     vysledok
>     uplne identicky, ako ked sa pouzije niektora forma type
>     punningu... ten
>     procesor to tak ci tak musi precitat z RX_Data byte po byte (lebo je
>     8-bitovy a inu moznost nema), a zapisat do vysledneho DATA tiez
>     byte po
>     byte... to, ze je to v zdrojaku zapisane nejako dlhsie alebo
>     kratsie, to
>     nehra ziadnu rolu...
>
>     wek
>
>
>     PS. Asi sa da v C++ pisat C stylom pomerne beztrestne, diablici
>     tam urcite
>     niekde su, ale ak ich nedrazdite niecim C++-ovitym, tak asi zostanu
>     schovani... O tomto neviem dost aby som to zodpovedne popisal; len
>     na to,
>     ze to je iny jazyk s inymi formalnymi pravidlami, upozornujem.
>
>
>     ----- Original Message ---------------
>     >Ta data se čtou standardní procedurou Arduina :
>     >
>     >v hlavní smyčce :
>     > if (Serial1.available()> 0 ){ Prijem_GOODWE();  }
>     >
>     >void Prijem_GOODWE() {
>     >
>     >  inByte2 = Serial1.read();
>     >  RX_Data[s] = inByte2;
>     >  s++;
>     >a tak dál.... až do celkové délky zprávy, pak se to zpracovává do
>     té 32
>     >bitové proměnné.
>     >
>     >Jinak já jsem v situaci, že rozlišování C a C++ mi dělá
>     potíže...Používám
>     >to jen na to Arduino.
>     >
>     >
>     >Zdravi
>     >Jirka Sloupenský  OK1MWW
>     >
>     >
>     >st 8. 11. 2023 v 17:27 odesílatel Jan Waclawek <konfera na efton.sk>
>     napsal:
>     >
>     >> Tie data sa tam dostavaju ako, v nejakom preruseni? Potom to
>     treba okorenit
>     >> nejakym tym volatile
>     >>
>     >> DATA = *((volatile unsigned long*)(&RX+ofset))
>     >>
>     >> Inak Arduino nie je C ale C++.
>     >>
>     >> wek
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20231108/7a7b5c1b/attachment.htm>


Další informace o konferenci Hw-list