logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

WinAVR: Jak efektywnie używać tablicy pól bitowych?

al555 02 Cze 2005 01:04 2060 4
REKLAMA
  • #1 1543500
    al555
    Poziom 20  
    Posty: 485
    Pomógł: 32
    Ocena: 8
    Witam,
    przeglądałem posty na temat pól bitowych, sam ich czasami używam, ale potrzebuje stworzyć tablice pól bitowych, a dokładnie to chcę odwoływać się do pól poprzez indeks, a nie tylko nazwe.

    Wydawałoby się to proste:
    
    struct TPole{ 
    unsigned char bit:1; 
    }; 
    
    volatile struct TPole Pole[100]; 
    


    i teraz odwołanie powinno wyglądać :
    
    Pole[x].bit = 1;
    lub
    zmienna = Pole[x].bit
    


    Niestety, wydaje mi się że taka deklaracja zabiera 1 bajt na 1 "bit". Tak przynajmniej zgłasza WinAVR w oknie "Output".
    Czy musze zrobić to inaczej, czy wszystko jest w porządku.


    Będę wdzięczny za pomoc.
  • REKLAMA
  • REKLAMA
  • #3 1543678
    arturt134
    Poziom 27  
    Posty: 792
    Pomógł: 76
    Ocena: 24
    Zależy co chcesz zrobić na tym wielkim polu bitowym.
    Ja robiłem kiedyś sterownik do drukarki termicznej, mialem podobny problem, bo jedna linia w drukarce to były 192 bity.
    Poradziłem sobie tak, że zrobiłem tablicę bajtów, dodatkowo indeksowaną przesuwającą się maską o rozmiarze 1 bajta: 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01.

    Przy użyciu struktur bitowych tego się moim zdaniem nie da zrobić.
  • REKLAMA
  • #4 1543865
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 42
    Oczywiscie zachowanie gcc jest jak najbardziej prawidlowe.Gdy rezerwujesz od 1 do 8 bitow w strukturze i tak zawsze bedzie zarezerwowany jeden bajt, jesli wiecej bitow to odpowiednio wiecej bajtow.Obawiam sie ze nie da sie tego zrobic w sposob jaki chcesz.
  • Pomocny post
    #5 1545141
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    W twojej pierwszej deklaracji jest nieszczęście. Spróbuj tak:

    struct TPole{
    unsigned char bit_0:1;
    unsigned char bit_1:1;
    .
    .
    unsigned char bit_7:1;
    } bit_field;

    zdefiniuj dodatkowo takie coś:

    #define Get_bit(adr) (*( (volatile bit_field*) (adr) ) );


    Teraz chcąc wyłuskać jakiś bit piszesz: zmienna = Get_bit (i tu adres właściwy bajtu na którym ci zależy - rejestry i porty też ).bit_0; i wyciągnąłeś wartość bitu 0 po adresem który jest ci niezbędnie potrzebny.
    Dla tablic zmieniasz jak potrzeba adres, albo jeszcze lepiej wskaźnik i prawie samo się robi.
    No i prawie wszystko na temat, jak chcesz to podobnie z ustawianiem bitu pod jakimś adresem, tylko zdefiniuj sobie np. Set_bit(adr).............
REKLAMA