Przegląd - Reakcja na przerwanie


Ogólnie

Przerwanie pozwala urządzeniom peryferyjnym zawiesić bieżące działanie mikroprocesora i zmusić go do wykonania procedury obsługi danego urządzenia. Ta procedura obsługi wymaga zwykle wymiany danych, statusu lub informacji kontrolnej pomiędzy mikroprocesorem a danym urządzeniem. Gdy procedura obsługi zostanie zakończona, mikroprocesor powraca do wykonywania przerwanego zadania.

 

Włączanie/Wyłączanie Obsługi Przerwań

Mikroprocesor Z80 posiada dwa wejścia przerwań, maskowane programowo wejście INT oraz niemaskowane wejście NMI. Przerwanie niemaskowane nie może być zablokowane przez programistę i jest przyjmowane zawsze, gdy urządzenie peryferyjne go zażąda. Drugi rodzaj przerwania, maskowane INT, jest zarezerwowane zwykle dla bardzo ważnych funkcji, które programista możne selektywnie blokować lub odblokowywać. Dzięki temu programista może zablokować to przerwanie w okresach, gdy jego program ma ograniczenia czasowe nie pozwalające obsługiwać przerwań. W mikroprocesorze Z80 znajduje się przerzutnik flip-flop aktywacji obsługi przerwań (IFF - Interrupt Flip-Flop), który jest ustawiany lub zerowany przez programistę przy pomocy instrukcji EI (Enable Interrupt - włączenie obsługi przerwań) i DI (Disable Interrupt - wyłączenie obsługi przerwań). Gdy przerzutnik IFF jest wyzerowany, mikroprocesor nie akceptuje przerwań INT.

Dwa przerzutniki flip-flop aktywacji obsługi przerwań IFF1 i IFF2.

 

   IFF1                                    IFF2                                  
Wyłącza obsługę
przerwań
Tymczasowe miejsce
przechowywania stanu IFF1

Stan przerzutnika IFF1 jest używany do blokowania obsługi przerwań, natomiast przerzutnik IFF2 wykorzystuje się jako tymczasowe miejsce pamiętania stanu przerzutnika IFF1.

Reset mikroprocesora wymusza wyzerowanie obu przerzutników IFF1 i IFF2, co blokuje obsługę przerwań. Obsługę tę można w każdej chwili włączyć programowo instrukcją EI. Gdy instrukcja EI jest w trakcie wykonywania, to nie jest przyjmowane żadne aktywne przerwanie aż do momentu wykonania następnej po EI instrukcji. To opóźnienie jednej instrukcji jest konieczne, gdy następną instrukcją jest instrukcja powrotu. Przerwania nie będą obsługiwane aż do zakończenia wykonywania instrukcji powrotu. Instrukcja EI ustawia oba przerzutniki IFF1 i IFF2 na stan włączony. Gdy mikroprocesor przyjmuje przerwanie maskowane, oba IFF1 i IFF2 zostają automatycznie wyzerowane, co blokuje obsługę dalszych przerwań aż programista wyda nową instrukcję EI. Zwróć uwagę, iż we wszystkich poprzednich przypadkach IFF1 i IFF2 są zawsze równe.

Przeznaczeniem IFF2 jest przechowanie stanu IFF1, gdy pojawi się przerwanie niemaskowane. Gdy zostanie ono zaakceptowane, IFF1 resetuje się w celu zapobieżenia przyjmowaniu dalszych przerwań aż do ponownego włączenia ich obsługi przez programistę. W ten sposób po przyjęciu przerwania niemaskowanego przerwania maskowane są zablokowane, lecz poprzedni stan IFF1 został zapamiętany, zatem kompletny stan mikroprocesora sprzed przerwania niemaskowanego można w każdej chwili przywrócić. Przy instrukcjach LD A,I (Load Register A with Register I - ładuj akumulator A rejestrem przerwań I) oraz LD A,R (Load Register A with  Register R - ładuj akumulator A rejestrem odświeżania R) stan przerzutnika IFF2 zostaje skopiowany do znacznika parzystości, gdzie można go testować lub zapamiętywać.

Drugą metodą odtwarzania stanu IFF1 jest wykonanie instrukcji RETN (Return From Non-Mascable Interrupt - powróć z przerwania niemaskowanego).  Instrukcja ta oznacza, iż procedura obsługi przerwania niemaskowanego została zakończona i zawartość IFF2 jest teraz kopiowana z powrotem do IFF1, aby stan tego przerzutnika został odtworzony automatycznie z okresu przed przyjęciem przerwania niemaskowanego.

Tablica 1 jest podsumowaniem efektów różnych instrukcji na te dwa przerzutniki flip-flop.

 

Tablica 1. Przerzutniki flip-flop Włączania/Wyłączania Obsługi Przerwań

Operacja IFF1 IFF2 Komentarz
Reset mikroprocesora 0 0 Wyłączona obsługa przerwań maskowanych INT
Wykonanie instrukcji DI 0 0 Wyłączona obsługa przerwań maskowanych INT
Wykonanie instrukcji EI 1 1 W\łączona obsługa przerwań maskowanych INT
Wykonanie instrukcji LD A,I * * IFF2 → Znacznik Parzystości
Wykonanie instrukcji LD A,R * * IFF2 → Znacznik Parzystości
Przyjęcie NMI 0 * Wyłączona obsługa przerwań maskowanych INT
Wykonanie instrukcji RETN IFF2 * IFF2 → IFF1
oznacza zakończenie procedury obsługi przerwania niemaskowanego

 

Reakcja mikroprocesora

Przerwanie Niemaskowane

Mikroprocesor zawsze akceptuje przerwanie niemaskowane. Gdy wystąpi, mikroprocesor ignoruje następną, pobraną już instrukcję i zamiast niej wykonuje restart od adresu 0066H. Mikroprocesor działa tak, jakby wykonywał instrukcję restartu, lecz do adresu innego, niż jeden z ośmiu programowych adresów restartu. Restart jest jedynie wywołaniem podprogramu leżącego w specyficznym obszarze strony 0 w pamięci.

Obsługa przerwania maskowanego przez mikroprocesor może być zaprogramowana do wykonywania w jednym z trzech możliwych trybów.

Tryb 0

Ten tryb przypomina reakcję na przerwania mikroprocesora 8080A. W trybie 0 urządzenie przerywające może umieścić na magistrali danych dowolną instrukcję a mikroprocesor ją wykona. Zatem urządzenie przerywające dostarcza następnej instrukcji do wykonania. Często jest to instrukcja restartu, gdyż urządzenie przerywające musi w takim przypadku dostarczyć tylko jednobajtową instrukcję. Jednakże może zostać wykonana dowolna inna instrukcja, przykładowo 3-bajtowy skok do jakiejkolwiek lokacji w pamięci.

Liczba cykli zegarowych niezbędnych do wykonania tej instrukcji jest o dwa większa od normalnej liczby cykli dla tej instrukcji. Dzieje się tak z tego powodu, iż mikroprocesor automatycznie dodaje dwa stany oczekiwania do cyklu odpowiedzi na przerwanie, aby udostępnić wystarczająco dużo czasu na implementację sterowania zewnętrzną kolejką przerwań priorytetowych. Na rys.9 i rys.10 przedstawione są szczegółowe przebiegi czasowe przy odpowiedzi na przerwanie. Po zastosowaniu RESET mikroprocesor automatycznie wchodzi w Tryb 0.

Tryb 1

Ten tryb jest wybierany przez programistę, mikroprocesor reaguje na przerwanie przez wykonanie restartu od adresu 0038H. Zatem reakcja jest identyczna jak reakcja na przerwanie niemaskowane, z tą różnicą, iż adresem wywoływanym jest 0038H zamiast 0066H. Liczba cykli wymaganych do wykonania instrukcji restartu jest o dwa większa od normalnej z powodu dodanych dwóch stanów oczekiwania.

Tryb 2

Ten tryb jest najmocniejszym trybem reakcji na przerwanie. Za pomocą pojedynczego bajtu od użytkownika może zostać wykonane pośrednie wywołanie do dowolnego miejsca w pamięci.

W tym trybie programista tworzy tablicę 16-bitowych adresów startowych dla każdej procedury obsługi przerwania.  Tablica ta może być umieszczona w dowolnym miejscu w pamięci. Gdy przerwanie zostanie przyjęte, musi zostać utworzony 16-bitowy wskaźnik w celu pobrania z tej tablicy adresu startowego pożądanej procedury obsługi przerwania. Górne osiem bitów tego wskaźnika tworzy zawartość rejestru I. Rejestr I musi zostać załadowany odpowiednią wartością przez programistę, np. instrukcją LD I,A. Reset mikroprocesora zeruje rejestr I, aby był zainicjowany na 0. Dolne osiem bitów wskaźnika musi przekazać urządzenie przerywające. Od urządzenia tego wymagane jest tylko siedem bitów, ponieważ najmniej znaczący bit będzie zawsze ustawiony na zero. Potrzebne dlatego, iż wskaźnik zostanie użyty do pobrania dwóch sąsiednich bajtów, aby utworzyły kompletny 16-bitowy adres procedury obsługującej to przerwanie, a adresy muszą zawsze być umieszczane w pamięci na adresach parzystych.

 

Rys.16 Reakcja na przerwanie w trybie 2

Pierwszy bajt tablicy jest najmniej znaczącym (dolną połówką adresu). Programista musi wypełnić tę tablicę poprawnymi adresami przed przyjęciem jakiegokolwiek przerwania.

Programista może zmieniać zawartość tej tablicy umieszczając ją w RAM, co również pozwala na obsługiwanie tych samych urządzeń zewnętrznych przez różne procedury.

Gdy urządzenie przerywające dostarczy dolną część wskaźnika, mikroprocesor automatycznie umieszcza na stosie licznik programu, pobiera adres startowy z tablicy i wykonuje skok pod ten adres. Ten tryb reakcji wymaga 19 okresów zegara (siedem do pobrania dolnych 8 bitów od urządzenia przerywającego, sześć do zapisu licznika programu i sześciu do pobrania adresu skoku).

Urządzenia peryferyjne systemu Z80 posiadają łańcuchową strukturę priorytetów przerwań, która automatycznie przekazuje mikroprocesorowi zaprogramowany wektor podczas potwierdzenia przyjęcia obsługi przerwania. Więcej informacji na ten temat znajdziesz w Instrukcji Użytkownika dla Urządzeń I/O mikroprocesora Z80.

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe