bitfield v avr-gcc

Andrej Jancura hw_aj@zoznam.sk
Pondělí Červen 16 17:41:34 CEST 2008


Ahoj,

tak si to nadefinuj ako union. Raz pojdes ako byte raz ako bit.

// AD77xx - Control Register (3 byty / 24 bitov)

typedef struct {
     unsigned int FS0_7  : 8;  // filter
     unsigned int FS8_11 : 4;  // filter
     unsigned int BU     : 1;  // rozsah
     unsigned int BO     : 1;  // prudovy zdroj test
     unsigned int IO     : 1;  // prudovy zdroj
     unsigned int WL     : 1;  // dlzka dat
     unsigned int PD     : 1;  // zapni-vypni prevodnik
     unsigned int CH     : 1;  // kanal
     unsigned int G0_2   : 3;  // zosilnenie
     unsigned int MD0_2  : 3;  // mod

    } T_AD77xx_CONTROL_REGISTER_BITS;

typedef union {
     unsigned char     Byte[3];
     T_AD77xx_CONTROL_REGISTER_BITS Bit;

    } T_AD77xx_CONTROL_REGISTER;

Pristup:

AD77xx_Control_Register.Byte[AD77xx_Index] = 
AD77xx_CONFIG_TABLE[0].Byte[AD77xx_Index];
p_AD77xx_Adresa->Byte.Gain = AD77xx_Control_Register.Bit.G0_2;

Kde je problem?

A.


----- Original Message ----- 
From: "Jan Waclawek" <konfera@efton.sk>
To: "HW-news" <hw-list@list.hw.cz>
Sent: Monday, June 16, 2008 5:26 PM
Subject: RE: bitfield v avr-gcc


> Mozes mu poslat bitove pole 2x (pomocou pointera na cele pole a sizeofu to 
> vies). V prvom poli bude maska, ktore flagy sa maju prevziat a v druhom 
> budu mat tie flagy hodnotu, ktoru pozadujes.

Super, takze miesto 1-2  byte offsetu budem posielat vsetkych 144 bitov, a 
to este dvakrat...
Nie je to neprekonatelny problem si to dat na fixny ofset, takze riesenie 
existuje, som sa len spytal, ci uz na to niekto nemyslel a nevymyslel hack.


> Podla mojho nazoru nepojde ani toto, lebo bitove pole z principu nemusi 
> obsahovat len 1-bitove flagy, ale aj viacbitove polozky, ktore sa mozu 
> prelievat z bytu do bytu.

Presne ako pointer na akykolvek viacbytovy typ, ktory sa tiez moze (a 
nemusi, kedze toto je presne ako bitfieldy implementacne zavisle) prelievat 
cez hranice zarovnanych oblasti u 16/32/64 bitovych procesorov. Toto vsetko 
moze riesit stroj (prekladac) bez toho aby sa tym musel clovek zapodievat.

> Akoze ukazat povedzme na zaciatocny bit takej polozky (byte a bit) by 
> mozno nejako uzitocne mohlo byt, ale ono sa bitfield pouziva iba tak, ze 
> si jednoducho priradis hodnotu danej polozky z pola do premennej a s tou 
> dalej pracujes, podobne v cykloch, podmienkach, predavani do funkcie...

Ale ale, cele C je predsa o porusovani principov programovania vo vyssich 
jazykoch, obvykle v mene vyssieho principu zvanom efektivita. 50% pouzitia 
pointrov v C je presne o tomto. Samotna existencia sizeof je o tomto istom - 
vo vyssom jazyku Ta nema co zaujimat velkost cohokolvek. Nehovoriac o memcpy 
a spol.  Tie pointre ci co do bitfieldov sa predsa daju implementovat 
rovnako - ako nestandardne kniznicne (zabudovane) funkcie. Neverim, ze som 
jediny koho to za tie roky napadlo, len pripustam, ze nikomu sa zatial 
nechcelo v tom gcc len kvoli tomu rypat...

wek

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list@list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list