[elektro] C-ben bit struktura kérdés
Moczik Gabor
pm_levlista at progzmaster.hu
Thu Jun 12 12:08:44 CEST 2008
Papp Zoltán wrote:
> {
> unsigned char
> fbits0:5,
> fbits1:5,
> fbits2:3,
> fbits3:3;
> };
> Van olyan fordító, ami sorrendben pakolja a bájtokba a biteket, így az
> első 5-bites cuccot 1 bájtba, majd utána már nem fér be a köv. 5 bit, így
> azt köv. bájtba, majd a két 3-biteset egy újabba. Így 3 bájtot fog
> elfoglalni. De ha a fordító okos, akkor rájöhet, hogy átrendezve a
> sorrendet belefér 2 bájtba is, ezzel memóriát spórol, de fogalmad sem
> lesz, mi hova kerül.
Altalaban a bitmezoket azert hasznalja az ember hogy egy hardver elem
regiszereit lekepezze vele, vagy takarekoskodni kell a memoriaval. Elobbi
esetben az atrendezesnek csak hatranya lenne, az utobbiban meg gondolkodhat
a programozo is, 8-asaval csoportositani nem olyan nehez :-)
Ha esetleg az eeprom-ban kell tarolni, akkor meg ismet nagy baj van ha a
fordito ossze-vissza rendezgeti mert a struktura veget kiegeszitetted 1 bittel.
Letezik valami 'packed' vagy '__packed' modosito, ami arra utasitja a
forditot hogy ne okoskodjon, ne igazitsa szohatarra, ne rendezgessen, rakja
le sorban ugy ahogy irtam.
Utana kene nezni hogy ez fordito-specifikus vagy szabvanyos. Mindenesetre en
pont az ilyen anomaliak miatt ritkan hasznalom a bitmezoket, inkabb #define
meg bitmuvelet...
#define BUSY_FLAG 0x80
if ((STATUS&BUSY_FLAG)==0) ...
> Mintahogy pl. van a köv.:
>
> char a;
> int b;
> float c;
>
> Fogalmad sincs, hogy hova kerülnek ezek a memóriába, és milyen sorrendben.
Viszont itt nem is fontos.
> Ha biztos akarsz lenni a dolgodban, hogy egy adott bájt 3. bitjét állítod
> be 1-be, akkor csak a X|=1<<3 a megoldás.
> Ezt pl. az IAR C for AVR fordító egy "ORI R16,0x08" utasítássá fordítja
> le, azaz a leghatékonyabb kódot generálja. És ezt már akkor is, ha nincs
> bekapcsolva semmilyen fordítási optimalizálás.
Ezt a legtobb fordito tudja, de kod olvashatosag es erthetoseg szempontjabol
szerintem jobb a fenti define-os bit megnevezes...
--
((( Móczik Gábor )))--((( E~mail: "pm-01" @AT "progzmaster" .DOT "hu" )))
((( Skype: moczik )))
More information about the Elektro
mailing list