8259

Transkrypt

8259
8259
1. Wstęp - rodzaje przerwań
W przypadku, gdy pewne zdarzenia wewnętrzne wymagają natychmiastowej obsługi przez
procesor powiadamia o tym jednostkę centralną wysyłając odpowiedni sygnał. Cykl przyjęcia
zgłoszenia przerwania wygląda następująco:




Procesor po uzyskaniu zgłoszenia przerwania identyfikuje jego numer,
Odkłada na stos rejestr flagowy, adres powrotny, zeruje flagę IF,
Ustala adres procedury obsługi przerwania, ładuje go do pary rejestrów CS:IP, a tym
samym wykonuje skok pod podany adres,
Procedura obsługi programu musi się kończyć instrukcją IRET, wskazującą na powrót
do dawniej wykonywanego zadania. Ów proces nazywamy obsługą przerwania.
W systemie 80x86 występuje kilka rodzajów przerwań:



przerwania programowe,
przerwania sprzętowe,
przerwania specjalne.
1.1. Przerwania programowe
Procesor 80x86 wykonuje program instrukcja po instrukcji. Kolejność ta może zostać
zaburzona rozkazami CALL lub JMP, które przekazują sterowanie w inne miejsce pamięci.
Takie przerwania kodu programu określone przez użytkownika, są generowane przez
dwubajtowy rozkaz INT. Pierwszy bajt jest kodem, operacji, a drugi - zawiera numer
przerwania, które będzie obsługiwane. Rozkaz INT nie jest maskowany znacznikiem
odblokowania przerwań I. Jest używany do przenoszenia sterowania do dynamicznie
przemieszczanego podprogramu oraz takiego, którego miejsce w pamięci nie jest znane.
Program może symulować pojawienie się przerwania za pomocą instrukcji INT. Jej
Argumentem jest liczba, określająca, które z przerwań należy obsłużyć. [1]
Ten typ przerwań jest używany przez programy, które musza być dostępne z innych
programów. Numer przerwania może bowiem pozostać niezmieniony, mimo że procedura
obsługująca go może znajdować się pod różnymi adresami.
Dobrym przykładem w ten sposób wywoływanego programu jest MS-DOS.
MS-DOS udostępnia wiele funkcji, które mogą być wykorzystane w programach użytkowych.
By z nich skorzystać należy w rejestrze AH umieścić numer żądanej funkcji, a następnie
wywołać przerwanie 21 h. Na przykład, by wyświetlić na ekranie pojedynczy znak, należy
jego kod przesłać do rejestru DL i wywołać funkcję o numerze 2:
mov dl, 'A'
;Umieść znak w rejestrze DL
mov ah, 2
;Numer funkcji w AL
int 2lh
;Wywołaj MS-DOS
W przerwaniach tego typu wartości znaczników z przerwanego programu są przekładane na
stos przed przeniesieniem sterowania do innego miejsca. Wywołany podprogram w
zakończeniu musi zawierać rozkaz IRET, który pobiera znaczniki ze stosu i przesyła je do
rejestru znaczników.
Wszystkie przerwania wprowadzane przez program nie są maskowane znacznikiem I.
Przerwanie programowe wywołuje odpowiedni program obsługi z tablicy przerwań. Nie
występuje tutaj cykl potwierdzenia przerwania. Przerwania te blokują następne przerwania
maskowane. Kasowany jest również znacznik T. Wektor przerwania dla przerwań tego typu
jest albo przypisany rozkazowi, albo określony przez sam rozkaz. [1]
1.2. Przerwania sprzętowe
Przerwania te są wysyłane przez urządzenia systemowe. Sygnał przerywający jest
doprowadzany do wejścia INTR mikroprocesora. Są one maskowane znacznikiem I. Podczas
trwania ostatniego cyklu zegarowego w każdym rozkazie jest próbkowany stan wejścia INTR.
Mikroprocesor pomija tę czynność, jeżeli był wykonywany rozkaz MOV lub POP związany z
rejestrem segmentowym. Wejście INTR nie będzie wówczas próbkowane dopóty, dopóki nie
zakończy się wykonanie następnego rozkazu. Dzięki temu 32-bitowy wskaźnik będzie
załadowany do rejestrów SS i SP bez niebezpieczeństwa pojawienia się przerwy między tymi
załadowaniami. Innym wyjątkiem jest rozkaz WAIT, który powoduje, że mikroprocesor
czeka na pojawienie się niskiego poziomu logicznego na wejściu TEST. Podczas tego
oczekiwania również jest próbkowany stan wejścia INTR i gdy pojawi się przerwanie, będzie
obsłużone. Jednak po obsłudze mikroprocesor kontynuuje rozkaz WAIT. Przerwanie
pochodzące od sprzętu jest wyzwalane wysokim poziomem logicznym na wejściu INTR. Jest
ono wewnętrznie synchronizowane podczas każdego cyklu zegarowego przy narastającym
zboczu CLK; aby mogło być przyjęte, na wejściu INTR (podczas cyklu zegarowego
poprzedzającego koniec rozkazu łańcuchowego) musi pojawić się wysoki poziom logiczny.
[2]
Podczas obsługiwania tego przerwania inne przerwania są zablokowane. Kasowany jest
wówczas znacznik I, jako część reakcji na dowolne żądanie przerwania (INTR, NMI,
przerwania sprzętowe, pojedynczego kroku). Rejestr znaczników jest automatycznie
przekładany na stos. Podczas gdy poprzednia zawartość rejestru znaczników jest
przechowywana na stosie, znacznik I jest kasowany, chyba że będzie ustawiony w programie
obsługi przerwania specjalnym rozkazem. Jako reakcja na przyjęcie przerwania
mikroprocesor realizuje dwa kolejne cykle potwierdzenia przerwania.
1.2.1. Kontroler obsługi przerwań sprzętowych 8259A - wiadomości ogólne
Przerwania są generowane przez różne urządzenia, które znajdują się na płycie głównej,
komputera lub są podłączone do jego magistrali. Poprzez wysłanie przerwania każde z
urządzeń próbuje zwrócić na siebie uwagę procesora. W komputerach IBM PC obsługą,
nadchodzących do systemu przerwań, zajmuje się układ sterownika przerwań 8259. Do jego
zadań należy zapewnienie, by żadne z przerwań o niskim priorytecie nie mogło mieć wpływu
na przerwania o priorytecie wysokim oraz, by żadne z przerwań pojawiające się w systemie
jednocześnie, nie zostało zignorowane. Zawiera on tablicę przerwań sprzętowych
uporządkowaną względem ich priorytetów.
Gdy pojawi się przerwanie, to układ 8259 blokuje wszystkie pozostałe przerwania o niższym
priorytecie, dopóki procedura jego obsługi nie wyśle sygnału, który oznacza jej zakończenie.
Tabela poniżej zamieszcza przerwania obsługiwane przez układ 8259:
Kanał Opis
IRQ0 Układ czasowy
IRQ1 Klawiatura
Drugi układ 8259 (tylko komputery
IRQ2
AT)
IRQ8 Zegar czasu rzeczywistego
IRQ9 Symulowanie IRQ2
IRQ10 Zarezerwowane
IRQ11 Zarezerwowane
IRQ12 Mysz
IRQ13 Wyjątek koprocesora
IRQ14 Sterownik dysku stałego
IRQ15 Zarezerwowane
IRQ3 Szeregowy port 2
IRQ4 Szeregowy port 1
IRQ5 Sterownik dysku stałego
IRQ6 Sterownik dysków elastycznych
IRQ7 Port równoległy
Numer
przerwania
08h
09h
0Ah
70h
71h
72h
73h
74h
75h
76h
77h
0Bh
0Ch
0Dh
0Eh
0Fh
Jeśli pojawi się któreś z nich, to układ ten sprawdza, czy aktualnie nie jest obsługiwane
przerwanie o wyższym priorytecie. Jeśli nie, wówczas sygnał przerwania, oraz jego numer;
jest przekazywany do procesora. Jeśli znacznik zezwolenia na przerwanie jest ustawiony, to
CPU kończy wykonywanie bieżącej instrukcji, a następnie wywołuje procedurę obsługi
zgłoszonego przerwania. Adresy tych procedur są umieszczone w tablicy wektorów przerwań,
która znajduje się w pamięci pod adresem 0000:0000. Każdy jej element zawiera segment i
przemieszczenie procedury ISR dla każdego z 256 możliwych przerwań. Układ 8259 musi
zostać poinformowany o zakończeniu procedury obsługi przerwania. Dopiero wtedy może on
obsłużyć następne. Zadnie wysłania do portu 20h (podstawowy 8259) lub 0A0h (dodatkowy
8259) tego układu komendy EOI (End Of Interrupt) spoczywa na procedurze ISR. Polecenie
E01 nie musi być wysłane na samym końcu tej procedury. Gdy w procedurze tej zaistnieje
możliwość zezwolenia na przyjmowanie innych przerwań, to komenda EOI może zostać
wysłana do układu 8259. Kod, który realizuje tę operację wygląda następująco:
mov al, 20h
;Prześlij do AL komendę EOI
out 20h, al.
;Wyślij ją do podstawowego układu 8259
Układ 8259 oprócz rozpoznawania priorytetów i numerów przerwań, może również blokować
przyjmowanie określonych przerwań. Dla każdego przerwania istnieje bowiem specjalny
znacznik zwany maska przerwania, który oznacza, czy powinno ono zostać przez sterownik
zignorowane, czy też nie. Przy instalacji procedury obsługi należy się upewnić, czy bit,
odpowiadający danemu przerwaniu, jest wyzerowany tak, aby przerwania rzeczywiście mogły
być przyjmowane. [3]
Podprogramy, które wymagają częstej obsługi ze strony procesora, mogą użyć tych bitów do
zablokowania części przerwań (na przykład, gdy port szeregowy odbiera dane z prędkością
115200 bodów). Na obsłużenie wszystkich przerwań, pochodzących od portu szeregowego,
zegara i dysku. może bowiem nie starczyć czasu procesora. Poniższy kod blokuje wszystkie
przerwania oprócz przerwania, które pochodzi od portu szeregowego. Na większości
komputerów PC umożliwia to przeprowadzenie takiej transmisji:
Mov al, 11101111b
out 21, al
;Wartość 0 zezwala na przerwania związane z kanałem
;IRQ4 (COMI)
;Wysłanie maski do układu 8259
Oczywiście pozostawienie komputera w takim stanie nie jest dobrym rozwiązaniem. Przecież
przerwania od wszystkich pozostałych urządzeń, jak klawiatury, twardego dysku czy zegara
systemowego, nie będą przyjmowane. Dlatego też trik ten powinien być stosowany na
możliwie krótki czas.
Przed zmiana maski można z portu 21 h pobrać jej stara wartość, a następnie, po wykonaniu
krytycznego odcinka programu, wartość tę przywrócić:
.DATa
OldMask DB ?
.CODE
in al, 2lh
mov 0ldMask, a1
mov al, lll0llllb
out 21h, a1
.
.
.
mov al, OldMask
out 21h, al
;Poprzednia wartość maski
;Pobranie bieżącej wartości maski
;zapamiętanie jej
;Nowa wartość maski
;Krytyczna część programu
;Pobranie starej wartości maski
;Wysłanie jej do układu 8259
1.2.2. Układ scalony 8259A
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. [2]
Niżej przedstawiony rysunek przedstawia schemat wyprowadzeń tego układu.
Wyprowadzenia układu 8259A opisano poniżej:
IRO-IR7 (Interrupt Request) - 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;
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 ProgramlEnable 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=I) 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.
1.2.3. Cykl przyjęcia zgłoszenia [2]
Układ 8259A dysponuje trzema 8-bitowymi rejestrami: IMR, IRR i ISR. Pozycja bitowa n
każdego z nich odpowiada jednemu z wejść IRn.
Schematycznie przedstawia to poniższy rysunek:
Urządzenie połączone z wejściem o numerze n zgłasza przerwanie wymuszając wysoki
poziom logiczny na linii IRn. Ustawiając bit n w rejestrze IMR można spowodować
ignorowanie wszelkich przerwań nadchodzących ta linia.
Jeżeli wspomniany bit jest wyzerowany, informacja o przerwaniu przekazywana jest dalej i
powoduje ustawienie bitu n w rejestrze IRR. 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 IE rejestru stanu procesora), ten
ostatni reaguje sygnałem potwierdzenia na wyjściu ~INTA, 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. 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 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
bity 7- 3....... stanowią 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, w momencie przejścia do
wykonywania procedury obsługi przerwania zerowany jest odpowiedni bit rejestru ISR. W
przeciwnym wypadku (tryb E01) wyzerowania tego bitu dokonuje sama procedura obsługi
przerwania wysyłając rozkaz EOI 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.
1.2.4. Programowanie kontrolera przerwań [2]
Tryb pracy układu 8259A ustalany jest programowo. Układ otrzymuje w fazie
programowania 2-4 bajty konfiguracyjne ICWI-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 AT
Adres portu
020h dla linii
IRQ0-IRQ7
0A0h dla linii
IRQ8-IRQ15
021h dla linii
IRQ0-IRQ7
0A1h dla linii
IRQ8-IRQ15
Dostępne dane
IRR, ISR, wektor przerwań
ICW1, OCW2, OCW3
IRR, ISR, wektor przerwań
ICW1, OCW2, OCW3
IMR
ICW2, OCW3, OCW4, ICW1
LMR
OCW2, OCW3, ICW4, ICW1
Tryb dostępu
do odczytu
do zapisu
do odczytu
do zapisu
do odczytu
do zapisu
do odczytu
do zapisu
Inicjowanie pracy układu
Procesor przekazuje przez port 020h (M) lub 0A0h (S) pierwszy bajt inicjujący ICW1 .
Bajt ICW1:
0
0
0
1
bit 3
0
bit 1
bit 0
bity 7-4......... 0001 , sygnatura rozkazu;
bit 3 ............. 1 - oznacza wyzwalanie wejść IRO poziomem napięcia,
0 - wyzwalanie zboczem.
bit 2 ............. 0;
bit 1 ..............1 oznacza pojedynczy układ (XT), 0 - obecność kaskady układów;
bit 0 ..............1 oznacza, że będzie wysłany bajt ICW4, 0 oznacza brak bajtu ICW4.
Procesor przekazuje przez port 021 h (Master) lub 0A1 h (Slave) drugi bajt inicjujący ICW2.
Bajt ICW2:
bit 7
bit 6
bit 5
bit 4
bit 3
bity 7-3........ przemieszczenie (offset) wektora przerwań;
bity 2-0........ 000.
0
0
0
Jeżeli w systemie obecne są dwa układy 8259A (decyduje o tym bit 1 bajtu ICWI), 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
I bity 7-0........jedynka na pozycji n oznacza, że wejście n połączone jest z wyjściem INT I
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
bit 1
bit 0
bity 7-3........ 00000;
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 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 (bit0).
Bajt ICW4:
0
0
0
bit 4
bit 3
bit 2
bit 1
bit 0
bity 7-5........ 000;
bit 4 ............. 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;
bit 3 ............. wartość 1 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;
bit 2 ............. 1 - Master 0 - 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;
bit 1................jedynka oznacza tryb AEOI, tj. automatyczne zerowanie odpowiedniego bitu
rejestru ISR w momencie przekazania sterowania do procedury obsługi prze rwania. Wartość
0 oznacza, że procedura obsługi przerwania sama musi się zatroszczyć o wyzerowanie tego
bitu wysyłając rozkaz EOI do kontrolera (lub kontrolerów, jeżeli przerwanie pochodzi od
układu Slave);
bit 0 .............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.
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 Confrol Word), które zostaną
pokrótce omówione poniżej.
Rozkaz OCW1 podawany jest przez port 021 h (dla układu Master) lub 0A1 h (Slave):
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
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 0A0h (Slave):
bit 7
bit 6
bit 5
0
0
bit 2
bit 1
bit 0
bity 7-5........ 001 - nie adresowany rozkaz E01 ,
011 - adresowany rozkaz EOI; powoduje wyzerowanie w rejestrze ISR pozycji bitowej
adresowanej bitami 2-0, pozostałe kombinacje bitów 7-5 maja 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;
bity 4-3........ 00, sygnatura rozkazu;
bity 2-0........ zakodowany dwójkowo numer linii, której dotyczy polecenie EOI.
Rozkaz OCW3 podawany jest przez port 020h (układ Master) lub 0A0h (Slave)
0
bit 6
bit 5
0
bit 2
bit 1
bit 0
bit 7 .............. 0,
bity 6-5........ 10 - wyzerowanie maski specjalnej,
11 - ustawienie maski specjalnej,
bity 4-3........ 01 - sygnatura rozkazu;
bit 2 ...............1 - polling;
bity 1-0........ 10 - rozkaz odczytu rejestru (RR; kontroler wystawia do portu 020h (Master)
lub 0A0h (Slave) zawartość rejestru IRR,
11 - rozkaz odczytu rejestru ISR; kontroler wystawia do portu 020h (Master) lub
0A0h (Slave) zawartość rejestru ISR, pozostałe kombinacje bitów 1 0 są ignorowane.
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 sama
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 E01 , 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.
1.2.5. 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 7
x
x
x
x
bit 2
bit 7 ............. 1 - istnieje zgłoszenie oczekujące na obsługę,
0 - brak zgłoszeń;
bit 1
bit 0
bity 6-3........ nie używane;
bity 2-0........ zakodowany binarnie numer linii, na której oczekuje zgłoszenie.
1.2.6. Przerwanie niemaskowalne (NMI)
Przerwanie to również zaliczane jest do grupy przerwań sprzętowych, bowiem nie można go
wygenerować instrukcja 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 cl i 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 (Parrity 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 chwilowa utrata 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. [4]
Przerwanie niemaskowalne, nie jest jednak absolutnie nie do zamaskowania. W momencie
włączenia komputera następuje uruchomienie procedur inicjalizują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ą czterobajtowe adresy punktów wejścia do
procedur obsługi wszystkich przerwań. Jednocześnie inicjalizowane są wszystkie inne rejestry
systemu. Własna 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ę. [4]
Jedna z pierwszych operacji, jakie musi wykonać BIOS uruchamiając komputer, jest więc
zamaskowanie przerwania NMI. Odpowiada to ustawieniu bitu 7 portu o adresie 0A0h (w
XT) lub 070h (w AT). Manipulując samodzielnie tym bitem należy zachować szczególna
ostrożność - port ten bowiem steruje również praca pamięci konfiguracji CMOS-RAM.