bitfield v avr-gcc

Miroslav Sinko sinkomiro@rocketmail.com
Pondělí Červen 16 20:15:26 CEST 2008


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

> Nerozumiem: ved pointer/offset/nazvimetoakochceme mi predsa
> vypocita sam prekladac, nemusim sa o to starat. 

> Predstav si funkciu T_bitfieldAddress
> GetBitfieldAddress(T_bitfield), potom funkciu T_bitfield
> GetBitfieldValue(T_bitfieldAddress) a k nej
> "inverznu" funkciu void
> SetBitfieldValue(T_bitfieldAddress, T_bitfield). To prve je
> ekvivalent operatora &, to druhe je x=*p, a to tretie je
> *p=x. Teraz mozem zapisat prenasanu polozku bitfieldu ako
> struct{T_bitfieldAddress a; T_bitfield b}; mozem si z
> takychto poloziek spravit pokojne pole, naplnit ho runtime
> pomocou tych prvych dvoch funkcii, preniest ho, a pomocou
> tej tretej ulozit; to vsetko bez toho, aby som sa ja ako
> programator zapodieval tym, kde v certoch je vobec ten
> bitfield alokovany.

No to si napisat mozes, ale prave mas problem, ako v tych funkciach ziskas pristup na ten preklacov pointer/offset/nazvimetoakochceme, lebo C taku moznost priamo nema. Nestudoval som zdrojaky C-prekladacov, no prespokladam, ze k polozkam bitoveho pola pristupuje cez pointer na cele pole + offset bytu + poradove cislo bitu (rotaciou, maskovanim). Okrem pointera z tohto C navonok neponuka nic ine.
 
> V skutocnosti aj existujuce pointre na rozne typy su
> rozdielne a nemali by ist priradit jeden do druheho bez
> nasledkov (u C je to vdaka makroasemblerovosti obvykle len
> warning, ak si ho nepotlacis). Vzajomna kompatibilita
> pointrov nie je nevyhnutna.

Nie celkom, pointer je vzdy adresa do pamati a ukazuje na cely byte. Podla platforiem moze byt pointer 2-, 4-, prip. viac bytovy, ale vzdy je to adresa do niektorej z pamati (kod, data, eeprom, xdata..). Ci prekladacu povies, ze to ma byt int *, long *, atd atd, to na tom nic nemeni. Podla toho "len" pocita pointerovu aritmetiku. Aj preto je pretypovanie mozne a dokonca bez nasledkov, ked vies, co robis (typicky, ked si do bytoveho pola - buffra - skladam rozne struktury a naopak, ked ich odtial vyberam).

"Tvoj" pointer na polozku bitoveho pola je kvalitativne nieco ine, potrebujes adresovat konkretny BIT kdesi v pamati. Taketo nieco C jednoducho nepodporuje, takze opat mas tie moznosti... :-))
  
> >No mas par moznosti:
> >- zmieris sa s tym, ze pointer v C je tak nedokonaly,
> ze vie ukazat len na cely byte
> >- prejdes k vyssiemu jazyku, ktory principy neporusuje
> >- upravis si GCC k obrazu svojmu
> 
> Ja viem....
> 
> wek
> 
> 
> PS. Este by bola moznost presvedcit sucasnych chlebodarcov
> aby presli na jediny spravny jednocip, t.j. '51; a do
> SDCC by som si to trufal dopisat... ;-)
>

miro


      



Další informace o konferenci Hw-list