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

assembler + C - obsługa przewania

rpal 03 Lut 2010 22:39 1743 17
  • #1 7639844
    rpal
    Poziom 27  
    Nie mam żadnego pomysłu na to aby zmusić kompilator AVR GCC(+AVRstudio) aby procedurę obsługi przerwania calkowicie zrealiować jako procedurę napisaną w assemblerze reszta jest w C. Chodzi o to że niezależnie od poziomu optymalizacji kodu, kompilator dodaje prolog i epilog który mi kompletnie nie pasuje, chodzi o odkładanie rejestrów na stos. Nawet jeśli przerwanie napisane w C, nic nie robi to kopilator koniecznie chce odłożyć przynajmniej rejestry r0,r1,r2 no i potem zdejmuje je ze stosu a to już za wiele jak na ilość przeznaczonych na to cykli zegarowych.
  • #2 7639907
    Balu
    Poziom 38  
    Cytat:

    Manually defined ISRs

    In some circumstances, the compiler-generated prologue and epilogue of the ISR might not be optimal for the job, and a manually defined ISR could be considered particularly to speedup the interrupt handling.

    One solution to this could be to implement the entire ISR as manual assembly code in a separate (assembly) file. See Combining C and assembly source files for an example of how to implement it that way.

    stąd: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
  • #3 7639960
    rpal
    Poziom 27  
    Balu a tak bardzie po ludzku ? nie w wszystko z tej angielskiej paplaniny rozumiem :(
  • #4 7640111
    Balu
    Poziom 38  
    Cytat:

    Another solution is to still implement the ISR in C language but take over the compiler's job of generating the prologue and epilogue. This can be done using the ISR_NAKED attribute to the ISR() macro. Note that the compiler does not generate anything as prologue or epilogue, so the final reti() must be provided by the actual implementation. SREG must be manually saved if the ISR code modifies it, and the compiler-implied assumption of __zero_reg__ always being 0 could be wrong (e. g. when interrupting right after of a MUL instruction).

    Mam tłumaczyc?:D
    Innym rozwiazaniem jest napisanie procedury obslugi przerwania w C ale przejecie wladzy nad epi/prologiem, można to poczynić używajac ISR_NAKED atrybutu. Musisz sam zawrzec w obsludze zapis SREGu i WSZELKICH rejestrów które będziesz modyfikował.
    Przyklad:
    
    ISR(TIMER1_OVF_vect, ISR_NAKED)
    {
      PORTB |= _BV(0);  // results in SBI which does not affect SREG
      reti();
    }
    

    Rozumiesz?;-)
    Zamiast codu w C możesz sobie tak wstawke asmową walnąć:)

    Dodano po 44 [sekundy]:

    Lub możesz napisać zupełnie własny plik asmowy, jak w pierwszym cytacie i dołączyć tak jak mówi link na stronie manuala...
  • #5 7640172
    rpal
    Poziom 27  
    Balu dzięki załapałem, a co do wstawek to pytanie uzupełniające. Dotąd nie potrzebowałem uzywać wstawek typu "inline" bo zawsze robiłem to "po ludzku" czyli w oddzielnym pliku *.S , ect. Przyznam że nawet czerpiąc przykłady z manuala (szkoda przytaczać bo wiadomo o co chodzi) kompilator zgłaszal mi błędy. Czy problem jest w złych opcjach kompilatora. W sumie to żaden kłopot ale w tym przypadku to aż się prosi abym użył wstawek typu "inline" Chodzi o wstawki które posiadają argumenty np. nazwy portów, albo stałych. Niestety jak dotąd na tym poległem :)
  • #6 7640214
    asembler
    Poziom 32  
    Najprosciej to wszsytko napisz w asemblerze szybciej łatwiej i przyjemniej :-)
  • #7 7640241
    Konto nie istnieje
    Poziom 1  
  • #8 7640260
    rpal
    Poziom 27  
    atom1477 napisał:
    asembler napisał:
    Najprosciej to wszsytko napisz w asemblerze szybciej łatwiej i przyjemniej :-)


    Jak tylko zobaczyłem że odpowiedziałeś to od razu wiedziałem że udzieliłeś takiej odpowiedzi.
    Czytam i czytam odpowiedzi. Balu to, Balu tamto. Dochodzę do końca… i jest ;)

    Nad tym także myślalem nie chcę jednak wplątywać się niepotrzebną dyskusję co lepsze ASM czy C bo zaraz będzie awantura. Są jednak pewne plusy C, choćby unie, strukturym, przejżystość i szybkość pisania. Zatem pozostanę przy swoim, czyli asm jako wstawki tam gdzie trzeba coś bardzo szybko pogonić :)
  • #9 7640266
    asembler
    Poziom 32  
    Niezła logika zobaczylem odpowiedz i juz wiedzialem jaka to odpowiedz:-)
    Udowodniles tylko ze umiesz szybko czytac:)

    Trzmaj sie tej metody C +ASM bo to prawdopodobnie najszybsza we wszystkich kierunkach
  • #10 7640274
    Konto nie istnieje
    Poziom 1  
  • #11 7640374
    rpal
    Poziom 27  
    Nie za wiele tych pochwał ? :) Wszak to po prostu truizmy, Chciałem zamknąć temat ale o inline nic (szybko) nie przeczytałem
  • #12 7640405
    asembler
    Poziom 32  
    atom1477 napisał:
    Nie nie. Zobaczyłem tutaj:
    assembler + C - obsługa przewania

    Zobaczyłem że odpowiedziałeś. Ale treści odpowiedzi jeszcze nie widziałem a już wiedziałem jaka będzie. Bo niby jaka inna mogła by być? ;)
    Jak by to dotyczyło komunikacji radiowej a odpowiedział by Balu to też bym z góry znał odpowiedz ;)


    No to gratulacje.

    Asembler wcale nie jest taki wolny do pisania jak sie uwaza powszechnie to znaczy przez piewszy okres moze az do zgromadzenia wszyskich najwazniajszych bibliotek do obsługi tego i tamtego a potem to tylko include i w jeden dzien mozna napisac spory program na atmege8 nie mowiac o tym ile sie trzeba nakombinowac w C zebysie zmiecic czasowo w niektorych procedurach czego przykladem jest ten temat.
  • #13 7640466
    Konto nie istnieje
    Poziom 1  
  • #14 7640491
    rpal
    Poziom 27  
    atom1477 napisał:
    No ale co masz za problem z tym inline?

    kompilator wywala błędy kompilacji, zaznaczam nic nie wymyślam tylko zaczerpnąłem przyklady z manuala. Oczywiście wstawka typu jest ok :) tyle te bardziej rozbudowane z parametrami nie wychodzą jak trzeba opcje kompilacji mam domyslne.
  • #15 7640551
    Konto nie istnieje
    Poziom 1  
  • #16 7640562
    rpal
    Poziom 27  
    bardziej o to mi chodziło
    asm volatile("in %0, %1" : "=r" (value) : "I" (_SFR_IO_ADDR(PORTD)));

    i generalnie wszystkie przykłady od str 37 z avr-libc-user-manual.pdf
    ten twój przykład w ogóle nie ma szansy na poprawną kompilację :)
    poza tym czas na sen, kłopot zostawny na jutro
  • Pomocny post
    #17 7644709
    zumek
    Poziom 39  
    rpal napisał:
    Nie mam żadnego pomysłu na to aby zmusić kompilator AVR GCC(+AVRstudio) aby procedurę obsługi przerwania całkowicie zrealizować jako procedurę napisaną w assemblerze reszta jest w C...

    Utwórz sobie plik z rozszerzeniem "S", umieść w nim np. coś takiego i dołącz go do projektu :)
    
    #include <avr/io.h>
    
    #ifdef __SFR_OFFSET
    #undef __SFR_OFFSET
    #endif
    
    #define __SFR_OFFSET 0
    
    	.text
    	.global INT0_vect
    	.type	INT0_vect, @function
    	.extern zmienna	 
    
    
    INT0_vect:
    	push r16
    	in r16,SREG
    	push r16
    	
    	lds r16,zmienna
    	inc r16
    	sts zmienna,r16
    		
    	pop r16
    	out SREG,r16
    	pop r16
    	reti
    
    
  • #18 7644882
    rpal
    Poziom 27  
    Wielkie dzięki kol. Zumek tak właśnie lubię robić wstawki w asm :) Zamykam temat
REKLAMA