C kerdes - bitmezők

Papp Zoltán zombi at c2.hu
Tue Jun 5 23:56:40 CEST 2007


K, Június 5, 2007 17:28-kor Fuzesi Arnold írta
> Helyzet:
> pl egy 8 bites valtozóban csinalok 2-3 több bites  kisebb valtozót -
> bitmezőkkel.
> Egyiken műveletet végzek, milyen esetben lehet a többi változót "véletlen"
> felülírni?
>
> A standard C muveletekkel ugye nem?
> Összeadas, kivonas, szorzas, osztas, ++, --, &, |, ^, stb?
>
> Gondolok itt ilyenre:
> typedef struct{
>     uchar type:2;
>     uchar integrator:5;
>     uchar out_state:1;
> } bigyo;
>
> bigyo.integrator++ és társai  műveletek eseten a 0-31 tartomanyon belül
> maradnak mindig ugye, a többi bitbe nem rondít bele ugye!?
> Mikor nem igaz ez standard műveletek esetében, hogy belül marad? Van ilyen
> eset?

Hali!

Ha jól emlékszem, a C nyelvben a bitmezőkön végzett utasítás nincs
egzaktul ledefiniálva.
Szerintem legjobb, ha kipróbálod, beírod a kérdéses műveleteket és
megnézed a lefordított ASM kódot.

Én egyébként a projectjeimben a port-definíciókhoz használok makrókba
rejtett bitmezőket,pl.:
DEFPIN(C,0,6,OUT, CLEDS)

ez létrehoz egy pCLEDS nevű bitmező-részt, ami a PORTC (mivel OUT=kimenet)
0. bitjétől kezdődik és 6 bit széles (ha IN lenne, akkor a PINC-n hozza
ugyanezt létre).

Ha lefordítom a pCLEDS++, utasítást, akkor a következőt kapom:

   \   00000032   B118               IN      R17, 0x08
   \   00000034   2F01               MOV     R16, R17
   \   00000036   7C00               ANDI    R16, 0xC0
   \   00000038   9513               INC     R17
   \   0000003A   731F               ANDI    R17, 0x3F
   \   0000003C   2B10               OR      R17, R16
   \   0000003E   B918               OUT     0x08, R17

Tehát lehet látni, hogy kimaszkolta az alsó 6 bitet, és csak azt
inkrementálta. Persze erre pl. feltételes ugrást vizsgálni nem igazán
lehet, mert utána van még két utasítás.

De én szeretem használni, pl definiáltam a LED_OFF konstanst:

#define LED_OFF 0x00

és a fordító szépen le is kezeli a megfelelő biteket:

    107            pCLEDS=LED_OFF;  //UART miatt, egyébként 0
   \   00000004   B108               IN      R16, 0x08
   \   00000006   7C00               ANDI    R16, 0xC0
   \   00000008   B908               OUT     0x08, R16


Üdv
-- 
Papp Zoltán
OneWay Electronics - www.onewayelectronics.hu
Hangszerviz - www.hangszerviz.hu


--------------------------------- Hirdetés ---------------------------------

Szerver Hosting Akció
Közel 50 %-os megtakarítás!
Kiemelkedő minőség elérhető áron.
http://www.cyber.hu/szerver_elhelyezes/




More information about the Elektro mailing list