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

Przerwania odpowiednik INTERRUPT

INTOUCH 30 Kwi 2011 13:14 1407 10
  • #1 9454168
    INTOUCH
    Poziom 30  
    Witam.
    W internecie znalazłem opis procedury obsługi przerwania INTERRUPT.
    Niestety używam kompilatora który tej procedury nie obsługuje bo jest przestarzała. Jak wykonać odpowiednik tej procedury używając ISR, tak żeby działała jak w poniższym opisie.

    http://difer.za.pl/Podstawy_AVRGCC.pdf -strona 39

    Cytat:
    INTERRUPT (nazwa_uchwytu)
    {
    // Instrukcje tu zawarte beda wykonywane jako obsługa przerwania
    }
    Funkcja obsługi przerwania z nazwa INTERRUPT będzie obsługiwana z włączoną obsługa innych przerwań - jej realizacja może być przerwana przez przerwanie o wyższym priorytecie.
  • #3 9454314
    INTOUCH
    Poziom 30  
    Funkcja obsługi przerwania z nazwa INTERRUPT będzie obsługiwana z włączoną obsługa innych przerwań - jej realizacja może być przerwana przez przerwanie o wyższym priorytecie.


    dla ISR w trakcie wykonywania procedury obsługi przerwania zablokowane są pozostałe przerwania.
    Potrzebuję żeby wykonywały się tylko te o wyższym priorytecie.
  • #4 9454322
    tadzik85
    Poziom 38  
    INTOUCH napisał:


    dla ISR w trakcie wykonywania procedury obsługi przerwania zablokowane są pozostałe przerwania.
    Potrzebuję żeby wykonywały się tylko te o wyższym priorytecie.


    To dobrze, że są blokowane. Wyższy priorytet? co to znaczy AVR nie ma priorytetowania przerwań
  • #5 9454328
    mirekk36
    Poziom 42  
    INTOUCH napisał:

    dla ISR w trakcie wykonywania procedury obsługi przerwania zablokowane są pozostałe przerwania.
    Potrzebuję żeby wykonywały się tylko te o wyższym priorytecie.


    Tak jak napisał kolega wyżej, tu nie ma priorytetów przerwań. Wprawdzie można je odblokować na czas wykonywania przerwania ale trzeba uważać i ew nauczyć się z tego korzystać. Podaje się wtedy makro z dodatkowym parametrem:

    ISR( wektor, ISR_NOBLOCK) {
    
    }
  • #6 9454339
    tadzik85
    Poziom 38  
    A ja jeszcze jedno dopowiem na temat tego na co należy uważać. Obsługa przerwania która nie ma zablokowanych przerwań jest krytycznym fragmentem kodu. Bo co się stanie jeśli w tym czasie zostanie zgłoszone to samo przerwanie?

    Pisanie takich rzeczy wymaga wprawy i pewności nad kontrola systemu.

    I przypominam Obsługa przerwania ma być jak najkrótsza. często należy flaga przekazać pewne operacje do pętli głównej.
  • #7 9455710
    asembler
    Poziom 32  
    tadzik85 napisał:
    A ja jeszcze jedno dopowiem na temat tego na co należy uważać. Obsługa przerwania która nie ma zablokowanych przerwań jest krytycznym fragmentem kodu. Bo co się stanie jeśli w tym czasie zostanie zgłoszone to samo przerwanie?


    Jest na to sposób przed właczeniem przerwań globalnych w srodku przerwania wykonywanego trzeba zablokować przerwanie które jest aktualnie obsługiwane.
    Oczywiscie tuż przed opuszczeniem tegoż przerwanie nie można zapomnieć o jego odblokowaniu. Przed odblokowaniem trzeb akoniecznie zablokowac globalne wskaznik przerwań.
  • #8 9455882
    tadzik85
    Poziom 38  
    Pewnie, że jest sposób sposoby są na wszystko. Ale jak początkujący nie nauczy się pisać softu zgodnie ze sztuką już na początku to problemy będzie miał do samego końca. Zrobi tak jak mówisz a później będzie się dziwił ze nie obsługiwane są wszystkie zdarzenia bo obsługa przerwania jest za długa.
  • #9 9456045
    asembler
    Poziom 32  
    Jak ustawi WDT odpowiednio i po resecie procesor mu powie dlaczego sie zresetowal :-)
REKLAMA