System obsługi przerwań sprzętowych
199
Rozdział 3. System obsługi przerwań sprzętowych
Najbardziej aktywnym elementem komputera jest sam procesor (CPU). Niektóre z bloków funkcjonalnych, które składają się na jego otoczenie, wykonują operacje rozciągające się w czasie na wiele cykli zegarowych. Urządzenia te nie wymagają udziału procesora dla wykonania zleconych im zadań. Są to zwykle mniej lub bardziej niezależne kontrolery, często wyposażone we własny procesor. Na ogół wystarczy, by procesor zaprogramował rejestry sterujące tego urządzenia, wydając tym samym polecenie wykonania operacji (odebranie znaku przez łącze szeregowe, zapisanie sektora na dysku).
Zainicjowana przez CPU operacja, jakkolwiek może trwać tysiące cykli zegarowych procesora, musi się kiedyś zakończyć (choćby błędem). Musi więc istnieć sposób poinformowania procesora o tym fakcie. Istnieją tutaj zasadniczo dwie możliwości:
procesor okresowo wysyła zapytanie do urządzenia. Częstotliwość „odpytywa
nia" jest ustalana przez wykonywany program i sposób stanowi kompromis po
między szybkością reakcji procesora na zakończenie operacji a spowolnieniem
jego pracy nad zadaniem pierwszoplanowym. Kod procedury odpytywania musi
być zintegrowany z programem, co powiększa jego rozmiar. Zbyt częste odpyty
wanie hamuje wykonywanie bieżącego programu. Zbyt długie przedziały czaso
we między kolejnymi odpytywaniami i nierównomiernie napływający strumień
danych mogą spowodować, że część z nich zostanie utracona na skutek przepeł
nienia nie opróżnianego bufora wewnętrznego obsługiwanego urządzenia;
urządzenie samo zgłasza wykonanie zadania. W najbliższym dogodnym dla siebie
momencie procesor przerywa realizację aktualnie wykonywanego programu by,
zapamiętawszy stan swoich rejestrów, przejść do realizacji procedury reagującej
na zgłoszenie urządzenia. Kod tej procedury na ogół nie znajduje się w ciele
programu, lecz w pamięci stałej komputera.
200 Anatomia PC
Metoda opisana w punkcie pierwszym znana jest też pod nazwąpolling i nie znajduje praktycznego zastosowania w komputerach PC. W drugim przypadku mówimy, że wystąpiło przerwanie (ang. intermpt) sprzętowe (gdyż pochodzące od urządzenia, a nie będące instrukcją programu). Ta forma sterowania przepływem danych jest w PC szeroko wykorzystywana. Znajduje ona zastosowanie w obsłudze urządzeń intensywnie wymieniających dane z pamięcią operacyjną, a więc przede wszystkim łącz szeregowych i równoległych, kontrolerów dysków (twardych i elastycznych), kart sieciowych oraz urządzeń, które dostarczają dane w sposób nieregularny - klasycznym przykładem jest tutaj klawiatura komputera. Trudno sobie wyobrazić bardziej rozsądne podejście do obsługi klawiatury, niż reagowanie na naciśnięcie klawisza za pomocą obsługi przerwania pochodzącego od sterownika klawiatury. W praktycznych zastosowaniach komputera (szczególnie wyposażonego w myszkę) klawiatura może przecież godzinami nie wysyłać żadnego znaku.
W przypadku konieczności odczytania sektora z twardego dysku czas pozycjonowania głowic nad żądaną ścieżką i wyszukania żądanego sektora jest o dwa rzędy wielkości większy niż czas potrzebny na samo przesłanie zawartych w tym sektorze 512 bajtów. Procesor jest więc zaangażowany w tę operację tylko w jej małym ułamku czasowym.
Jak widać, kandydatów do tej formy obsługi mamy wielu. Procesor posiada jednak zwykle tylko jedno wejście INT sygnalizujące przerwanie sprzętowe. Ponadto architektura PC zakłada, że każde przerwanie ma pewien priorytet, tzn. obsługa zgłoszeń uwzględnia nie tyle moment ich nadejścia, co raczej stopień ich ważności. Już samo to założenie wymaga rozróżniania zgłoszeń poprzez przyporządkowanie każdemu z urządzeń oddzielnego kanału wejściowego.
Konieczne stało się więc zastosowanie specjalizowanego układu zajmującego się wyłącznie ich obsługą. Funkcję kontrolera przerwań w komputerze XT pełni układ 8259A, zaś w modelach AT i PS/2 - dwa takie układy. W nowszych rozwiązaniach płyt głównych komputerów AT nie znajdziemy ich jako samodzielnych układów scalonych, gdyż wchodzą one przeważnie w skład jednego z układów wysokiej skali integracji, tworzących „obudowę" procesora (ang. chipset). Ze względu jednak na konieczność zachowania zgodności architektury można się odwoływać do ich rejestrów.
Kontroler 8259A ma osiem linii wejściowych, które przyjmują sygnały zgłoszeń. Układy 8259A mogą być łączone w kaskady, powielając tym samym liczbę dostępnych wejść. Istnieje również (nie wykorzystywana w architekturze PC) możliwość sterowania zewnętrznym buforem pośredniczącym między układem a silnie obciążonymi magistralami systemowymi. Warto też wspomnieć, że w modelach IBM PC/XT i AT wejścia IRn reagują na zbocze impulsu przerwania, co stwarza niebezpieczeństwo interpretacji impulsu zakłócającego jako zgłoszenia przerwania. Inaczej zagadnienie to rozwiązano w architekturach EISA i MCA, gdzie wyzwalanie przerwań odbywa się poziomem napięcia. Możliwe jest tutaj dzielenie jednej linii zgłoszeń przez kilka urządzeń (ang. shared interrupt). System EISA rezygnuje dzięki temu z drugiego kontrolera 8259A.
System obsługi przerwań sprzętowych
201
Układ scalony 8259A
Układ scalony 8259A produkowany jest między innymi przez firmy Intel, AMD i Harris. Może pracować nie tylko w trybie zgodnym z procesorami 8088/86/286, ale również z 8080/8085. Został on zaprojektowany przed powstaniem procesora 80286. Rysunek 3.1. przedstawia schemat wyprowadzeń tego układu.
Rysunek 3.1.
Rozkład wyprowadzeń układu 8259A
CS WR RD D7 D6 D5 D4 D3 D2 D1 DO
CASO
CAS1
GND
1 ^ |
28 |
ZD vcc |
2 |
27 |
Zł AO |
3 |
26 |
ZD INTA |
4 |
25 |
13 IR7 |
5 |
24 |
Zł IR6 |
6 |
23 |
Zł IR5 |
1 8259A |
22 21 |
Zł IR4 Zł IR3 |
9 |
20 |
Zł IR2 |
10 |
19 |
Zł IR1 |
11 |
18 |
Zł IRO |
12 |
17 |
Zł INT |
13 |
16 |
Zł ŚP/EN |
14 |
15 |
Zł CAS2 |
Wyprowadzenia układu 8259A opisano poniżej:
IRO-IR7 (Interrupt Reąuesi) — każde z tych wyprowadzeń może być
połączone z co najwyżej jednym urządzeniem, które - wymuszając wysoki poziom logiczny na przypisanym sobie wejściu — zgłasza żądanie obsługi przerwania. Wejście IRO posiada najwyższy, a IR7 najniższy priorytet;
~CS (Chip Select) — wejście umożliwiające procesorowi wprowadzenie
układu w tryb programowania;
~WR (Write) - procesor wymusza niski poziom logiczny na tym
wejściu, chcąc zapisywać dane do wewnętrznych rejestrów układu;
~RD (Read) — procesor wymusza niski poziom logiczny na tym wejściu,
chcąc odczytywać dane z wewnętrznych rejestrów układu;
D7-DO dwukierunkowa magistrala danych, służąca do komunikacji
między procesorem i kontrolerem (zapis i odczyt rejestrów wewnętrznych) oraz przekazywania procesorowi numeru przerwania;
202
Anatomia PC
CASO-CAS2 (Cascade) - lokalna magistrala adresowa, używana przy kaskadowym połączeniu układów 8259A. Umożliwia ona zaadresowanie do 8 takich układów;
-SP/EN (Slave Program/Enable Buffer) — w buforowanym trybie pracy
pełni rolę wyjścia (EN) sterującego buforem zewnętrznym. W trybie nie buforowanym jest to wejście (~SP) konfigurujące układ jako Master (~SP=1) lub Slave (~SP=0);
INT (Interrupt) - wyjście to połączone jest bezpośrednio z wejściem
INTR procesora, jeżeli układ 8259A pracuje jako Master. Układ pracujący w trybie Slave połączony jest swoim wyjściem INT z jednym z wejść IRn kontrolera Master,
-INTA (Interrupt Acknowledge) - wejście to połączone jest z wyjściem
INTA procesora. Przyjmuje ono sygnał potwierdzenia przyjęcia przerwania przez CPU;
AO wejście istotne jedynie w trybie programowania, służące do
rozróżniania rozkazów;
Vcc wejście napięcia zasilającego (+5V);
GND masa zasilania.
Cykl przyjęcia zgłoszenia
Układ 8259A dysponuje trzema 8-bitowymi rejestrami: IMR, IRR i ISR. Pozycja bitowa n każdego z nich odpowiada jednemu z wejść IR». Schematycznie przedstawia to rysunek 3.2.
Rysunek 3.2.
Schemat blokowy układu 8259A
Blok sterujący
do CPU
—MNT
INTA
V-V l
rr Ul |
|
>• |
|
rr rr |
estr obsługi |
A— N v-V |
J oceny prio |
£= |
str zgłoszeń |
cc |
|
ń i |
|
"o rr |
t t t |
||||
Rejestr maskujący IMR |
•
Urządzenie połączone z wejściem o numerze n zgłasza przerwanie wymuszając wysoki poziom logiczny na linii IR«. Ustawiając bit n w rejestrze IMR (Interrupt Mask Register) można spowodować ignorowanie wszelkich przerwań nadchodzących tą linią.
System obsługi przerwań sprzętowych
203
Jeżeli wspomniany bit jest wyzerowany, informacja o przerwaniu przekazywana jest dalej i powoduje ustawienie bitu n w rejestrze IRR (Interrupt Reguest Register). Jak już wspomniano wcześniej, priorytet zgłoszeń na wejściach IRO-IR7 nie jest jednakowy i maleje ze wzrostem numeru wejścia. Ponieważ jednocześnie mogą nadchodzić zgłoszenia z wielu linii, układ oceny priorytetu wybiera jednorazowo tylko jeden z nich -ten o najwyższym priorytecie. Jednocześnie aktywowany jest sygnał INT, informujący procesor o konieczności obsługi przerwania. Jeżeli obsługa przerwań nie jest programowo zablokowana (bit 1E rejestru stanu procesora), ten ostatni reaguje sygnałem potwierdzenia na wyjściu -1NTA, które jest połączone z wejściem -INTA układu 8259A.
Wybrany przez układ oceny priorytetu bit rejestru IRR przekazywany jest teraz do rejestru ISR (Interrupt Service Register). Oznacza to, że w tym momencie obsługiwane jest przerwanie z linii o numerze odpowiadającym ustawionej pozycji bitowej rejestru ISR.
Procesor wysyła teraz drugi impuls -INTA. Kontroler przerwań odpowiada na niego wystawieniem na szynę danych D7-DO wektora przerwań o następującej budowie:
bit? |
bito |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bitO |
bity 7—3 bity te, stanowiące tzw. offset, można ustalić na etapie programowania kontrolera;
bity 2-0 numer ustawionego w rejestrze ISR bitu.
Procesor traktuje ten bajt jako numer procedury obsługi przerwania, do wykonania której teraz przejdzie.
Jeżeli kontroler pracuje w tzw. trybie automatycznym (AEOI - Automatic End Of Interrupt), w momencie przejścia do wykonywania procedury obsługi przerwania zerowany jest odpowiedni bit rejestru ISR. W przeciwnym wypadku (tryb EOI) wyzero-wania tego bitu dokonuje sama procedura obsługi przerwania wysyłając rozkaz EOI (End of Interrupt) do kontrolera. Tryb pracy kontrolera (AEOI/EOI) określany jest w fazie programowania.
Niezależnie od trybu pracy, moment wyzerowania bitu rejestru ISR odpowiadającego aktualnie obsługiwanemu kanałowi oznacza gotowość kontrolera do przyjęcia następnego zgłoszenia. Należy tu jeszcze raz podkreślić, że zgłoszenia nie są obsługiwane w miarę nadchodzenia, istotny natomiast jest ich priorytet. Oznacza to, że przy pełnej kolejce oczekujących na liniach IR1-7 zgłoszeń (bity 7-1 rejestru IRR ustawione) zarejestrowanie zgłoszenia na linii IRO spowoduje zrealizowanie go w pierwszej kolejności, tj. po zakończeniu aktualnie wykonywanego cyklu obsługi.
204
Anatomia PC
Kaskadowe łączenie kontrolerów przerwań
Dla zwielokrotnienia liczby wejść układy 8259A dają się łączyć w grupy. Teoretycznie możliwe jest połączenie 9 układów (jeden Master + 8 układów Slave) i uzyskanie 8x8=64 linii przerwań. W modelach AT i PS/2 zastosowano kaskadowe połączenie dwóch kontrolerów uzyskując tym samym 8+7=15 wejść, bowiem jedno z wejść układu Master „zużywamy" na dołączenie układu Slave. Należy nadmienić, że połączenie takie prowadzi do przegrupowania priorytetów wejść; w naszym przypadku wejścia IR8-15 (układu Slave) otrzymują wyższy priorytet niż wejścia IR3-7 układu Master.
Układy połączone są między sobą trzema liniami adresowymi CASO-CAS2, które dla kontrolera Master są wyjściami, a dla Slave wejściami. Każdy z kontrolerów rozpoznaje swoją rolę (Master lub Slave) badając poziom sygnału na wejściu -SP/EN. Zero logiczne na tym wejściu konfiguruje układ jako Slave, a jedynka logiczna jako Master.
Do obydwu kaskadowo połączonych kontrolerów doprowadzony jest z procesora sygnał -INTA, lecz tylko układ Master łączy się swoim wyjściem INT z wejściem INTR procesora. Schemat kaskadowego połączenia dwóch układów 8259A w komputerach AT i PS/2 przedstawia rysunek 3.3.
Rysunek 3.3.
Schemat kaskadowego połączenia dwóch układów 8259A
Systemowa Systemowa Systemowa
szyna szyna szyna
danych adresowa sterująca
^ |
|
|
|
|
INT INT/ AO CS CAE |
^ 8259 A Master SF 0 CAS1 C |
IR2 VEN AS2 |
« |
||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
r |
\ |
|
|
|
|
|
\ r- |
|
|
|
|
|
|
|
|||
^\ /l |
|
|
|
V |
|
|
|
|
4 |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 GND |
|
|
|
|
|
|
CAS INT INTA AO CS |
0 CAS1 CAS2 8259 A Slave SP/EN |
|
||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
r |
\ |
|
|
|
||
|
|
|
|
|
||||||
Xr |
*-x . |
|
|
i |
|
|
|
|
||
|
|
|
|
|
|
|
|
|||
|
|
|
'-v , |
|
|
|
|
| IRQ 7
IRQ 6
IRQ5
IRQ 4
• IRO3
IRO 1
' IRO O
IRQ 15 IRQ 14 IRQ 13 IRQ 12 IRQ 11 IRQ 10 IRO 9 IRO 8
System obsługi przerwań sprzętowych
205
Obsługa zgłaszanych przerwań przez tak połączone układy nieco się komplikuje. Przerwania nadchodzące bezpośrednio do układu Master, tj. pojawiające się na liniach IRQO-IRQ1 i IRQ3-IRQ7 obsługiwane są tak, jak to opisano wcześniej. Odebranie zgłoszenia na linii n układu Slave (IRQ8-IRQ15) powoduje wyzwolenie reakcji opisanej poniżej.
Tabela 3.1.
Przyporządkowanie urządzeń liniom IRQ w modelach XT, AT i PS/2
Linia IRQ |
Urządzenie |
Wektor |
Linia IRQ |
Urządzenie |
Wektor |
model XT |
|||||
0 |
zegar systemowy |
08h |
4 |
COM1 |
Och |
1 |
klawiatura |
09h |
5 |
kontroler dysku twardego |
Odh |
2 |
zarezerwowane |
Oah |
6 |
kontroler dyskietek |
Oeh |
3 |
COM2 |
Obh |
7 |
LPT1 |
Ofh |
modele AT i PS/2 |
|||||
0 |
zegar systemowy |
08h |
8 |
zegar czasu rzeczywistego |
70h |
1 |
klawiatura |
09h |
9 |
wywołuje przerwanie IRQ2 |
71h |
2 |
wyjście kaskadowe do układu Slave |
Oah |
10 |
zarezerwowane |
72h |
3 |
COM2 |
Obh |
11 |
zarezerwowane |
73h |
4 |
COM1 |
Och |
12 |
zarezerwowane |
74h |
5 |
LPT2 |
Odh |
13 |
koprocesor arytmetyczny |
75h |
6 |
kontroler napędu dysków elastycznych |
Oeh |
14 |
kontroler dysku twardego |
76h |
7 |
LPT1 |
Ofh |
15 |
zarezerwowane |
77h |
Wektor oznacza numer indeksu wskazującego adres procedury obsługi danego przerwania, umieszczony w tzw. tablicy wektorów przerwań. Tablica ta znajduje się w pamięci w obszarze OOOOOh— 003ffh i zawiera czterobajtowe pozycje reprezentujące kolejne adresy. |
Fazy obsługi przerwań od układu Slave
Zgłoszenie ustawia bit n rejestru IRR w układzie Slave i powoduje, po
opracowaniu priorytetów, wysłanie sygnału INT do układu Master.
Układ Master otrzymuje zgłoszenie na linii IR2, co powoduje ustawienie bitu 2
w jego rejestrze IRR.
Układ Master, opracowawszy priorytety własnych zgłoszeń, wysyła sygnał INT
do procesora.
206
Anatomia PC
Procesor (jeżeli nie zablokowano obsługi przerwań sprzętowych) odpowiada pierwszym sygnałem -INTA.
Układ Master adresuje liniami CASO-CAS2 układ Slave odpowiadający za obsługę zgłoszonego przerwania.
W obu układach następuje jednoczesne przesunięcie bitu odpowiadającego obsługiwanemu kanałowi (bit 2 w układzie Master i bit h w układzie Slave) z rejestru IRR do rejestru ISR.
Drugi impuls -INTA wygenerowany przez CPU nakazuje układowi Slave wystawienie na szynę danych (D7-DO) bajtu danych - wektora przerwań, traktowanego jako numer procedury obsługi przerwania zgłoszonego na linii n.
W trybie AEOI zerowane są rejestry ISR (bit n w układzie Slave i bit 2 w układzie Master). W trybie EOI procedura obsługi przerwania wysyła dwa sygnały EOI: jeden do układu Master i drugi do układu Slave.
Programowanie kontrolera przerwań
Tryb pracy układu 8259A ustalany jest programowo. Układ otrzymuje w fazie programowania 2—4 bajty konflguracyjne ICW1-ICW4 (Initialization Command Word), które decydują o późniejszym zachowaniu systemu obsługi przerwań. Programując układy 8259A, procesor komunikuje się z nimi przez następujące porty.
Model XT
Adres portu |
Dostępne rejestry |
Tryb dostępu |
020h |
IRR, ISR, wektor przerwań ICW1,OCW2,OCW3 |
do odczytu do zapisu |
021h |
IMR ICW2, ICW3, ICW4, OCW1 |
do odczytu do zapisu |
Model AT
Adres portu |
Dostępne rejestry |
Tryb dostępu |
020h dla linii IRQO-IRQ7 |
IRR, ISR, wektor przerwań ICW1,OCW2,OCW3 |
do odczytu do zapisu |
OAOh dla linii IRQ8-IRQ15 |
IRR, ISR, wektor przerwań ICW1,OCW2,OCW3 |
do odczytu do zapisu |
021 h dla linii IRQO-IRQ7 |
IMR ICW2, ICW3, ICW4, OCW1 |
do odczytu do zapisu |
OA1 h dla linii IRQ8-IRQ15 |
IMR ICW2, ICW3, ICW4, OCW1 |
do odczytu do zapisu |
System obsługi przerwań sprzętowych
207
Inicjowanie pracy układu
Procesor przekazuje przez port 020h (Master) lub OAOh (Slave) pierwszy bajt inicjujący ICW1.
BajtlCWl:
0 |
0 |
0 |
1 |
bit 3 |
0 |
bitl |
bitO |
bity 7—4 0001, sygnatura rozkazu;
bit 3 jedynka oznacza wyzwalanie wejść IRQ poziomem napięcia,
zero - wyzwalanie zboczem (zmianą poziomu sygnału z O na l - ten tryb pracy jest powszechnie stosowany w PC).
bit 2 0;
bit l l oznacza pojedynczy układ (XT), O - obecność kaskady
układów (AT lub PS/2);
bit O l oznacza, że będzie wysłany bajt ICW4, O oznacza brak bajtu
ICW4.
• Procesor przekazuje przez port 021 h (Master) lub OAlh (Slave) drugi bajt inicjujący ICW2.
Bajt ICW2:
bit? |
bito |
bit 5 |
bit 4 |
bit 3 |
0 |
0 |
0 |
bity 7—3 przemieszczenie (offset) wektora przerwań; bity 2-0 000.
Jeżeli w systemie obecne są dwa układy 8259A (decyduje o tym bit ł bajtu ICW1), procesor wysyła trzeci bajt inicjujący ICW3. Budowa tego bajtu jest różna dla układu Master i Slave.
Bajt ICW3 (Master):
bit 7 |
bit 6 | bit 5 | bit 4 |
bit 3 |
0 |
0 |
0 |
bity 7-0
jedynka na pozycji n oznacza, że wejście n połączone jest z wyjściem TNT układu Slave. Zero na tej pozycji oznacza, że wejście n jest wolne lub połączone z obsługiwanym urządzeniem.
Bajt ICW3 (Slave):
0 |
0 |
0 |
0 |
0 |
bit 2 |
bitl |
bitO |
bity 7-3
00000;
208
Anatomia PC
bity 2—0 zakodowany dwójkowo numer wejścia układu Master, które jest połączone z wyjściem INT układu Slave. Nadaje to układowi Slave numer identyfikacyjny, który jest porównywany (por. „Fazy obsługi przerwań od układu Slave") z adresem ustawianym przez układ Master na liniach CASO-CAS2. Uaktywnia się więc tylko adresowany układ. Jest to rozwiązanie ogólne stosowane w dużych systemach; w PC adresowany jest i tak tylko jeden układ Slave.
• Kontroler oczekuje teraz bajtu ICW4, jeżeli zostało to zaanonsowane w bajcie ICW1 (bit 0).
Bajt ICW4
0 |
0 |
0 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bitO |
bity 7-5 bit 4
bit 3
bit 2
bit l
bitO
000;
w komputerach PC/XT/AT i PS/2 zawsze zero. Jedynka na tej pozycji modyfikuje sposób klasyfikacji priorytetów, co ma zastosowanie w wielokrotnych kaskadowych połączeniach kontrolerów, spotykanych w dużych systemach;
wartość l oznacza buforowany tryb pracy; końcówka -SP/EN układu 8259A przestaje być wtedy wejściem przełączającym tryb pracy Master!Slave i staje się wyjściem sterującym zewnętrznym buforem szyn systemowych. Również i ta możliwość znajduje zastosowanie wyłącznie w dużych systemach z silnie obciążonymi magistralami systemowymi;
l = Master, O = Slave. Bit ten używany jest do programowego konfigurowania danego układu jako Master lub Slave w sytuacji gdy ustawiony jest bit 3 (patrz powyżej) i nie ma możliwości używania do tego celu końcówki -SP/EN;
jedynka oznacza tryb AEOI, tj. automatyczne zerowanie odpowiedniego bitu rejestru ISR w momencie przekazania sterowania do procedury obsługi przerwania. Wartość O oznacza, że procedura obsługi przerwania sama musi się zatroszczyć o wyzerowanie tego bitu wysyłając rozkaz EO1 do kontrolera (lub kontrolerów, jeżeli przerwanie pochodzi od układu Slave)\
jedynka oznacza normalny tryb pracy, dostosowany do procesorów 8086/88; po drugim impulsie -INTA procesorowi przekazywany jest 8-bitowy wektor przerwań. Zero na tym bicie przełącza układ w tryb 16-bitowy, tj. 8259A wysyła bezpośrednio 16-bitowy adres procedury obsługi przerwania (a nie 8-bitowy numer, który jest dopiero indeksem w tablicy adresów) w porcjach po osiem bitów - wystawienie drugiej połowy adresu wyzwalane jest wtedy trzecim impulsem -INTA pochodzącym od CPU.
System obsługi przerwań sprzętowych
209 i
Opisane powyżej polecenia zawarte w bajtach ICW1-ICW4 zapewniaj ą konfigurowanie układu jeszcze przed rozpoczęciem obsługi zgłoszeń. Konfigurację kontrolera przerwań przeprowadzają procedury inicjalizacyjne BIOS-u wykonywane po włączeniu komputera jeszcze przed załadowaniem systemu operacyjnego.
Istnieją też rozkazy, które można przekazywać kontrolerowi podczas jego pracy modyfikując tym samym dynamicznie system obsługi przerwań stosownie do bieżących potrzeb. Układ 8259A rozpoznaje trzy rozkazy OCW1-OCW3 (Operation Control Word), które zostaną pokrótce omówione poniżej.
• Rozkaz OCW1 podawany jest przez port 021h (dla układu Master) lub OAlh (Slave):
bit? |
bito |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bitl |
bitO |
bity 7—0 jedynka na pozycji bitowej n maskuje (blokuje) linię zgłoszeń n.
• Rozkaz OCW2 podawany jest przez port 020h (dla układu Master) lub OAOh (Slave):
bit 7 bit 6 bit 5 O O bit 2 bit r biH)
bity 7-5
bity 4-3 bity 2-0
001 = nie adresowany rozkaz EOI, ,011= adresowany rozkaz EOI; powoduje wyzerowanie
w rejestrze ISR pozycji bitowej adresowanej bitami 2-0, pozostałe kombinacje bitów 7—5 mają zastosowanie w dużych systemach, gdzie obsługiwanych jest wiele urządzeń o jednakowym priorytecie(decyduje wówczas kolejność zgłoszeń). Znaczenie tych kombinacji nie będzie omawiane; "»
*>
00, sygnatura rozkazu;
zaKodowany dwójkowo numer linii, której dotyczy polecenie EOI.
Rozkaz OCW3 podawany jest przez port 020h (układ Mtister) lub OAOh (Slave)
0 |
bit6 |
bit 5 |
0 |
1 |
bit 2 |
bitl |
bitO |
bit 7 bity 6-5
bity 4-3 bit 2 bity 1-0
O,
= wyzerowanie maski specjalnej,
= ustawienie maski specjalnej,
pozostałe kombinacje bitów 6-5 są ignorowane;
l = sygnatura rozkazu;
= polling;
10 = rozkaz odczytu rejestru IRR; kontroler wystawia do portu 020h (Master) lub OAOh (Slave) zawartość rejestru IRR,
210 Anatomia PC
1 1 = rozkaz odczytu rejestru ISR; kontroler wystawia do portu 020h (Master) lub OAOh (Slave) zawartość rejestru ISR, pozostałe kombinacje bitów 1-0 są ignorowane.
Uwaga:
Dostęp do rejestru IMR odbywa się poprzez port 02 1 h (dla układu Master) lub OAlh (Slave):
in al, 021h ; rejestr IMR (Master) w akumulatorze in al, Oalh ; rejestr IMR (Slave) w akumulatorze
Można też zamaskować dowolny z kanałów, np. kanał O (co powoduje zatrzymanie procesu odmierzania czasu systemowego). Oto prosty przykład w języku Turbo C:
łinclude <dos.h> #include <conio.h>
void zegar (void) ;
void main(void) {
clrscr () ;
zegar () ;
outp (0x21, 0x01) ; /* zamaskowany kanał O -> zatrzymaj zegar */
zegar () ;
outp (0x21, 0x00) ; /* uruchom zegar */
zegar () ; t
void zegar (void)
/* pokazuje czas i czeka na naciśnięcie klawisza */ {
struct time czas; while( Ikbhit () ) (
gettime (Sczas) ; gotoxy (10, 10) ;
printf ("%02i:%02i:%02i", czas. ti_hour, czas. ti_min, czas. ti_sec) ; } getchO; /* opróżnij bufor klawiatury */
Wyjaśnienia wymaga pojęcie maski specjalnej. Jak wiemy, bit rejestru ISR aktualnie obsługiwanego kanału jest po przekazaniu CPU wektora przerwań zerowany automatycznie tylko w trybie AEOI. W trybie EOI ten sam bit może być wyzerowany dopiero przez samą procedurę obsługi przerwania, nie jest jednak wcale określone, kiedy to nastąpi. W przedziale czasowym, w którym układ kontrolera przerwań oczekuje na jawny rozkaz EOI, mogą być obsługiwane tylko zgłoszenia o priorytecie wyższym od aktualnie obsługiwanego. Zgłoszenia na liniach o niższym priorytecie są ignorowane.
Maska specjalna powoduje interpretację zawartości rejestru IMR w specyficzny sposób: ustawiony na pozycji n bit tego rejestru blokuje wprawdzie wszelkie zgłoszenia na linii n, ale jednocześnie oznacza, że wszystkie zgłoszenia na liniach o priorytecie wyższym i niższym od n będą mogły być obsługiwane w określonym powyżej przedziale czasu.
System obsługi przerwań sprzętowych
211
Polling
Gwoli ścisłości należy nadmienić, że istnieje też inna forma przekazywania informacji pomiędzy kontrolerem przerwań a procesorem - tzw. polling. Końcówka -INTA układu 8259A nie może być wtedy połączona z wyjściem -INTA procesora (ściślej, kontrolera magistrali 8288), można więc to wejście wykorzystać inaczej. Wysłanie przez procesor rozkazu OCW3 z ustawionym bitem 2 oznacza skierowanie zapytania do kontrolera (polling). Układ 8259A odpowiada wystawieniem do tego samego portu, z którego otrzymał rozkaz OCW3, bajtu danych o następującej strukturze:
bit? |
x |
x |
X |
X |
bit 2 |
bit 1 |
bitO |
bit?
bity 6-3 bity 2-0
l = istnieje zgłoszenie oczekujące na obsługę, O = brak zgłoszeń;
nie używane;
zakodowany binarnie numer linii, na której oczekuje zgłoszenie.
Każdy rozkaz odczytu portu jest traktowany jako sygnał uzgodnienia (odpowiednik sprzętowego sygnału -INT A) od procesora.
Przerwanie niemaskowalne (NMI)
Przerwanie to również zaliczane jest do grupy przerwań sprzętowych, bowiem nie można go wygenerować instrukcją kodu maszynowego. W przeciwieństwie do przerwań odbieranych liniami IRQ, które obsługiwane są przez dedykowany do tego celu kontroler 8259A, sygnał przerwania NMI kierowany jest bezpośrednio do końcówki NMI procesora. Wysoki sygnał logiczny na tym wejściu prowadzi, natychmiast po zakończeniu wykonywania bieżącego rozkazu, do wywołania procedury INT 2. Przerwanie takie nie może być zamaskowane ani rozkazem cli procesora, ani przez operacje na rejestrze IMR kontrolera 8259A. Ma ono najwyższy priorytet ze wszystkich przerwań sprzętowych.
Wywołanie przerwania NMI w przypadku komputerów PC ma miejsce po stwierdzeniu błędu parzystości pamięci operacyjnej, co należy uznać za sytuację uniemożliwiającą dalsze użytkowanie komputera. Procedura obsługi INT 2 wyprowadza na monitor stosowny komunikat (Parity error at...) i wstrzymuje pracę systemu. Jedynym wyjściem w tym momencie jest ponowny restart systemu w nadziei, że błąd parzystości spowodowany został na przykład chwilową utratą styku lub przegrzaniem modułów RAM, a nie ich trwałym uszkodzeniem. Źródłem tego przerwania może też być sygnał generowany przez uszkodzony koprocesor arytmetyczny.
212 Anatomia PC
Przerwanie niemaskowalne, jak zaraz zobaczymy, nie jest „absolutnie nie do zamaskowania". Rozpatrzmy moment włączenia komputera i uruchomienia procedur inicjalizu-jących BIOS-u. Jednym z ich zadań jest budowa tablicy wektorów przerwań, tj. stałego miejsca w „niskim" obszarze pamięci operacyjnej, w którym umieszczane są czterobaj-towe adresy punktów wejścia do procedur obsługi wszystkich przerwań. Jednocześnie inicjalizowane są wszystkie inne rejestry systemu. Własną inicjalizację przeprowadzają układy obsługi pamięci dynamicznej. Może się zdarzyć, że układ kontroli parzystości RAM stwierdzi błąd i wywoła tym samym procedurę obsługi przerwania INT 2. Adres punktu wejścia do tej procedury może jednak nie być jeszcze ustawiony i wskazywać przypadkowe miejsce w pamięci. Procesor, podejmując wykonanie programu od tego miejsca, najprawdopodobniej zawiesi się.
Jedną z pierwszych operacji, jakie musi wykonać BIOS uruchamiając komputer, jest więc zamaskowanie przerwania NMI. Odpowiada to ustawieniu bitu 7 portu o adresie OAOh (w XT) lub 070h (w AT). Manipulując samodzielnie tym bitem należy zachować szczególną ostrożność - port ten bowiem steruje również pracą pamięci konfiguracji CMOS-RAM.
Bezpiecznie można to zrobić w następujący sposób, pokazany w języku Turbo C:
unąigned char i;
i=inp<0x70);
i=i & Ox7f; /* wyzeruj bit 7, NMI aktywne */
outp(0x70,i);
i=inp(0x70);
i=i | 0x80; /* ustaw bit 7, NMI zablokowane */
outp (0x7O,i);