bitfield v avr-gcc

Andrej Jancura hw_aj@zoznam.sk
Pondělí Červen 16 21:23:47 CEST 2008


Jano,

>Skus napisat konkretne co potrebujes, lebo ja tomu nejako nerozumiem.

Mam menu riadene tabulkou. Drviva vacsina poloziek je nieco zmenit, typicky
je to nastavit (YES/NO, ON/OFF) nejaky konfiguracny bit. Tabulka je pole
structov, prva polozka je string ktory popisuje polozku ("COMPRESSOR
MOTOR"), druha polozka je typ polozky (bit s hodnotami "ON/OFF"), tretia je
"nejaky" pointer. Jedna z moznosti je mat pointer na funkciu ktora dany bit
nastavi/vynuluje, ale to je na hony vzdialene efektivite. Idealny by bol
pointer priamo na menenu polozku, lenze to momentalne nejde. Takze to
obchadzam tym pevnym poradim bitov v konfiguracnom byte a quasi-"pointer" si
skladam (presnejsie, v realnej implementacii ako to teraz je, je to pointer
na iny struct, ktory obsahuje dva pseudopointre (pointer na byte a poradie v
byte), pretoze menim sucasne hodnotu v EEPROM aj shadowRAM).
------------

Diki uz chapem. Akurat nechapem co je na tom take tazke. Pozri nizsie.

>Inak, co brani napisat funkciu nastav bit cislo XXX na 1. Ak to chces mat
>ako bitove pole, adresu mas po deleni 8, zvysok je cislo bitu a nastav na 1
>je uz jednoduche.
>

A co mam vydelit 8?

Napr. v tom Tvojom priklade, povedzme AD77xx_Control_Register.Bit.G0_2, ako
by si dospel k cislu, ktore na ktorom treba spravit ten div a mod?

Potrebujem &AD77xx_Control_Register.Bit.G0_2...
---------

Toto robi priamo kompilator. Myslim, ze to funguje tak, ze si zoberie priamo
adresu v Ram kde je ulozeny union, k nej pricita 2 byte a zbytok je
maskovanie. Samozrejme asembler pouziva uz vysledok, ktory je uz rovno 
adresa, ktora sa meni.

Ak sa pozries do definicie toho mojho bitoveho pola, mas cislo bitu, ktory 
chces
zmenit, povedzme 13. Teda v ram mas rezervovane tri byty 0,1,2, aby si 
dostal 24
bitove pole. 13 podelis 8, dostanes 1 a zvysok 5. 1 je offset, ktory 
pripocitas ku
referencnej adrese unionu a 5 je bit alebo bity, ktore nastavujes. Napisat 
si takuto funkciu na pristup do bitoveho pola je podla mna trivialne. Ak si 
pozries ten moj priklad, tak ta mozno napadne ako som to riesil ja...

V tvojom pripade je to to iste. Mas cisla bitov z toho menu, len si musis 
napisat funkciu na ich nastavenia. Samozrejme, aby si v tom mal poriadok, 
musis si to premysliet a poriadok v tom udrzat sam. Inak problem. Problem 
medzi EEPROM a RAM, je to to iste, akurat mas ine referencne adresy. Inak 
algoritmus ten isty.

A.




Další informace o konferenci Hw-list