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

AVR C - Optymalizacja dostępu do rejestrów PORT przez struktury lub unie

k4be 25 Gru 2007 13:35 2216 3
REKLAMA
  • #1 4622267
    k4be
    Poziom 31  
    Posty: 2129
    Pomógł: 102
    Ocena: 332
    Próbuję zrealizować dostęp do bitów któregoś rejestru PORT jako do elementów struktury. Napisałem na ten przykład coś takiego:
    struct portb {
    	unsigned DS:1;
    	unsigned RW:1;
    	unsigned AS:1;
    	unsigned   :2;
    	unsigned LOAD:1;
    	unsigned   :1;
    	unsigned CS:1;
    };
    struct portb* Portb = (struct portb*)&PORTB;
    , wykorzystywane potem tak:
    Portb->RW = 1;
    Portb->CS = 0;
    DDRD = 0xff;
    PORTD = adres;
    Portb->AS = 1;
    Portb->AS = 0;
    DDRD = 0x00;
    PORTD = 0;
    Portb->DS = 0;
    asm volatile("NOP");
    dane = PIND;
    Portb->DS = 1;
    Portb->CS = 1;
    DDRD = 0xff;
    Takie rozwiązanie działa poprawnie, ale powoli, poza tym kod ma duży rozmiar (w porównaniu do operacji bitowych bezpośrednio na rejestrach). Czy jest jakiś bardziej optymalne rozwiązanie tego programu (być może okaże się nawet banalne), oparte na strukturach, ewentualnie na uniach?
  • REKLAMA
  • #2 4622355
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Ja piszę bardzo prosto
    PORTCC |= 1<<DIO;
    a kod wygląda tak:
     54:	94 98       	cbi	0x12, 4	; 18
    nic bardziej banalnego chyba nie można wymyślić. Oczywiście wcześniej nazwy te są zdefiniowane do własnych potrzeb na właściwe porty i bity
    #define PORTCC	   	PORTD
    #define DIO         4
  • REKLAMA
  • #3 4622509
    k4be
    Poziom 31  
    Posty: 2129
    Pomógł: 102
    Ocena: 332
    Właśnie o tym wspomniałem, pisząc 'operacje bitowe bezpośrednio na rejestrach'. Jednak tutaj chodzi mi o użycie typów strukturalnych działających bezpośrednio na rejestrach portów. W podanym przykładzie taka metoda nie jest konieczna - wprowadziłem ją tylko dla sprawdzenia czy to tak można, z myślą o późniejszym wykorzystaniu wtedy, kiedy byłaby naprawdę niezastąpiona.
  • #4 4627487
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    [quote="k4be"]Próbuję zrealizować dostęp do bitów któregoś rejestru PORT jako do elementów struktury.
    [quote]
    Powinno zadziałać (sprawdzałem w gcc 3.4.3 - jest OK) po drobnej poprawce.
    struct portb {
    	unsigned DS:1;
    	unsigned RW:1;
    	unsigned AS:1;
    	unsigned   :2;
    	unsigned LOAD:1;
    	unsigned   :1;
    	unsigned CS:1;
    };
    volatile struct portb* const Portb = (volatile struct portb*)&PORTB;


    Bez const kompilator nie ma pewności, że Portb będzie zawsze pokazywać na adres i/o i operacje bitowe będą dostępne. Musi więc wygenerować bardziej uniwersalny, ale dłuższy kod.

    Nb. definiowanie portu jako struktury rzadko się stosuje (lub raczej wcale) z uwagi na nieprzenośność takiego kodu -> standard C nie definiuje, czy bity w tak zdefiniowanej strukturze przydzielane są od najbardziej, czy od najmniej znaczącego.
REKLAMA