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

Jan Waclawek konfera na efton.sk
Středa Listopad 8 18:00:16 CET 2023


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ší informace o konferenci Hw-list