bitfield v avr-gcc

Miroslav Sinko sinkomiro@rocketmail.com
Úterý Červen 17 00:19:30 CEST 2008


Takze na zaciatok radsej priklad konkretneho menu, toto ma za ulohu spustat dalsie podmenu:

/******************************** Main menu *********************************************************/
//constant progmem strings of menuitem texts of menuMain											
prog_char menuItemMain1[]="Setup";
prog_char menuItemMain2[]="Help";
prog_char menuItemMain3[]="About";

//the structure initialization doesn't accept the PROGMEM strings as initializers, 
//so they should be defined above as progmem strings..
PROGMEM S_MenuItem menuMainItems[] = {
						  //-1: do not include \0
	{ menuItemMain1, 	sizeof(menuItemMain1) - 1	, E_MENU_MAIN_SETUP },  	
	{ menuItemMain2, 	sizeof(menuItemMain2) - 1 	, E_MENU_MAIN_HELP  },  	
	{ menuItemMain3,	sizeof(menuItemMain3) - 1	, E_MENU_MAIN_ABOUT },  	
};

PROGMEM S_Menu menuMain = { 
	menuMainItems,								//pointer to menuItems 
	sizeof(menuMainItems) / sizeof(S_MenuItem), //number of items
	NULL,										//init function
	fMenuMain,									//menu item function
	&rtInfo[E_INDEX_MENU_MAIN]					//run time info
};

Nieco som dopisal aj nizsie:

--- On Mon, 6/16/08, Jan Waclawek <konfera@efton.sk> wrote:

> No ved to je aj moj ciel.
> 
> Tak si pozrime, co treba spravit, ked chces pridat dalsiu
> polozku do menu:
> - musis inkrementovat pocet poloziek

nemusim, vid priklad

> - pridat polozku do pola - asi riadok niekam do
> inicializatora, ze?

ano

> - pridat string, ale tomu sa neda vyhnut; pridat explicitne
> jeho dlzku (sizeof - 1 alebo pocitas pismenka?)

nepocitam LOL

> - v tej polozke pridat dalsi DWORD parameter (preco DWORD -
> to ich chces mat tak vela? to je do jednocipu?) - generujes
> ich nejako aby boli v postupnosti, alebo si treba pozriet
> predchadzajuce aby nedoslo k duplicite?

Do jednocipu. DWORD je najuniverzalnejsi, nechcem sa citit v buducnosti obmedzeny. Struktury menu su v PROGMEM, tam je (zatial) miesta dost. Len aktivne menu sa vzdy prekopiruje do RAM - preto su stringy v PROGMEM, aby v RAM nezaberali miesto. 
Generovanie: pisal som - enum, nestaram sa o hodnotu, jednoznacnost zarucena. Ale pisal som, ze _spravidla_ enum, t.j. ak menu ma sluzit na vyber BaudRate, tak si rovno posielam hodnotu a obsluzna funkcia tohto menu nepotrebuje switch/case, ale rovno pracuje s parametrom, ako cislom. Tu hned vidis vyhodu DWORD.

> - v tej spracovacej funkcii dopisat do toho switchu novy
> case (a neviem si presne predstavit obsah toho case)

Nasime to na polozky bitoveho pola. Realne som to nepouzil, ale robil by som to takto:

struct{
BYTE led1 :1;  //ma svietit LED
BYTE bzuciak :1  //ma byt aktivny 
}flags;

typedef enum{
E_LED1,
E_BZUCIAK
}ENUMS_FLAGS;

void fMenuFlags(DWORD param)
switch(param){
 case E_LED1:
   flags.led1 = ~flags.led1;
   break;
 case E_BZUCIAK:
   flags.bzuciak = ~flags.bzuciak;
   break;
 }
}

> Neviem, mne sa to zda komplikovane; a po 3 rokoch nie som
> si isty ze spravim vsetky kroky spravne.

Mozme mat rozne pohlady, preco nie. Ani netvrdim, ze to mam najlepsie, ako sa da.
 
> V mojej verzii (predpokladajme, ze existuju kyzene
> pointre):
> - pole nema definovany pocet poloziek, mam ukoncovaci
> zaznam (nieco v nom je nulove - asi ten typ), staci pridat
> riadok do inicializatora

Ano, aj to je moznost. Nevyhoda - o polozku naviac. Vyhoda - oproti mojmu zapisu sizeof/sizeof jedine uspora 1 bytu v strukture (BYTE numItems).

> - nemam stringy v ramke, takze rovno pointer na string, ten
> samozrejme aj ja musim pridat

No ja mam pevne stringy v PROGMEM a do RAM ich nekopirujem. Mam moznost aj volitelnych stringov a tie su potom v RAM - vid komentar v predoslom maili pri prvej strukture. V jednom menu mozem tieto 2 typy stringov kombinovat. Povedzme ze pri BaudRate ponecham na uzivatela zvolit si 3 user rychlosti, ktore si nastavi a tie sa potom pouzivaju v menu (ukladanie nastaveni do EEPROM mu ich zapamata).

> - zadam typ ako "bit" (u mna je to konstanta a
> kedze som s tym dneska robil tak si to pamatam, je to 4 ;-)
> )

No toto nemam - riesil by som to univerzalne, cez tie funkcie/param/enum/switch/case.

> - rovno pointer na ten bit; funkciu na polozku menu kde sa
> manipuluje bit (do ktorej ten pointer vstupuje ako
> parameter) mam uz napisanu takze je vymalovane.

Ak by bol jednoducho ziskatelny pointer na bit, v tom zmysle, ze z mojho prikladu ziskam v uvodzovkach "&flags.bzuciak", tak by to bolo pekne :-) 

> Sa mi to moje zda lepsie... Mozno som trosicka zaujaty...
> ;-)

Hadat sa nebudem :-) Len mierne zavrtam. Ako riesis menu, kde o ziadne bity nejde? Povedzme to nastavovanie BaudRate? Mas paralelne iny system menu, alebo ako povies, aku rychlost chces nastavit?

miro

> 
> wek
> 


      


Další informace o konferenci Hw-list