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