X
  • #1 28 Apr 2010 20:37
    al555
    Level 20  
    Helpful post? (0)
    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 ?

    Code:
    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 28 Apr 2010 21:42
    lucas_mcs
    Level 22  
    Helpful post? (0)
    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 28 Apr 2010 21:50
    al555
    Level 20  
    Topic author Helpful post? (0)
    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 29 Apr 2010 09:44
    mirekk36
    Level 42  
    Helpful post? (0)
    al555 wrote:

    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 29 Apr 2010 10:08
    tmf
    Moderator Mikrokontrolery Projektowanie
    Helpful post? (0)
    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 29 Apr 2010 10:23
    al555
    Level 20  
    Topic author Helpful post? (0)
    mirekk36 wrote:

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

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

    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 29 Apr 2010 10:38
    albertb
    Level 38  
    Helpful post? (0)
    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
  • #8 29 Apr 2010 10:49
    al555
    Level 20  
    Topic author Helpful post? (0)
    albertb wrote:
    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 29 Apr 2010 10:53
    mirekk36
    Level 42  
    Helpful post? (0)
    al555 wrote:

    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 29 Apr 2010 11:46
    albertb
    Level 38  
    Helpful post? (0)
    al555 wrote:

    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
  • #11 29 Apr 2010 11:47
    tmf
    Moderator Mikrokontrolery Projektowanie
    Helpful post? (0)
    al555 wrote:
    albertb wrote:
    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 29 Apr 2010 12:00
    al555
    Level 20  
    Topic author Helpful post? (0)
    a może ktoś mi wytłumaczyć dlaczego jak dołączam np. plik:
    Quote:
    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 29 Apr 2010 12:19
    utak3r
    Level 25  
    Helpful post? (0)
    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 29 Apr 2010 12:21
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Helpful post? (0)
    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 29 Apr 2010 12:30
    utak3r
    Level 25  
    Helpful post? (0)
    Prawdę mówiąc, nie wyobrażam sobie programu, który by nie linkował libc ;)
  • #16 29 Apr 2010 12:31
    tmf
    Moderator Mikrokontrolery Projektowanie
    Helpful post? (0)
    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 29 Apr 2010 12:50
    al555
    Level 20  
    Topic author Helpful post? (0)
    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 29 Apr 2010 13:10
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Helpful post? (0)
    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 29 Apr 2010 13:15
    al555
    Level 20  
    Topic author Helpful post? (0)
    Zacytuje klasyka:
    "Kto nie ryzykuje ten nie pije szampana" :D

    ... ale przemyśle czy nie zrobić tego jednak inaczej
  • #20 29 Apr 2010 14:14
    tmf
    Moderator Mikrokontrolery Projektowanie
    Helpful post? (0)
    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.
  • #21 30 Apr 2010 00:45
    uuidgen
    Level 11  
  Search 4 million + Products
Browse Products