« poprzedni punkt | następny punkt » |
Zgodnie z tym co zostało wcześniej powiedziane przedstawione zostaną teraz dwa sprzętowe systemy obsługi przerwań.
Łańcuchowy system obsługi przerwań nie pozwala na dynamiczną zmianę priorytetów, ponieważ są nadawane przez projektantów systemu mikroprocesorowego poprzez odpowiednie połączenie sterowników. Sterowniki mają specjalne wejście IEI i wyjście OEI, które należy odpowiednio połączyć. Wejście IEI jest wejściem zezwalającym na generację przerwania. Jeśli na tym wejściu jest 1, to sterownik może zgłosić przerwanie, a jeśli jest 0, to zgłaszanie przerwań jest zablokowane. Wyjście OEI wskazuje czy sterownik zgłosił przerwanie czy nie. Jeśli sterownik zgłosił przerwanie, to na tym wyjściu jest 0, a jeśli nie zgłosił to 1.
Rysunek XV.1. Połączenia łańcuchowe sterowników
Na rysunku XV.1 pokazano przykładowy system mikroprocesorowy, w którym pracują 4 sterowniki. Pokazano przykładowe ustawienie priorytetów sterowników i sposób połączenia. Połączenia tworzą otwarty łańcuch. Na wejście IEI sterownika pierwszego (Sterownik 1) podano jedynkę nadając mu tym samym najwyższy priorytet. Jeśli sterownik ten zgłosi przerwanie, to na jego wyjściu OEI pojawia się 0 blokując cały dalszy łańcuch. Wtedy sterowniki 2 - 4 będą miały na wejściach IEI zera logiczne i nie będą mogły zgłaszać przerwań. Mikroprocesor będzie obsługiwał przerwanie zgłoszone przez sterownik 1. Załóżmy teraz, że sterownik 1 nie zgłasza przerwania. Wtedy na jego wyjściu OEI pojawia się jedynka umożliwiając dalszym sterownikom zgłaszanie przerwań. Ostatni sterownik w łańcuchu może zgłosić przerwanie tylko wtedy, gdy żaden inny nie zgłosił przerwania. Mówimy, że nadano mu najniższy priorytet. Na rysunku XV.1 jest to sterownik o numerze 4. Zmianę priorytetów można przeprowadzić jedynie poprzez zmianę kolejności połączeń.
Mikroprocesor Z80 może obsługiwać przerwania w trzech trybach ustawianych programowo trzema rozkazami IMi (i = 0, 1 i 2). Tryby te określają sposób generacji adresu początku podprogramu obsługi przerwania. W trybie 0 adres jest równy 8 x nnn, gdzie nnn to trzy bity wysyłane do procesora przez specjalny układ rozstrzygania priorytetów. W trybie 1 zawsze generowany jest adres 8 x 7 (5610). W systemie mikroprocesorowym jest to adres początku podprogramu sprawdzania stanów sterowników i dopiero po ich sprawdzeniu mikroprocesor programowo rozstrzyga o kolejności obsługi. W trybie 2 adres powstaje jako złożenie bajtu wysyłanego przez sterownik zgłaszający przerwanie i bajtu przechowywanego w rejestrze I procesora (por. Wykład XIII). Umożliwia to tworzenie różnych adresów początkowych dla podprogramów obsługi poszczególnych przerwań.
Rysunek XV.2. Przebiegi czasowe w cyklu maszynowym INTA
Na rysunku XV.2 pokazano przebiegi czasowe w cyklu maszynowym INTA. Mikroprocesor wykonuje ten cykl, zamiast cyklu pobrania następnej instrukcji z programu, po zakończeniu cyklu rozkazowego, w czasie którego pojawiło się żądanie przerwania. W cyklu INTA trzeba skompletować adres pierwszego rozkazu podprogramu obsługi danego przerwania. Załóżmy, że mikroprocesor pracuje w trybie 2. Jeden bajt adresu jest przechowywany w rejestrze I mikroprocesora, a drugi ma zostać wysłany do mikroprocesora przez sterownik. W pierwszym takcie cyklu INTA na magistralę adresową zostaje wysłana zawartość licznika rozkazów PC, a na magistralę sterującą sygnał M1. Jednak nie zostanie wykonany cykl pobrania rozkazu, gdyż sygnał jest nieaktywny. Po drugim takcie mikroprocesor wstawia dwa tzw. takty oczekiwania TW czyli wydłuża czas trwania cyklu maszynowego. W czasie drugiego taktu mikroprocesor wysyła aktywny sygnał
(niski). Sygnał ten uaktywnia sterowniki i wymusza na sterowniku zgłaszającym przerwanie wysłanie na magistralę danych (DANE) bajtu stanowiącego część adresu początku podprogramu obsługi przerwania. Bajt ten, wcześniej przypisany sterownikowi przez projektanta systemu, jest zapisywany do sterownika podczas inicjalizacji pracy. Druga część adresu początku podprogramu obsługi przerwania jest zawartością rejestru I mikroprocesora. Mikroprocesor po złożeniu tych dwóch bajtów wysyła tak powstały adres na magistralę adresową, co powoduje pobranie pierwszego rozkazu z podprogramu obsługi danego przerwania.
Następne rozkazy wykonywane przez procesor, to zapis do pamięci zawartości aktualnego licznika rozkazów i ewentualnie zawartości innych rejestrów czyli zapamiętanie tzw. kontekstu procesora. Do tego celu często tworzy się tzw. stos i wykorzystuje rejestr wskaźnika stosu. Aby zapamiętać na stosie kontekst mikroprocesora zawartość wskaźnika stosu jest wysyłana na magistralę adresową, a na magistralę danych pierwszy bajt licznika rozkazów. Następnie zawartość wskaźnika stosu jest zwiększana o jeden i wysyłana na magistralę adresową, a na magistralę danych drugi bajt licznika rozkazów. W ten sposób zapisuje się na stosie aktualny adres miejsca w programie, do którego mikroprocesor wróci po wykonaniu podprogramu. Następnie wysyła się na stos zawartości rejestrów mikroprocesora. Podczas powrotu z podprogramu trzeba przywrócić kontekst mikroprocesora. Wtedy odczytuje się ze stosu kolejne bajty, adresując je wskaźnikiem stosu. Po każdym odczycie zawartość rejestru wskaźnika stosu jest zmniejszana o 1.
Możliwość zmiany sposobu działania, tj. sposobu obsługi przerwań posiadają programowane sterowniki obsługi przerwań. Działanie takich układów pokażemy na przykładzie programowanego sterownika obsługi przerwań o ośmiu wejściach (stosowanego w komputerach PC). Oznaczenie tego sterownika pokazano na rysunku XV.3.
Rysunek XV.3. Wejścia i wyjścia sterownika przerwań
Wejściom przerwań nadano priorytety w taki sposób, że najwyższy priorytet ma wejście o numerze 0, a najniższy o numerze 7. Projektant systemu ma możliwość zmiany tych priorytetów, przez przesłanie do sterownika odpowiedniego rozkazu. Po odebraniu sygnałów przerwań sterownik zgłasza ten fakt procesorowi wysyłając sygnał INT na odpowiednie wejście mikroprocesora. Mikroprocesor po zakończeniu cyklu rozkazowego wykonuje cykl maszynowy INTA wysyłając sygnał INTA. Sterownik odbierając sygnał INTA wysyła na magistralę danych kod operacyjny rozkazu CALL (skok ze śladem). Następnie mikroprocesor wykonuje dwukrotnie cykl odczytu wysyłając jeszcze dwa razy sygnał INTA. W czasie tych dwóch cykli sterownik wysyła adres początku podprogramu obsługi przerwania o najwyższym priorytecie (bajt po bajcie). Adres ten powstaje na podstawie, wcześniej zaprogramowanego przez użytkownika, adresu bazowego, który został zapisany w sterowniku podczas inicjalizacji jego pracy. Adresy początków podprogramów obsługi każdego przerwania różnią się o k x 8 (lub k x 4) od adresu bazowego, gdzie k jest indeksem poszczególnych wejść. Adres przerwania IR0 jest równy adresowi bazowemu. Adres przerwania IR1 jest równy adresowi bazowemu powiększonemu o 8 (lub 4). Adres przerwania IR2 jest równy adresowi bazowemu powiększonemu o 16 (lub 8) itd. Wykonując rozkaz CALL czyli skok ze śladem mikroprocesor, oprócz wykonania skoku, automatycznie zapamiętuje ślad czyli zawartość licznika rozkazów. Pozwala to po wykonaniu podprogramu, powrócić rozkazem RET, do odpowiedniego miejsca głównego programu.
Rysunek XV.4. Połączenie sterownika przerwań z systemem
Na rysunku XV.4 pokazano połączenia w systemie wykorzystującym opisany wyżej sterownik. Aby sterownik działał prawidłowo musi być najpierw odpowiednio zaprogramowany. Wykonuje się to, po wyzerowaniu sterownika, przesyłając do niego, w odpowiedniej kolejności, słowa rozkazowe. Zawartości poszczególnych słów rozkazowych ustawiają właściwy adres bazowy, odstęp pomiędzy adresami początków podprogramów obsługi przewań (czy 4 czy 8), tryb zmiany priorytetów, sposób łączenia ze sobą wielu takich sterowników i inne.
« poprzedni punkt | następny punkt » |