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

Jak zrealizować przeskakiwanie między pętlami w Bascomie za pomocą przerwań?

cyberman 06 Wrz 2003 10:25 1739 12
  • #1 318282
    cyberman
    Poziom 12  
    Posty: 52
    Ocena: 5
    Napisalem programw bascomie,w ktorym znajduje sie kilka petli.Chcialbym zrobic tak zeby mozna bylo za pomoca przerwania zewnetrznego zrealizowac przeskakiwanie do nastepnej petli,potem do nastepnej...

    dzieki za pomoc
  • #2 318676
    Wilku
    Poziom 17  
    Posty: 330
    Pomógł: 5
    Witaj. Trochę mało info podałeś, no ale spróbujmy.
    Zakładam, że gdy program będzie pracował w ostatniej pętli to po nadejściu przerwania skoczy do pierwszej.
    Można w każdej pętli umieści zmienną, która będzie przyjmowała inną wartość dla każdej pętli. W obsłudze przerwania umieścić należy kilka warunków, które będą sprawdzały wartość zmiennej i za pomocą polecenia Goto XXX przeskakiwały do kolejnych pętli.
    Nie wiem czy jest to najlepszy i najszybszy sposób ale taki mi w pierwszej kolejności przyszedł do głowy i powienien działać. Pozdrawiam.
  • #3 318692
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Wilku napisał:
    W obsłudze przerwania umieścić należy kilka warunków, które będą sprawdzały wartość zmiennej i za pomocą polecenia Goto XXX przeskakiwały do kolejnych pętli.
    Tak NIE WOLNO ROBIĆ, powoduje to przepełnienie stosu (bo nigdy nie wychodzi z przerwania). Poprawnie można to zrobić tak: Odpowiednie pętle sprawdzają flagi (zmienne) w przypadku udpowiedniego warunku kończą działanie pętli i przeskakują do innej pętli. W obsłudze przerwania trzeba zrobić samą modyfikacje flagi (zmiennej) i koniec obsługi przerwania.
  • #4 318699
    Wilku
    Poziom 17  
    Posty: 330
    Pomógł: 5
    Fakt. Kolega elektryk ma rację. Moja myśl była nieco niedopracowana :oops:. Druga jest zdecydowanie lepsza :) .
  • #5 318867
    candle
    Spec od monitorów
    Posty: 2238
    Pomógł: 38
    Ocena: 18
    mozna tez inaczej, ale twoje bascomowe petle musialy by byc calkowicei assemblerowe
    metoda jest bardzo brutalna ale jednoczesnie bardzo efektywna.. polega na modyfikowaniu stosu w przerwaniu...
    powiedzmy ze jestes gdzies w drugiej petli i wystapilo przerwanie - przerwanie latwo "dowie sie" gdzie jest pc sprawdzajac adres powrotu, teraz tabelka gdzies tam w pamieci zawiera adresy poczatkow petli, a jakis wskaznik numer petli do ktorej nalezy przejsc (powiedzmy zwiekszany co przerwanie)
    wystarczy pobrac adres kolejnej petli, wpisac w adres powrotu z przerwania i zakonczyc przerwanie
    procesor grzecznie przejdzie do nowej petli...

    tyle ze tak sie pisze w assemblerze
    nieobioektowo nie strukturalnie syf i kila a ja to uwielbiam :twisted:
  • #6 318920
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    >>candle
    moglbys podeslac przykladzik takiej procedurki bo nie kapuje tego co zes powiedzial (no i zeby mi to bylo calkowicie w asm :) )
    najlepiej jak avr
  • #7 318945
    cyberman
    Poziom 12  
    Posty: 52
    Ocena: 5
    Wilku napisał:
    W obsłudze przerwania umieścić należy kilka warunków, które będą sprawdzały wartość zmiennej i za pomocą polecenia Goto XXX przeskakiwały do kolejnych pętli.


    Wlasnie tak zrobilem i program zawieszal sie po przejsciu do drugiej petli...Po sprawdzeniu poprawnosci programu doszedlem wlasnie do wniosku ze problemem jest przepelniajacy sie stos.



    elektryk napisał:
    Tak NIE WOLNO ROBIĆ, powoduje to przepełnienie stosu (bo nigdy nie wychodzi z przerwania). Poprawnie można to zrobić tak: Odpowiednie pętle sprawdzają flagi (zmienne) w przypadku udpowiedniego warunku kończą działanie pętli i przeskakują do innej pętli. W obsłudze przerwania trzeba zrobić samą modyfikacje flagi (zmiennej) i koniec obsługi przerwania.


    Moglbys przyblizyc to rozwiazanie.Wydaje mi sie,ze jest bardzo dobre :d

    z gory dziekuje
  • #8 318953
    candle
    Spec od monitorów
    Posty: 2238
    Pomógł: 38
    Ocena: 18
    tak to wyglada na intelu
    x86:
    Pre1:	xor	ebx,ebx
    	mov	edi,Offset Bzdury
    Loop1:	mov	al,60h
    	mov	[edi+ebx],al
    	inc	ebx
    	and	ebx,7fh
    	cmp	al,1
    	jne	Loop1
    Pre2:	mov	edx,3dah
    Loop2:	in	al,dx
    	test	al,8
    	jne	Loop2
    Loop3:	movzx	eax,Byte ptr [edi+ebx]
    	inc	ebx
    	and	ebx,7fh
    	add	ecx,eax
    	jne	Loop3
    	jmp	Pre1
    ;------------------------------------
    Interupt:
    	push	eax
    	push	ebx
    	push	esi
    	pushf
    	mov	esi,Offset Loops
    	mov	ebx,Loop_Counter
    	inc	ebx
    	and	ebx,3
    	mov	Loop_counter,ebx
    	mov	eax,[esi+ebx*4]
    	mov	[esp+16],eax
    	popf
    	pop	esi
    	pop	ebx
    	pop	eax
    	reti
    ;-------------------------------------
    align	4
    Loop_Counter	dd	0
    Loops		dd	Offset Pre1,Offset Pre2,Offset Loop3,Offset Pre1
    Bzdury		db	80h dup(?)
    
    


    mam nadzieje ze sobie przelozycie na jaki wam sie tam procesor zamarzy
  • #9 318954
    marchewa101
    Poziom 17  
    Posty: 301
    Pomógł: 2
    Ocena: 8
    z tego co elektryk powiedzial to chyba ma to wygladac tak (struktora jak w delphi bo bascoma to nie znam):

    Obsluga przerwania:
    i:=1;
    powrot

    Petla:
    I:=0;
    while I=1 do
    begin

    end;

    >>candle - dzieki zobacze co sie da z tym zrobic
    Zmieniony 2x

    No i jszcze w asm na avr za przykladem candle, ale troszke inaczej


    
    ;Petla główna
    Main:
    ; Sroty pierdoty
    rjmp Main
    
    Skok:
    ; Sroty pierdoty
    rjmp Skok
    
    INT_0:
    	pop r30
    	pop r31				; Zawartosc stosu do r30:r31
    	ldi r30, high(Skok)
    	ldi r31, low(Skok)	; Wpisz do r30:r31 adres etykiety Skok
    	push r31
    	push r30			; Zapisz na stos r30:r31
    reti
    


    polega to na:
    Zanim powroci sie z przerwania
    zmienia sie wartosc stosu... w ktorym zapisane jest
    adres do procedury do ktorej bedzie sie powracac (Main)
    na adres Skok
  • #10 319058
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    candle napisał:
    mam nadzieje ze sobie przelozycie na jaki wam sie tam procesor zamarzy
    No właśnie ten kod nie jest przenoszalny na wszystkie procesory, np na procesorach PIC nie ma bezpośredniego dostępu do stosu, można tylko skakać i wracać.
  • #11 319060
    candle
    Spec od monitorów
    Posty: 2238
    Pomógł: 38
    Ocena: 18
    ale masz push'e i pop'y
    pozatym pamietajcie ze jesli petla kozysta ze stosu to musicie skorzystac z pomocy kolegi Mark'a :)

    Pre1: push L 'MARK'
    

    :lol:
  • #12 319061
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    candle napisał:
    ale masz push'e i pop'y
    Właśnie że nie ma, jest stos sprzętowy do adresów powrotów a zmienne się przechowuje w pamięci albo na stosie softwarowym. To takie małe "dziwactwo" architektury PIC (przynajmniej w pic16 tak jest, w pic18 jest pewnie jakieś dodatkowe "udziwnienie")
  • #13 319063
    candle
    Spec od monitorów
    Posty: 2238
    Pomógł: 38
    Ocena: 18
    :oops: przyznaje sie bez bicia - pic'ow nie programowalem
    6502, 68k, x86, '51, od biedy z80 i avr
    no i pierwsza prawda programisty niskiego poziomu - assembler przenoszalny nie jest :)
    ale.. to tylko pomysl ze starych dobrych czasow

Podsumowanie tematu

✨ Dyskusja dotyczy realizacji przeskakiwania między kilkoma pętlami w programie napisanym w Bascomie za pomocą przerwań zewnętrznych. Pierwsza propozycja polegała na bezpośrednim skakaniu do kolejnych pętli w obsłudze przerwania za pomocą polecenia Goto, jednak została odrzucona ze względu na ryzyko przepełnienia stosu i zawieszania programu. Zalecane jest stosowanie flag (zmiennych), które są modyfikowane w przerwaniu, a same pętle sprawdzają te flagi i decydują o zakończeniu i przejściu do następnej pętli. Alternatywnie, bardziej zaawansowaną, lecz niezalecaną metodą jest modyfikacja stosu w przerwaniu, polegająca na zmianie adresu powrotu z przerwania na adres kolejnej pętli, co wymaga programowania w assemblerze i jest specyficzne dla architektury procesora. Przykłady kodu w assemblerze dla procesorów x86 i AVR zostały przedstawione, jednak podkreślono, że takie rozwiązania nie są przenośne na wszystkie mikrokontrolery, np. PIC, które mają sprzętowy stos adresów powrotu i ograniczony dostęp do jego modyfikacji. Wskazano, że w PIC zmienne przechowuje się w pamięci lub na stosie programowym, co komplikuje implementację tego typu mechanizmu. Podsumowując, najbezpieczniejszym i najbardziej przenośnym rozwiązaniem jest użycie flag sterujących pętlami, modyfikowanych w przerwaniu, a nie bezpośrednie skoki w obsłudze przerwania.
Wygenerowane przez model językowy.
REKLAMA