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

atmega - Skok do innego miejsca po przerwaniu zewnętrznym, jak to zrobić?

galsan 29 Kwi 2013 11:41 1401 7
REKLAMA
  • #1 12251113
    galsan
    Poziom 12  
    Witam,

    z tego co wiem na temat przerwań, to gdy się takie pojawi, wówczas program główny jest przerywany (stan licznika stosu jest zachowywany), przerwanie jest obsługiwane w funkcji, a po jego zakończeniu jest skok do miejsca w którym był program przed wykryciem przerwania (poprawcie mnie jeśli się gdzieś mylę).
    Zależałoby mi natomiast, aby móc po wykonaniu przerwania skoczyć w inne, dowolne miejsce niż o adresie sprzed wywołania przerwania. Da się? Jeśli tak, to jak.. ;-)
  • REKLAMA
  • #2 12251148
    tmf
    VIP Zasłużony dla elektroda
    Ale po co chcesz tak zrobić? Da się tak oczywiście, wystarczy ze stosu zdjąć adres powrotu i umieścić tam inny, po czym wykonać RETI. Tylko, że to powoduje, że zostawiasz fragment kodu przerwany w przypadkowym miejscu, np. z utworzonymi na stosie zmiennymi lokalnymi. Efekt jest więc kompletnie bezsensowny.
    Można zrobić coś w stylu miniRTOS i napisać części programu jako takie pseudowątki, wtedy funkcja obsługi przerwania jest takim specyficznym schedulerem. Ale zapewne to co chcesz uzyskać można zrealizować znacznie prościej.
  • REKLAMA
  • #3 12251206
    galsan
    Poziom 12  
    mam następujący problem, mój program dokonuje pewnego cyklicznego odczytu od innego urządzenia, ten odczyt z natury trwa dość długo, w momencie kiedy dostanę przerwanie zewnętrzne odczyt jest chwilowo wstrzymywany i po wykonaniu przerwania nie chcę już wracać do procedury odczytu tego urządzenia bo nie muszę już czekać na jej zakończenie i w zasadzie może rozpocząć się ten odczyt na nowo, nie kończąc starego niezależnie od tego kiedy został ten odczyt przerwany. Z racji, że odczyt odbywa się w pętli mogę ustawić jakąś globalną flagę która zostanie ustawiona w obsłudze przerwania, wtedy po powrocie do tej pętli zostanie ona przerwana. Jakieś lepsze pomysły?
  • #4 12251220
    BlueDraco
    Specjalista - Mikrokontrolery
    Tak: przemyśl ten projekt jeszcze raz - to nie jest dobry pomysł.
  • REKLAMA
  • #5 12251232
    galsan
    Poziom 12  
    tak.. tzn pomysł z globalną flagą nie jest dobry? są lepsze rozwiązania od tej flagi? no bo rozumiem, że ze skokiem nie ma sensu
  • REKLAMA
  • #6 12251270
    tmf
    VIP Zasłużony dla elektroda
    Skoro komunikacja z urządzeniem trwa długo, to nie prościej właśnie tą komunikację umieścić w przerwaniu (oczywiście dzieląc na sensowne fragmenty), a nie blokować "pętli głównej aplikacji" na nie wiadomo ile?
  • #7 12251271
    Tomasz Gumny
    Poziom 28  
    Rozwiązanie ze znacznikiem ustawianym w przerwaniu jest jak najbardziej sensowny. W programie odczytującym urządzenie po prostu sprawdzaj ten znacznik i gdy zostanie ustawiony zakończ odczyt wcześniej, ale w sposób kontrolowany. Nie kombinuj tylko z jakimś wyskakiwaniem z przerwania, podmienianiem adresu powrotu na stosie, itp., bo nic dobrego z tego nie wyjdzie.
  • #8 12251318
    galsan
    Poziom 12  
    ok, dzięki Wszystkim za wskazówki, wykorzystałem tą globalną flagę i rozwiązało to problem.

    Zamykam. Widzę szacunek dla pomagających ale nie widać tego względem innych i tego forum. Postaraj się pisać bardziej po polsku.
    Dar.El
REKLAMA