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

Priorytety przerwań w procesorach AVR

Xaveri 26 Mar 2011 13:53 5698 9
REKLAMA
  • #1 9324514
    Xaveri
    Poziom 17  
    Kolejne pytanie z serii jak to jest i co radzicie ;)...

    Mam ATTiny 2313 i chce je podłączyć do USB - obsługa softowa za pomocą V-USB.
    Na domyślnym schemacie mam pin Data+ podłączony do zewnętrznego przerwania INT0, które ma priorytet przed INT1.

    Co się stanie jeżeli w momencie komunikacji po USB procesor otrzyma impuls na przerwanie INT1? Czy przerwania są kolejkowane i po obsłużeniu komunikacji wykona kod przypisany do drugiego przerwania, czy informacja zostanie utracona?

    Tak samo w drugą stronę - jak zamienię przerwania.
    Czy komunikacja USB będzie działać stabilnie gdy podłączę do INT1, a INT0 które ma priorytet będę katował prostokątem o f = 4kHz ?
  • REKLAMA
  • #2 9324543
    sulfur
    Poziom 24  
    Priorytety przerwań w AVR nie istnieją.
  • #3 9324604
    tmf
    VIP Zasłużony dla elektroda
    Priorytety przerwań w AVR istnieją. Tylko nie we wszystkich AVR.
    W tym przypadku nic się nie stanie - każde przerwanie ma swoją flagę, więc się kolejkują. Chyba, że dojdzie do dwóch przerwań tego samego typu, wtedy informacja się gubi.
  • REKLAMA
  • #4 9324668
    Andrzej__S
    Poziom 28  
    W momencie zaistnienia jakiegoś zdarzenia wywołującego przerwanie zostaje ustawiona jego flaga. Jeśli przerwanie to nie jest zamaskowane i globalna flaga zezwolenia na przerwania jest ustawiona, to mikrokontroler skacze do odpowiedniej procedury obsługi przerwania i globalna flaga zezwalająca na przerwania zostaje automatycznie wyłączona do czasu zakończenia tej procedury. W tym czasie wykonywanie wszystkich przerwań jest zatrzymane, niezależnie od priorytetu. O priorytecie może być mowa dopiero w momencie, kiedy podczas trwania procedury jednego przerwania zostaną ustawione co najmniej dwie flagi innych przerwań. Wtedy po powrocie z procedury obsługi tego pierwszego przerwania i włączeniu globalnej flagi zezwalającej na przerwania, o kolejności wykonania dwóch (lub więcej) oczekujących przerwań decyduje priorytet.
    W mikrokontrolerach AVR priorytetu mie da się zmienić. Jeśli to konieczne, np. w sytuacji gdy jakieś przerwanie jest dla nas ważniejsze od innego o wyższym priorytecie, można ustalać priorytet poprzez manipulację maskowaniem przerwań i włączaniem flagi globalnej zezwalającej na przerwania wewnątrz procedury obsługi mniej ważnego przerwania (tzw. zagnieżdżanie przerwań). Wymaga to jednak dosyć dokładnego zrozumienia mechanizmu przerwań i zachowania ostrożności, np. w przypadku, gdy obydwie procedury korzystają z tych samych zmiennych globalnych, bo program może pójść "w krzaki".

    EDIT:
    Dodam jeszcze, że o priorytecie decyduje pozycja w tablicy wektorów: im niższy adres wektora danego przerwania, tym wyższy priorytet.
  • #5 9324669
    Xaveri
    Poziom 17  
    sulfur napisał:
    Priorytety przerwań w AVR nie istnieją.


    Teraz kolego otwórz notę ATTiny2313 strona 43 i sobie popatrz na tabelkę...
    RESET ma najwyższy priorytet, potem INT0, potem INT1 itd.

    Czyli rozumiem, że jak jednocześnie nastąpią przerwania INT0 i INT1 to du*a ?
  • REKLAMA
  • #6 9324763
    janbernat
    Poziom 38  
    No to tylko w celu uzupełnienia tego co napisał Andrzej__S.
    Jeżeli w trakcie obsługi pierwszego przerwania pojawi się drugie przerwanie więcej niż jeden raz to to drugie przerwanie zostanie obsłużone tylko od drugiego wystąpienia drugiego przerwania.
    (Cholera- jak to napisać po ludzku?)
    Postaraj się odróżnić flagi sygnalizujące wystąpienie przerwania od flag zezwalających na obsługę przerwania.
  • Pomocny post
    #7 9324792
    Andrzej__S
    Poziom 28  
    Xaveri napisał:

    Czy przerwania są kolejkowane i po obsłużeniu komunikacji wykona kod przypisany do drugiego przerwania, czy informacja zostanie utracona?

    Może się tak zdarzyć, jeśli obsługa jednego przerwania będzie na tyle długa, że w czasie jej trwania jakieś przerwanie zostanie wywołane dwa razy (lub więcej).

    Xaveri napisał:

    Czy komunikacja USB będzie działać stabilnie gdy podłączę do INT1, a INT0 które ma priorytet będę katował prostokątem o f = 4kHz ?

    To zależy od wielu czynników: od częstotliwości taktowania mikrokontrolera, od rozmiaru procedur obsługi przerwań, a dokładniej ilości taktów potrzebnych do ich wykonania (mam na myśli najwyższą możliwą ilość taktów w przypadku, gdy niektóre instrukcje wykonywane są warunkowo), od algorytmu pętli głównej, to znaczy co ona robi z danymi dostarczonymi z przerwań i ile czasu na to potrzebuje, od prędkości transmisji USB, itd. Musisz to przeanalizować i przetestować osobiście.
    4kHz to wcale nie tak dużo przy częstotliwości taktowania 20MHz - to 5000 taktów pomiędzy przerwaniami. W tym czasie można wiele zrobić, szczególnie jak się pisze w asemblerze.
  • REKLAMA
  • Pomocny post
    #8 9324819
    dondu
    Moderator na urlopie...
    Xaveri napisał:
    Czyli rozumiem, że jak jednocześnie nastąpią przerwania INT0 i INT1 to du*a ?


    Przeczytaj jeszcze raz to:

    tmf napisał:
    W tym przypadku nic się nie stanie - każde przerwanie ma swoją flagę, więc się kolejkują.

    Chyba, że dojdzie do dwóch przerwań tego samego typu, wtedy informacja się gubi.


    Tu jest tabelka wektorów przerwań na przykładzie ATMEGA8:
    Priorytety przerwań w procesorach AVR

    Na przykład: Jeżeli zgłosi Ci się drugie przerwanie INT0 zanim wejdziesz w obsługę pierwszego INT0, to przerwanie pierwsze "ucieknie Ci" (wykona się tylko jedno).

    Ale jeżeli jest INT0 + INT1 to nie ucieknie :)
  • #9 9324926
    tadzik85
    Poziom 38  
    I priorytetów jako tako tym przerwaniom w AVRACH (nie Xmega) nie można nadawać należy jednak przyjąć że priorytety są zgodne z wektorem przerwań. Gdy nastąpią w tym samym czasie 2 przerwania zostaną wykonane wg kolejności ustalonej przez wektor przerwań.
  • #10 9325208
    Xaveri
    Poziom 17  
    OK, teraz rozumiem. Dzięki Wszystkim.
REKLAMA