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