[elektro] A szokásos C kezdő kérdések
SZIGETI Szabolcs
szigiszabolcs at gmail.com
Wed Jan 30 19:14:07 CET 2013
Hali!
Az ilyen unionban egymásra pakolunk adatszerkezeteket dologgal nagyon
nagyot lehet szívni. Ez már a FORTRAN COMMON BLOCK-kal is jó játék volt, de
a C-ben semmi sem kötelezi a fordítót, hogy fizikailag ugyanoda kerüljön
minden. Tehát pl. inteket szeret szóhatárra rakni, igy pl. a
struct {
int a;
char b;
int c;
};
mérete simán lehet 12 byte egy 32 bites rendszeren, pedig ugye 9-en
elférne. Különböző fordítókat különböző módon lehet kényszeríteni, hogy ne
csinálja, de még ekkor is bejöhetnek hardver korlátok (pl. a 68000-es intet
csak páros címről tudott beolvasni).
Szóval, ha jót akarsz, akkor ezzel nem bűvészkedsz. Inkább megfelelő módon
(&, |, << stb) alakítsd át char tömbbé az adataidat, és akkor még
hordozható kódot is fogsz kapni.
Szabolcs
2013. január 30. 17:53 Skandar Graun írta, <sgraun at gmail.com>:
> Na, megküzdöttem vele.
> A láncolt listák nagyon szépek, de tökéletesen nem ideillők.
> Jelenleg egy érdekes állapotban leledzik a dolog.
> Ami hiba nélkül lefordult és elsőre nagyjából megy is, az a következő:
>
> typedef union sertomb
> {
> struct
> {
> unsigned char kezdet;
> int act_set_ser;
> int stb_set_ser;
> int stat_ser;
> unsigned char crcout;
> };
> }sertomb;
>
> sertomb tomb_crc;
>
> A feltöltés és a kivitel:
>
> if (kellsoros)
> {
> tomb_crc.kezdet = 0x55;
> tomb_crc.act_set_ser = 0x3231;
> tomb_crc.stb_set_ser = 0x3433;
> tomb_crc.stat_ser = 0x3635;
> tomb_crc.crcout = 0x37;
> UART2_PutChar( (unsigned char*) &tomb_crc,
> 8 );
> Uart2_CRLF();
> kellsoros = 0;
> }
>
> A kiveteli rutinok:
> void UART2_PutChar( unsigned char *data, unsigned char count )
> {
> while ( count )
> {
> while(U2STAbits.UTXBF == 1);
> U2TXREG = *data++;
> count --;
> }
> }
> void Uart2_CRLF(void)
> {
> while(U2STAbits.UTXBF == 1);
> U2TXREG = 10;
> while(U2STAbits.UTXBF == 1);
> U2TXREG = 13;
> }
>
> A processzor pic24f sorozat.
>
> De a végeredmény érdekes:
>
>
> U[00]123456
>
> Ez nekem azt mutatja, hogy hiába tettem be előre egy unsigned char-t
> és utána az int típusokat, a pointer erre tesz nagyívben és mivel a
> kontroller 16 bites, ezért szolgaian viszi ki az alsó-felső byte-okat
> Csak így jelenleg az utolsó char byte-ot nem viszi ki, hiszen
> elfogyott a cuklusváltozó...
> Ha nagyon kell, ezzel már tudok együtt élni, csak nem elegáns...
> Próbáltam union helyett sima struct szerkezettel is, de ugyanezzel az
> eredménnyel.
> Mit kellene csinálni?
>
> -----------------------------------------
> elektro[-flame|-etc]
>
More information about the Elektro
mailing list