Forum elektroda.pl

Regulamin  | Punkty  | Dodaj...  | Ostatnie  | Szukaj  | Rejestracja  | Zaloguj

Ta strona używa cookie. Dowiedz się więcej o celu ich używania i zmianie ustawień cookie w przeglądarce.
Korzystając ze strony wyrażasz zgodę na używanie cookie, zgodnie z aktualnymi ustawieniami przeglądarki.

[AVR][WinAVR/C] Optymalizacja procedury przerwania


Napisz nowy temat  Odpowiedz do tematu      Strona Główna -> Forum elektroda.pl -> Mikrokontrolery Ogólne -> Mikrokontrolery AVR -> [AVR][WinAVR/C] Optymalizacja procedury przerwania
Autor
Wiadomość
al555
Poziom 18
Poziom 18


Dołączył: 12 Cze 2003
Posty: 458
Miasto: wschodnia dzielnica Krakowa - Tarnów

Post#1 Post autora tematu 28 Kwi 2010 19:37   

[AVR][WinAVR/C] Optymalizacja procedury przerwania


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 ?

Kod:
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

  }

Powrót do góry
   
Google


Google Adsense


Post# 28 Kwi 2010 19:37   





Powrót do góry
   
lucas_mcs
Poziom 17
Poziom 17


Dołączył: 02 Maj 2005
Posty: 435
Miasto: Gdańsk

Post#2 28 Kwi 2010 20:42   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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ąć.
Powrót do góry
   
al555
Poziom 18
Poziom 18


Dołączył: 12 Cze 2003
Posty: 458
Miasto: wschodnia dzielnica Krakowa - Tarnów

Post#3 Post autora tematu 28 Kwi 2010 20:50   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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 ??
Powrót do góry
   
mirekk36
Poziom 26
Poziom 26


Dołączył: 17 Cze 2006
Posty: 9315
Miasto: Szczecin

Post#4 29 Kwi 2010 08:44   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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 ;)
Powrót do góry
   
tmf
Moderator
Moderator


Dołączył: 12 Sie 2009
Posty: 7545
Miasto: Katowice

Post#5 29 Kwi 2010 09:08   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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.
Powrót do góry
   
al555
Poziom 18
Poziom 18


Dołączył: 12 Cze 2003
Posty: 458
Miasto: wschodnia dzielnica Krakowa - Tarnów

Post#6 Post autora tematu 29 Kwi 2010 09:23   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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:
Kod:

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.
Powrót do góry
   
albertb
Poziom 23
Poziom 23


Dołączył: 04 Maj 2004
Posty: 2964
Miasto: Nowy Targ

Post#7 29 Kwi 2010 09:38   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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
Powrót do góry
   
al555
Poziom 18
Poziom 18


Dołączył: 12 Cze 2003
Posty: 458
Miasto: wschodnia dzielnica Krakowa - Tarnów

Post#8 Post autora tematu 29 Kwi 2010 09:49   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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
Powrót do góry
   
mirekk36
Poziom 26
Poziom 26


Dołączył: 17 Cze 2006
Posty: 9315
Miasto: Szczecin

Post#9 29 Kwi 2010 09:53   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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 ;)
Powrót do góry
   
albertb
Poziom 23
Poziom 23


Dołączył: 04 Maj 2004
Posty: 2964
Miasto: Nowy Targ

Post#10 29 Kwi 2010 10:46   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


al555 napisał:

Niech mnie ktoś poprawi ale biblioteki w WinAVR są kompilowane za każdym razem razem z kodem programu.

Skąd żeś taką informację wytrzasnął? Chyba, że z najlepszego źródła - sam wymyśliłeś.
Sprawdź co się kompiluje i poszukaj znaczenia słów kompilacja i linkowanie i biblioteka?
I znajdź w swojej instalacji WinAVR (nie w internecie) pliki źródłowe (nie nagłówkowe) bibliotek.

Albert
Powrót do góry
   
Google


Google Adsense


Post# 29 Kwi 2010 10:46   





Powrót do góry
   
tmf
Moderator
Moderator


Dołączył: 12 Sie 2009
Posty: 7545
Miasto: Katowice

Post#11 29 Kwi 2010 10:47   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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.
Powrót do góry
   
Google


Google Adsense


Post# 29 Kwi 2010 10:47   





Powrót do góry
   
al555
Poziom 18
Poziom 18


Dołączył: 12 Cze 2003
Posty: 458
Miasto: wschodnia dzielnica Krakowa - Tarnów

Post#12 Post autora tematu 29 Kwi 2010 11:00   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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 ??
Powrót do góry
   
utak3r
Poziom 19
Poziom 19


Dołączył: 18 Lip 2006
Posty: 751
Miasto: Szczecin

Post#13 29 Kwi 2010 11:19   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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ą.
Powrót do góry
   
Freddie Chopin
Specjalista - Mikrokontrolery
Specjalista - Mikrokontrolery


Dołączył: 12 Gru 2005
Posty: 9863
Miasto: Zawiercie

Post#14 29 Kwi 2010 11:21   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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!!
Powrót do góry
   
utak3r
Poziom 19
Poziom 19


Dołączył: 18 Lip 2006
Posty: 751
Miasto: Szczecin

Post#15 29 Kwi 2010 11:30   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


Prawdę mówiąc, nie wyobrażam sobie programu, który by nie linkował libc ;)
Powrót do góry
   
tmf
Moderator
Moderator


Dołączył: 12 Sie 2009
Posty: 7545
Miasto: Katowice

Post#16 29 Kwi 2010 11:31   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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ę.
Powrót do góry
   
al555
Poziom 18
Poziom 18


Dołączył: 12 Cze 2003
Posty: 458
Miasto: wschodnia dzielnica Krakowa - Tarnów

Post#17 Post autora tematu 29 Kwi 2010 11:50   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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 ...
Powrót do góry
   
Google


Google Adsense


Post# 29 Kwi 2010 11:50   





Powrót do góry
   
Freddie Chopin
Specjalista - Mikrokontrolery
Specjalista - Mikrokontrolery


Dołączył: 12 Gru 2005
Posty: 9863
Miasto: Zawiercie

Post#18 29 Kwi 2010 12:10   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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!!
Powrót do góry
   
al555
Poziom 18
Poziom 18


Dołączył: 12 Cze 2003
Posty: 458
Miasto: wschodnia dzielnica Krakowa - Tarnów

Post#19 Post autora tematu 29 Kwi 2010 12:15   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


Zacytuje klasyka:
"Kto nie ryzykuje ten nie pije szampana" :D

... ale przemyśle czy nie zrobić tego jednak inaczej
Powrót do góry
   
tmf
Moderator
Moderator


Dołączył: 12 Sie 2009
Posty: 7545
Miasto: Katowice

Post#20 29 Kwi 2010 13:14   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


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.
Powrót do góry
   
uuidgen
Poziom 10
Poziom 10


Dołączył: 26 Kwi 2010
Posty: 52

Post#21 29 Kwi 2010 23:45   

Re: [AVR][WinAVR/C] Optymalizacja procedury przerwania


http://www.cs.mun.ca/~paul/cs4723/material/atmel/avr-libc-user-manual-1.6.5/FAQ.html#faq_regbind
Powrót do góry
   
Napisz nowy temat  Odpowiedz do tematu      Strona Główna -> Forum elektroda.pl -> Mikrokontrolery Ogólne -> Mikrokontrolery AVR -> [AVR][WinAVR/C] Optymalizacja procedury przerwania
Strona 1 z 1
Podobne tematy
AVR i rcall z procedury przerwania. (2)
winavr optymalizacja (7)
BASCOM - wyskok w procedury przerwania (16)
Problem z powrotem z procedury przerwania (3)
[C][asm] Optymalizacja kodu przerwania (18)
[AVR][WINAVR] Numerowanie kolejnych kompilacji pod WinAVR (4)
[Bascom] Jak wyskoczyć z procedury przerwania (10)
[ATMEGA168][AVRGCC] Przerwania optymalizacja szybkości (10)
ATmega8 + WinAVR + optymalizacja = dziwny wynik kompilacji (13)
Optymalizacja WinAVR, gcc, uC. Gdzie popełniam błąd? (7)


Administrator || Moderatorzy || Regulamin forum || Regulamin ogólny || Informacja o cookies || Reklama || Kontakt

Page generation time: 0.103 seconds

elektroda.pl temat RSS