bitfield v avr-gcc

Jan Waclawek konfera@efton.sk
Pondělí Červen 16 14:25:12 CEST 2008


Dakujem,

Mno, nie celkom, potadeto je to celkom normalne C, aj IMHO trocha zbytocnou oklukou.

Pointa tych bitovych poli by mala byt presne v tom istom ako je vobec pointa pouzivat miesto asembleru makroasembler zvany C; t.j. aby nieco co moze urobit stroj aj ten stroj urobil. Ak si mam sam definovat kde co je a v akom poradi, tak to mozem robit priamo v asembleri.

Konkretne tu je zamer ten, ze mam nejake flagy nahadzane v bitovom poli v lubovolnom poradi, pricom s tymito flagmi potrebujem robit nejake operacie ako s flagmi - nastavovat, nulovat, testovat (to je jednoduche priradenie a test prip. ine ekvivalentne operacie) - a aj nejake operacie kde sa pouzivaju vsetky naraz, napr. ukladat ich do eeprom, posielat ich nejakemu inemu zariadeniu (kde zdielam strukturu posielanych dat typedefmi v spolocnych headeroch) - toto sa potom da pekne robit s celym polom pomocou sizeof a podobnych opiciniek. Ked mi tam pribudne dalsich 100 flagov, tak sa nemusim vzrusovat ich poradim, konfliktom v podobe duplicity apod., vsetko pekne funguje automaticky hned ako ich dopisem do definicie toho pola.

No a teraz mam taky problem, ze napriklad chcem z jedneho zariadenia do druheho poslat prikaz na prestavenie niektoreho konkretneho flagu -- no a na toto by sa mi hodil ten pointer.

Samozrejme viem ako to obist; len sa pytam, ci na to nie je nieco hotove, predzute.

Dakujem

wek



PS. uz ked som spomenul ten makroasembler, tak je mi jasne, ze preco tie bitfieldy boli dolepene az dodatocne - PDP-7 pokial viem nemaj ziadne bitove instrukcie... ;-)




----- Original Message ---------------
>Zdravím,
>
>Nevim jestli je toto to prave orechove. Pro pristup k bitum v avr-gcc pouzivam nasledujici konstrukci.
>
>/*
>Nejdrive si pripravime pudu
>*/
>typedef struct _bit_struct
>{
>	unsigned char bit0 : 1;
>	unsigned char bit1 : 1;
>	unsigned char bit2 : 1;
>	unsigned char bit3 : 1;
>	unsigned char bit4 : 1;
>	unsigned char bit5 : 1;
>	unsigned char bit6 : 1;
>	unsigned char bit7 : 1;
>}bit_field;
>
>#define BIT_FIELD(adr)	(*((volatile bit_field*)(adr)))
>
>/*
>Potom nadefinujeme jednotlive pseudopromene 
>Napr:
>*/
>#define bMonochrome			BIT_FIELD(_SFR_ADDR(PORTC)).bit0
>#define bTransparent			BIT_FIELD(_SFR_ADDR(PORTC)).bit1
>
>/*
>A potom muzeme pouzit nasledujici konstrukci
>Napr:
>*/
>if(bMonochrome)
>	bTransparent = 0;
>else
>	bTransparent = 1;
>
>Du¹an Slavìtínský
>




Další informace o konferenci Hw-list