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

Jak działają przerwania w uC przy długich pętlach w obsłudze?

xamrex 07 Lut 2011 20:20 1335 5
REKLAMA
  • #1 9118186
    xamrex
    Poziom 28  
    Posty: 1668
    Pomógł: 82
    Ocena: 341
    Witam,
    Mam malutki problem dot. przerwań.
    Z tego co wyczytałem, gdy jest uruchomiony jakiś program główny (np. wypisuje liczby od 0 do 100 na wyświetlacz LCD)
    i przyjdzie przerwania (np. z Timera), to ten program "główny" jest zatrzymywany, następnie jest skok do etykiety, którą ma nasze przerwanie, i po wykonaniu wszystkich poleceń znowu program wraca do miejsca w którym mu przerwano.

    A teraz pytanie:
    Co jeśli w przerwaniu zrobimy nieskończoną pętlę/albo pętlę która będzie trwała bardzo długo?

    Może podam coś w praktyce.
    Przerwanie wywoływane jest co 4sek.


    
    Enable interrupts
    Enable timer1
    on timer1 Przerwanko
    ..
    Jakiś nasz program
    ..
    
    Przerwanko:
    Lcd "a"
    wait 1
    Lcd "b"
    wait 1
    lcd "c"
    wait 1
    lcd "d"
    wait 1
    lcd "e"
    wait 1
    lcd "f"
    wait 1
    Return
    


    Jak widać program zdąży na wyświetlaczu wyświetlić tylko "abcd" i potem przyjdzie nowe przerwanie.

    Chcę się zapytać czy jeśli przyjdzie te nowe przerwanie, to program porzuci swoją pracę, która ma wykonać w przerwaniu i zacznie od początku, czy po prostu jeśli jest w przerwaniu(etykieta Przerwanko) to nie reaguje na przerwania dopóki nie wykona swojej pracy do końca?

    W skrócie, czy jest możliwe aby program pokazał literki "abcdef", czy zawsze tylko zdąży pokazać "abcd"?
  • REKLAMA
  • Pomocny post
    #2 9118283
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Początkujący to widać. Wielokrotnie na tym forum powtarzana jest złota rada: obsługa przerwania musi być jak na krótsza, czyt. nie w ilości linii kodu a w czasie. Dlatego często ustawiana jest flaga w przerwaniu a dopiero w pętli głównej wykonywane jest to co należy. System przerwań jest zależny od architektury procesora można je dowolnie włączać i wyłączać czasami nawet ustawiać priorytety. Podczas obsługi przerwania blokowane są przerwania, lecz spokojnie można je włączyć. Wówczas przerwanie które zgłoszone jest podczas obsługi poprzedniego zostanie obsłużone zaraz po 1. W AVRach np. jeśli 2 przerwania zostaną zgłoszone jednocześnie obsłużone zostanie to położone wyżej w tablicy przerwań. Podczas gdy w programie obsługiwane są przerwania należy z rozwagą używać instrukcji typu wait. obsługa przerwania spowoduje wydłużenie czasu oczekiwania.
  • REKLAMA
  • #3 9118326
    xamrex
    Poziom 28  
    Posty: 1668
    Pomógł: 82
    Ocena: 341
    Wiem, że należy przerwania robić jak najkrótsze.
    Jest to pytanie czysto teoretyczne, bo na pewno czegoś takiego nie zastosuję w praktyce.
    Chodzi mi o AVR'y.
    Tutaj nie ma priorytetów przerwań jak w '51
    Napisałeś
    Cytat:
    Podczas obsługi przerwania chwilowo zazwyczaj blokuje się pozostałe przerwania,


    Czyli w tym przypadku program wypisze wszystkie literki "abcdef" tak?
  • REKLAMA
  • #4 9118343
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Wypisze, ale z góry zaznaczam ze to nie zgodne ze sztuką.
  • REKLAMA
  • Pomocny post
    #5 9118575
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    Przerwania w AVR działają w ten sposób że w chwili rozpoczęcia obsługi przerwania, kolejne przerwania są blokowane aż do instrukcji procesora RETI (tu w basicu RETURN). Nieskończona pętla w przerwaniu - czemu nie. Tylko że zakończenie takiej pętli jest możliwe tylko przez sygnał RESET. Czyli bez sensu raczej :P
    Sposób w jaki realizujesz obsługę wyświetlacza jest z gruntu zły. Może działa jak narazie z takim sprzętem, ale wyobraź sobie trochę inną sytuację w której główny proces manipuluje 10kW silnikiem na pełnych obrotach a przerwanie ni z trąd ni zowąd wrzuca bieg wsteczny. Skutki raczej nieciekawe.
    Albo jeszcze inaczej. Proces główny zapisuje w pamięci EEPROM jakieś bardzo ważne dane a tu przerwanie chce mieć dostęp do pamięci EEPROM aby odczytać jakieś ustawienia. I co?? Wyjdzie coś z tego?? Raczej kaszana...
    Obsługę wyświetlacza zrób w głównym procesie. W przerwaniu ustawiaj flagę. Główny proces w każdej iteracji powinien sprawdzać stan flagi i wyświetlać komunikat w sposób który chcesz. Następnie zeruj flagę.
    Jeżeli chcesz aby zdarzenie było obsłużone tyle razy ile jest przerwań to należy przerwania zliczać. Ale to zliczanie i testowanie powinieneś przeprowadzać jako operacje atomowe (na czas zliczania i testowania przerwania wyłączone!!), bo inaczej to się posypie.
  • #6 9118895
    xamrex
    Poziom 28  
    Posty: 1668
    Pomógł: 82
    Ocena: 341
    Tak jak pisałem, ciekawiło mnie to (gdyż nie znalazłem tego w żadnej książce) co się stanie jeśli w przerwaniu nastąpi przerwanie.
    Nie mam zamiaru nigdy robić czegoś takiego co jest w przykładzie podanym w pierwszym poście.
    Dziękuje za wyjaśnienie sytuacji.
    Temat uważam za zamknięty.
REKLAMA