czy przerwanie przerwie przerwanie?

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

czy przerwanie przerwie przerwanie?

Post autor: matrix » 14 paź 2009, 18:06

napisałem pewien program, ale nadal nie mam czym zaprogramować procka, bo czekam na płytki które dojdą mi z listopadową prenumeratą, więc pytam tych co już działają w praktyce.

czy procek wykonując zewnętrzne przerwanie na przykład INT0, zacznie wykonywać mi je od nowa jeśli ponownie je wywołam? innymi słowy, mam takią etykietę:

Kod: Zaznacz cały

otwieram:
call czekaj
reset slot
call czekaj
reset spot
         do
          if clot = 0 then
          set slot
          exit do
          end if
        loop
        do
          if cpot = 0 then
          set spot
          exit do
          end if
        loop
set clza
set cpza
incr x
return
jak widać są tam dwie pętle do..loop z których wyjść można po spełnieniu określonego warunku. powiedzmy że warunek cały czas nie jest spełniany, pętla się kręci a ja wywołuję ponownie przerwanie.
czy procek zaniecha działania w tych pętlach i zacznie wykonywać etykietę od nowa?

Awatar użytkownika
Pikczu
Użytkownik
Posty: 754
Rejestracja: 18 lip 2005, 18:33
Lokalizacja: Dublin
Kontakt:

Post autor: Pikczu » 15 paź 2009, 11:50

Wydaje mi sie ze odłoży na stos.
Zrobi co tam ma zrobić w przerwaniu ale jeśli to się powtórzy kilka razy a on nie wróci i nie skończy poprzedniego zadania to stos się przepełni i kicha :(
Ale niech może się wypowiedzą bardziej doświadczeni.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 15 paź 2009, 18:51

to może inaczej, przemyślałem program i mam trochę inne pytanie:
jak przerwać wykonywanie jakiejś etykiety i zacząć wykonywać inną ale bez powrotu do tej pierwszej?
czyli powiedzmy program wykonuje mi wyżej napisaną etykietę, a ja na żądanie z zewnątrz przerywam ją i wykonuję inną bez powrotu do tej.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 15 paź 2009, 19:45

Wybierasz jakis rejestr, w przerwaniu zapisujesz do niego jakas wartosc (np. 10). Potem wracasz do glownego programu, a tam, wewnatrz petli, wstawiasz warunek, ktory sprawdza wartosc tego rejestru. Jezeli warunek jest spelniony (rejestr ma wartosc 10 w tym przypadku), to wykonujesz skok poleceniem jmp, ljmp lub podobnym do innej petli.

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 15 paź 2009, 23:50

Jeśli wywołujesz ileś razy jakiś podprogram czy przerwanie, muszisz dopilnować, żeby tyle samo razy wykonać instrukcję powrotu (w odpowiednim porządku). W przeciwnym razie powstanie problem, o którym wspomniał Pikczu.

rdt
-
Posty: 10
Rejestracja: 28 sie 2005, 11:20
Lokalizacja: mazowieckie

Post autor: rdt » 20 paź 2009, 21:00

a co z parametrem no save??

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 20 paź 2009, 21:59

rdt pisze:a co z parametrem no save??
nosave wyłącza odkładanie zawartości rejestrów roboczych na stos. Zapisuje tylko tylko adres powrotny.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 21 paź 2009, 13:23

Ddevil pisze:nosave wyłącza odkładanie zawartości rejestrów roboczych na stos. Zapisuje tylko tylko adres powrotny.
czyli co oznacza to w praktyce? jak działa?

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 21 paź 2009, 14:23

Trzeba jeszcze pamiętać że przerwania mają różne priorytety więc jeżeli jedno przerwanie ma niższy niż drugie to nie przerwie go.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 21 paź 2009, 15:51

snow pisze:przerwania mają różne priorytety więc jeżeli jedno przerwanie ma niższy niż drugie to nie przerwie go.
o tym akurat wiem. czym "mniejszy numer przerwania" tym ma wyższy priorytet.
ale co z tym nosave? jak to w praktyce wygląda?

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 21 paź 2009, 19:55

Priorytet przerwań ma znaczenie jedynie podczas równoczesnego zgłoszenie dwóch lub więcej przerwań. Jako pierwsze zostanie obsłużone to o najwyższym priorytecie, reszta będzie czekała z ustawionymi flagami. Istnieje wtedy ryzyko 'zgubienia' pojedyńczych zgłoszeń od przerwań o niższym priorytecie.

Z tego, co kiedyś wyczytałem (chyba w helpie), Bascom domyśłnie odkłada na stos zawartość wszystkich 32 rejestrów roboczych, rejestru SREG i adres powrotu. nosave wyłącza odkłądanie zawartości rejestrów na stos, zrzuca tylko adres powrotny. Nosave można wykorzystać, kiedy obsługa przerwania jest możliwie najkrótsza i nie zmienia przy tym zawartości rejestrów funkcyjnych i roboczych oraz nie wykonuje żadnych obliczeń (ryzyko zmiany zawartości rej. SREG). W takim przerwaniu najlepiej jest ustawiać jakąś flagę(i) decydującą o dlaszym przebiegu programu i testować ją np. w pętli głównej.

ODPOWIEDZ