Re: C: Arduino : Přesun pole bytů do proměnné unsigned long
Jirka Mww
jirka.mww na gmail.com
Středa Listopad 8 18:36:23 CET 2023
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
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20231108/19dedca6/attachment.htm>
Další informace o konferenci Hw-list