Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom AVR, Atmega16 - Disable Interrupts, Disable Int0/1

MES Mariusz 02 Wrz 2012 21:49 1086 1
  • #1 02 Wrz 2012 21:49
    MES Mariusz
    Poziom 36  

    Witam.

    Pytanie odnośnie kompilatora Bascom AVR.

    Załóżmy, że w programie wykorzystuję dwa przerwania. Pierwsze pochodzi od nóżki Int0, drugie od przepełenienia Timer 1. Czy (i kiedy) w procedurze przerwania powinienem stosować wyłączanie przerwania na czas jego obsługi?

    Niby Bascom udostępnia gotowe disable interrupts (wyłącza cały system przerwań) oraz disable intx (wyłączenie obsługi pojedynczych przerwań) ale zdaje się, że uP i tak nie przyjmie kolejnego pzerwania np. od Int1 jeśli właśnie w danej chwili obsługuje. Innymi słowy nie ma możliwości, że wykonanie obsługi przerwania zostanie zatrzymane w połowie i uruchomione od początku. Mam rację?

    Czy i kiedy ma sens stosowanie disable int1 na początku procedury obsługi przerwania od int1 i ponowne jej włączanie (enable int1) przed instrukcją return?

    0 1
  • #2 02 Wrz 2012 22:06
    tmf
    Moderator Mikrokontrolery Projektowanie

    To o co pytasz nie zależy od Bascoma, tylko od architektury procesora. AVRy po przyjęciu przerwania blokują wszystkie przerwania (z wyjątkiem XMEGA, które mają przerwania wielopoziomowe i NMI). Tak więc sam nigdy nie musisz w handlerze przerwania ich blokować. Pytanie, kiedy je odblokowywać przed zakończeniem obsługi. W kilku sytuacjach, np.:
    1. Kiedy czekasz na inne przerwanie i chcesz zapewnić jego wyższy priorytet (mniejszą latencję),
    2. Kiedy nie chcesz zgubić przerwania tego samego typu - ale wtedy a) handler musi być reentrant, b) istnieje ryzyko przepełnienia stosu na skutek kolejki częściowo obsłużonych przerwań,
    3. Wykorzystujesz przerwania nietypowo, np. do przełączania kontekstu w przypadku RTOS itd.

    0