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

[AVR][WinAVR/C] Optymalizacja procedury przerwania

al555 28 Kwi 2010 20:37 2291 20
  • #1 8014052
    al555
    Poziom 20  
    Proszę o podpowiedź czy mogę usunąć z poniższego bloku linie 1-5 oraz 9-12 ( za pomocą dyrektywy "naked" dla nagłówka przerwania )
    Nie wnikając w szczegóły, walczę o każdą instrukcję do usunięcia ( dlatego zmienne oraz stała 0x81 zostały zadeklarowane jako rejestry r3...r6)
    Jak widać w kodzie, wykorzystywane są tylko rejestry r3...r6, dlatego może odkładanie r0 i r1 nie jest potrzebne ?

    SIGNAL(SIG_SPI)
      {
         1:	1f 92       	push	r1
         2:	0f 92       	push	r0
         3:	0f b6       	in	r0, 0x3f	; 63
         4:	0f 92       	push	r0
         5:	11 24       	eor	r1, r1
    
    	  
         znak_rx = SPDR;
         6:	3e b4       	in	r3, 0x2e	; 46
    
         SPDR = SPI_bufor_TX_char;
         7:	6e bc       	out	0x2e, r6	; 46
    
         SPI_status = SPI_status_0x81;
         8:	45 2c       	mov	r4, r5
    
    
         9:	0f 90       	pop	r0
         10:	0f be       	out	0x3f, r0	; 63
         11:	0f 90       	pop	r0
         12:	1f 90       	pop	r1
         13:	18 95       	reti
    
      }
  • #2 8014400
    lucas_mcs
    Poziom 22  
    Jeżeli funkcja (w tym wypadku przerwanie) nie wykorzystuje tych rejestrow to procedurę odkladania zmiennych na stos i poźniejszego ściagania ich można pominiąć.
  • #3 8014445
    al555
    Poziom 20  
    Tylko że już doczytałem że odkładany jest też w linijce 3 rejestr SREG przy użyciu r1, a nie jestem pewien czy "moje" funkcje nie modyfikują SREG.

    Stąd zostaje tylko r0, ale nie jestem pewien czy nie jest też modyfikowany.

    Mógłby ktoś potwierdzić że używane rozkazy in out mov nie modyfikują SREG ??
  • #4 8015670
    mirekk36
    Poziom 42  
    al555 napisał:

    Mógłby ktoś potwierdzić że używane rozkazy in out mov nie modyfikują SREG ??


    Panie kolego, bierzesz pierwszą lepszą z brzegu listę rozkazów asemblera do AVR i masz w ostatniej kolumnie jasno opisane która operacja jakie znaczniki zmienia w SREG o ile w ogóle zmienia ;)
  • #5 8015737
    tmf
    VIP Zasłużony dla elektroda
    Jak widzę jest to fragment C. Powiedz mi w jaki sposób gwarantujesz, że rejestry R3-R6 nie są wykorzystywane przez C w innych fragmentach kodu? Jeśli robisz to poprzez register to mam nadzieję, że nie używasz, żadnych bibliotek - bo one nic nie wiedzą o tym, że te rejestry są zajęte.
  • #6 8015776
    al555
    Poziom 20  
    mirekk36 napisał:

    Panie kolego, bierzesz pierwszą lepszą z brzegu listę rozkazów asemblera do AVR i masz w ostatniej kolumnie jasno opisane która operacja jakie znaczniki zmienia w SREG o ile w ogóle zmienia ;)


    Panie kolego ;-) , ja już wziąłem "pierwszą lepszą listę rozkazów asemblera" i dlatego prosiłem o potwierdzenie że rzeczywiście in out mov nie modyfikują SREG, chciałem potwierdzenia, a nie informacji gdzie to znaleźć :D

    tmf napisał:

    Jak widzę jest to fragment C. Powiedz mi w jaki sposób gwarantujesz, że rejestry R3-R6 nie są wykorzystywane przez C w innych fragmentach kodu? Jeśli robisz to poprzez register to mam nadzieję, że nie używasz, żadnych bibliotek - bo one nic nie wiedzą o tym, że te rejestry są zajęte.


    Rzeczywiście deklaruję przez register:
    
    register unsigned char znak_rx asm("r3");
    register unsigned char SPI_status asm("r4");
    register unsigned char SPI_status_0x81 asm("r5"); 
    register unsigned char SPI_bufor_TX_char asm("r6");
     


    Byłem pewien ( i jednak nadal jestem) że kompilator wyłącza w ten sposób używane rejestry z użytku ? Mylę się ?
    Używam bibliotek: io, signal, wdt, delay, pgmspace i kilku swoich. Generalnie wszystko działa.
  • #7 8015836
    Konto nie istnieje
    Konto nie istnieje  
  • #8 8015887
    al555
    Poziom 20  
    albertb napisał:
    Mylisz się. Pomijając inne aspekty, biblioteki były skompilowane wcześniej niż był napisany Twój kod. Aby to działało tak jak Twoje pobożne życzenie, nie mogłyby one korzystać z żadnych rejestrów, lub musiały być kompilowane zawsze razem z Twoim kodem.

    Albert


    Niech mnie ktoś poprawi ale biblioteki w WinAVR są kompilowane za każdym razem razem z kodem programu.
    Muszę się jednak zgodzić z tym że w tych bibliotekach używane są wstawki asemblerowe gdzie używane są rejestry. Zrobiłem jednak szybki przegląd i z reguły są to rejestry r30 i wyższe.

    Mak ktoś doświadczenie z używaniem register
  • #9 8015902
    mirekk36
    Poziom 42  
    al555 napisał:

    Panie kolego ;-) , ja już wziąłem "pierwszą lepszą listę rozkazów asemblera" i dlatego prosiłem o potwierdzenie że rzeczywiście in out mov nie modyfikują SREG, chciałem potwierdzenia, a nie informacji gdzie to znaleźć :D


    Nie pisałem tego złośliwie, tylko dla mnie najważniejszym i ostatecznym potwierdzeniem jest zawsze notka PDF producenta, a w niej stoi jasno napisane przy tych rozkazach "Flags - none"

    dlatego się zdziwiłem pytaniem ;)
  • #10 8016063
    Konto nie istnieje
    Konto nie istnieje  
  • #11 8016072
    tmf
    VIP Zasłużony dla elektroda
    al555 napisał:
    albertb napisał:
    Mylisz się. Pomijając inne aspekty, biblioteki były skompilowane wcześniej niż był napisany Twój kod. Aby to działało tak jak Twoje pobożne życzenie, nie mogłyby one korzystać z żadnych rejestrów, lub musiały być kompilowane zawsze razem z Twoim kodem.

    Albert


    Niech mnie ktoś poprawi ale biblioteki w WinAVR są kompilowane za każdym razem razem z kodem programu.
    Muszę się jednak zgodzić z tym że w tych bibliotekach używane są wstawki asemblerowe gdzie używane są rejestry. Zrobiłem jednak szybki przegląd i z reguły są to rejestry r30 i wyższe.

    Mak ktoś doświadczenie z używaniem register


    Nie, nie są. Taki jest właśnie sens stosowania bibliotek - jest to archiwum plików obj pochodzących ze wcześniejszej kompilacji. Tak więc musiałbyś całe AVR-libc przekompilować ponownie z zarezerwowanymi rejestrami R3-R6, żeby to bezpiecznie działało.
    Register można dosyć bezpiecznie stosować we wszystkich miejscach z wyjątkiem procedur obsługi przerwań. Tam też można, ale z zastrzeżeniami j.w.
  • #12 8016116
    al555
    Poziom 20  
    a może ktoś mi wytłumaczyć dlaczego jak dołączam np. plik:
    Cytat:
    avr/pgmspace.h
    z wpisanymi kilkoma przypadkowymi literami to powodują błąd podczas kompilacji.
    Wg tego co piszecie to kompilator powinien dołączyć wcześniej skompilowany plik obj, i pominąć błędy składni w pliku pgmspace.h ??
  • #13 8016185
    utak3r
    Poziom 25  
    W pliku h przechowywane są deklaracje funkcji, natomiast ich definicje są w obj. Jak wpiszesz do h bzdury, to kompilator nie będzie wiedział, co z tym zrobić. ech...

    Inna sprawa, że nazwa "biblioteka" jest dość płynna - pliki źródłowe również stanowią bibliotekę - i byłyby kompilowane podczas budowania programu. Jednak (nie znam tego środowiska) ktoś tu wymienił nazwę avr-libc - to jasno mówi (jakbyś trochę znał gcc, to też byś wiedział) że to jest prekompilowana biblioteka. Pamiętaj, plik h jest tylko swego rodzaju drogowskazem, jak to, co napisałeś w swoim źródle, połączyć z gotową biblioteką.
  • #14 8016191
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Znowu - według Ciebie plik .h to jest biblioteka?

    Czym są wg Ciebie następujące pliki:
    c:\WinAVR-20081205\avr\lib\libc.a
    c:\WinAVR-20081205\avr\lib\libm.a
    c:\WinAVR-20081205\avr\lib\libobjc.a
    ...

    ?

    Skoro kompilator użył tych instrukcji w Twoim przerwaniu, to znaczy że są potrzebne i NIE można ich usunąć - proste. Jakby były zbędne, to by ich nie dawał...

    4\/3!!
  • #15 8016219
    utak3r
    Poziom 25  
    Prawdę mówiąc, nie wyobrażam sobie programu, który by nie linkował libc ;)
  • #16 8016222
    tmf
    VIP Zasłużony dla elektroda
    W szczególności w pliku h mogą być i deklaracje i definicje funkcji - takie funkcje są traktowane specjalnie - jako funkcje inline i są kompilowane za każdym razem. Przykładem właśnie jest wspomniany pgmspace.h. Ale to nie jest biblioteka. W tym kontekście biblioteką jest zestaw prekompilowanych plików połączonych w archiwum - plik z rozszerzeniem *.a. Z takiego pliku nie korzysta kompilator, a jedynie linker. W nagłówkach znajdują się wyłącznie deklaracje funkcji, po to, żeby kompilator natrafiając na coś takiego wiedział jaki kod wygenerować, żeby potem linker mógł to połączyć ze wcześniej skompilowaną funkcją wziętą z biblioteki.
    Generalnie al555, widzę, że strasznie kombinujesz, problem w tym, że zaczynasz kombinować na zbyt wczesnym etapie rozwoju programistycznego, co niechybnie doprowadzi do katastrofy. Poczytaj jakieś dobre książki z C, zanim zaczniesz tworzyć babole. No i po co tak kombinujesz z tą obsługą przerwania? Naprawdę masz coś aż tak krytycznego czasowo? Niesądzę.
  • #17 8016280
    al555
    Poziom 20  
    Mój błąd - użyłem słowa "biblioteka" do plików "*.h" z funkcjami inline.
    Żaden z dołączanych przeze mnie (jawnie) plików h ( io, signal, wdt, delay, pgmspace ) nie odwołuje się (poprzez nagłówek extern) do plików obj. Więc mam nadzieję że będzie ok.
    Jeśli te same operacje będą wykonywane przy użyciu zmiennych deklarowanych w RAMie to pojawiają się zakłócenia w pracy urządzenia, raczej jestem skazany na używanie rejestrów poprzez "register".
    Działam na poziomie pojedynczych mikrosekund, więc czas jest krytyczny (przynajmniej dopóki używam 8bitowych AVRów)

    Co by nie mówić, przeoczyłem temat plików prekompilowanych, uważając (nie słusznie) że wszystko jest tak jak w tym jednym pliku pgmspace.h poprzez inline.

    Ale na pewno wezmę pod uwagę wasze "kopniaki" :D
    Dzięki za pomoc,
    Pozdrawiam ...
  • #18 8016335
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Tak, na pewno będzie dobrze... Twój program przecież nie wykorzystuje dzielenia, mnożenia, operacji na dużych liczbach, kopiowania dużych obszarów itp, no nie? To też są funkcje biblioteczne... NIGDY nie masz gwarancji, że kompilator nie dołączy sobie jakiejś typowej funkcji, która korzysta z rejestrów.

    4\/3!!
  • #19 8016355
    al555
    Poziom 20  
    Zacytuje klasyka:
    "Kto nie ryzykuje ten nie pije szampana" :D

    ... ale przemyśle czy nie zrobić tego jednak inaczej
  • #20 8016551
    tmf
    VIP Zasłużony dla elektroda
    W odniesieniu do programowania to raczej głupie powiedzenie. Zauważ, że błędy powstałe w wyniku kompilacji twojego kodu są wyjątkowo uciążliwe. Nie da się ich w prosty sposób wyłapać, bo kod będzie działał nieprawidłowo w sposób całkowicie losowy - nie ma nawet możliwości wygenerowania kodu, który będzie generował błąd w jakiś deterministycznych okolicznościach. Taki program może zwykle działać prawidłowo a wysypać się w nieprzewidzianych okolicznościach. Dlatego takie manipulacje są skrajnie niebezpieczne i prowadzą do rozwoju złych nawyków - jak np. to powiedzenie. Jeśli po zadeklarowaniu zmiennych w RAMie pojawiają się się jakieś zakłócenia to na 99% masz w programie jakiegoś babola, który tylko czeka na ujawnienie się. Magistrala SPI jest synchronizowana zegarem mastera i prawidłowo napisana komunikacja nie ma prawa być krytyczna czasowo.
REKLAMA