int main() - Wojciech Bieniecki

Download Report

Transcript int main() - Wojciech Bieniecki

Systemy operacyjne
Wykład 4
Implementacja systemu
przerwań
dr inż. Wojciech Bieniecki
Instytut Nauk Ekonomicznych
i Informatyki
http://wbieniec.kis.p.lodz.pl/pwsz
1
Schemat obsługi przerwania
Procesor (SO)
Sterownik
Urządzenia
Rejestr stanu
Rejestr sterownika
Rejestr danych
Urządzenie
Adres proc. obsł. przerw. 1
Adres proc. obsł. przerw. 2
Tablica wektorów przerwań
procedura obsł. przerw. 2
Program użytkownika żąda od
systemu operacyjnego wykonania
operacji pobrania danych z
urządzenia wejściowego.
Bufor danych
2
Schemat obsługi przerwania
Procesor (SO)
Sterownik
Urządzenia
Rejestr stanu
Rejestr sterownika
Rejestr danych
Urządzenie
Adres proc. obsł. przerw. 1
Adres proc. obsł. przerw. 2
Tablica wektorów przerwań
procedura obsł. przerw. 2
System operacyjny sprawdza, czy
urządzenie jest gotowe do
transmisji badając zawartość
rejestru stanu.
Bufor danych
3
Schemat obsługi przerwania
Procesor (SO)
Sterownik
Urządzenia
Rejestr stanu
Rejestr sterownika
Rejestr danych
Urządzenie
Adres proc. obsł. przerw. 1
Adres proc. obsł. przerw. 2
Tablica wektorów przerwań
procedura obsł. przerw. 2
System operacyjny programuje
sterownik urządzenia wpisując
odpowiedni rozkaz do jego rejestru
sterowania.
Bufor danych
4
Schemat obsługi przerwania
Procesor (PU)
Sterownik
Urządzenia
Rejestr stanu
Rejestr sterownika
Rejestr danych
Urządzenie
Adres proc. obsł. przerw. 1
Adres proc. obsł. przerw. 2
Tablica wektorów przerwań
procedura obsł. przerw. 2
Bufor danych
System operacyjny oddaje procesor
procesowi użytkownika.
W tym samym czasie sterownik nadzoruje
pracę urządzenia, bez interwencji
procesora.
5
Schemat obsługi przerwania
Procesor (SO)
IRQ
Sterownik
Urządzenia
Rejestr stanu
Rejestr sterownika
Rejestr danych
Urządzenie
Adres proc. obsł. przerw. 1
Adres proc. obsł. przerw. 2
Tablica wektorów przerwań
procedura obsł. przerw. 2
Bufor danych
Kończy się proces transmisji, odebrana
informacja jest umieszczona w rejestrze danych
sterownika.
W rejestrze stanu sterownik ustawia flagę
oznaczającą zakończenie komunikacji, a
następnie zgłasza przerwanie.
Powoduje to automatyczne zapamiętanie
bieżącego stanu procesora i adresu powrotu
oraz przekazanie sterowania do systemu
operacyjnego.
6
Schemat obsługi przerwania
Procesor (SO)
Sterownik
Urządzenia
Rejestr stanu
Rejestr sterownika
Rejestr danych
Urządzenie
Adres proc. obsł. przerw. 1
Adres proc. obsł. przerw. 2
Tablica wektorów przerwań
procedura obsł. przerw. 2
Bufor danych
Następuje identyfikacja źródła przerwania
dzięki wektorowemu systemowi przerwań.
Z tablicy wektorów przerwań pobierany
jest adres procedury obsługi tego
przerwania.
7
Schemat obsługi przerwania
Procesor (SO)
Sterownik
Urządzenia
Rejestr stanu
Rejestr sterownika
Rejestr danych
Urządzenie
Adres proc. obsł. przerw. 1
Adres proc. obsł. przerw. 2
Tablica wektorów przerwań
Sterowanie zostaje przekazane do
procedury obsługi przerwania.
procedura obsł. przerw. 2
Bufor danych
8
Schemat obsługi przerwania
Procesor (SO)
Sterownik
Urządzenia
Rejestr stanu
Rejestr sterownika
Rejestr danych
Urządzenie
Adres proc. obsł. przerw. 1
Adres proc. obsł. przerw. 2
Tablica wektorów przerwań
procedura obsł. przerw. 2
Podprogram obsługi przerwania kopiuje
zawartość rejestru danych sterownika do
bufora w pamięci i kończy swoją pracę.
Bufor danych
Procesor wraca do przerwanego zadania.
9
Wektorowy system przerwań
System ten wymaga programowalnego kontrolera przerwań PIC, połączonego z
procesorem.
Jeśli urządzenie peryferyjne zgłosi przerwanie, to kontroler je identyfikuje i
przekazuje jego numer procesorowi.
Numer ten jest indeksem w tablicy wektorów przerwań (ang. IVT).
Wartościami tej tablicy są adresy procedur obsługi przerwań. Każde przerwanie
może więc mieć własną procedurę obsługi.
Tablica ta umieszczana jest zazwyczaj na początku pamięci operacyjnej komputera
i wraz z procedurami obsługi przerwań stanowi część systemu operacyjnego.
10
Kontekst procesora
Problemem jest zapamiętanie kontekstu procesora, aby mógł on
wrócić do zadania które realizował przed wystąpieniem przerwania.
Kontekst procesora - adres w pamięci operacyjnej spod którego ma
być pobrany następny, po zakończeniu procedury obsługi przerwania
rozkaz do realizacji (tzw. adres powrotu) oraz stan rejestrów
procesora.
Najmniejszy kontekst obejmuje adres powrotu i rejestr stanu
maszyny (dla x86 jest to rejestr flag).
Najczęściej kontekst pamiętany jest na stosie.
11
Konflikt przerwań
Możemy różnie rozwiązywać sytuację równoczesnego zgłoszenia dwóch lub
większej ilości przerwań.
Najprostsze rozwiązanie: wyłączenie systemu przerwań na czas realizacji
procedury i ponowne włączenie po jej zakończeniu.
Systemy priorytetowe pozwalają na selektywne wyłączanie przerwań o niższym
priorytecie nazywane maskowaniem. Możliwe jest również odkładanie na później
ich realizacji.
We współczesnych systemach operacyjnych, celem zminimalizowania czasu, kiedy
określona grupa przerwań lub wszystkie przerwania są wyłączone, procedury
obsługi przerwań są podzielone na dwie części zwane połówkami.
Górna połówka jest procedurą, która jest wykonywana po otrzymaniu przerwania.
Jej działanie jest krótkie i najczęściej sprowadza się do potwierdzenia odebrania
przerwania i uruchomienia dolnej połówki.
Dolna połówka wykonuje te czynności obsługi przerwania, które są czasochłonne.
12
Kolejka przerwań
Często urządzenie wejścia / wyjścia nie jest wstanie obsłużyć szybko
otrzymywanych zleceń.
Najczęstszym rozwiązaniem jest zastosowanie tablicy stanów urządzeń.
Jest ona umieszczona w pamięci operacyjnej komputera i zawiera odwzorowane
rejestry stanu urządzeń peryferyjnych.
Jeśli urządzenie jest zajęte realizacją jakiegoś żądania, to następne zlecenia dla
tego urządzenia są umieszczane w kolejce, gdzie czekają na realizację.
W czasie, gdy obsługa przerwania przedłuża się, proces czeka na jej zakończenie
blokując procesor.
Systemy wielozadaniowe umożliwiają użycie mechanizmu wait/notify, aby
przełączyć w tym czasie procesor na inny proces.
13
Odwołania do systemu operacyjnego
Tylko system operacyjny może wykonywać operacje I/O
Proces użytkownika chce komunikować się ze światem zewnętrznym
Proces użytkownika może wykonać rozkaz INT, który umożliwia zażądanie od
systemu operacyjnego wykonania wymaganych przez nie operacji.
Ten rozkaz jest nazywany przerwaniem programowym, ponieważ powoduje
przełączenie procesora w tryb monitora, oraz wykonanie odpowiedniej
procedury obsługi przerwania.
Ta procedura odpowiedzialna jest za zaprogramowanie sterownika
odpowiedniego urządzenia.
Nazywana jest ona wywołaniem systemowym (ang. system call) lub funkcją
systemową. Proces użytkownika może przekazać jej pewne argumenty.
14
Wywołania systemowe
Wywołania systemowe są bezpośrednio dostępne dla programistów piszących
aplikacje w języku asemblerowym.
Niektóre wersje języków wysokiego poziomu (np. C) pozwalają bezpośrednio
ich użyć.
Częściej jednak mamy do czynienia z pośrednim wywołaniem funkcji
systemowych.
Języki wysokiego poziomu dostarczają bibliotek podprogramów, które
stanowią opakowania na wywołania systemowe (np. funkcja printf() w języku
C).
15
Argumenty wywołań systemowych
Podobnie jak zwykłe podprogramy, wywołania systemowe mogą
wymagać pewnych argumentów wywołania.
Te argumenty mogą być przekazywane na trzy różne sposoby:
przez rejestry;
przez stos;
przez pamięć – adres początku obszaru pamięci, gdzie
zapisane są argumenty, umieszczany jest w rejestrach.
16
Kategorie wywołań systemowych
Nadzór nad procesami
– tworzenie nowych procesów;
– ładowanie do pamięci programów użytkownika;
– kończenie działania procesu;
– debugowanie;
– profilowanie działania procesu;
– zawieszanie działania procesu;
– synchronizacja procesów.
Operacje na plikach
– tworzenie;
– otwieranie i zamykanie plików;
– odczyt;
– zapis;
– zmiana pozycji wskaźnika pliku.
17
Kategorie wywołań systemowych
Urządzenia wejścia / wyjścia
Wiele systemów operacyjnych, łączy system zarządzania urządzeniami
zewnętrznymi z systemem plików, dlatego te same wywołania, które
służą do obsługi plików są także używane do obsługi urządzeń wejścia wyjścia.
Niektóre funkcje systemowe z tej grupy mogą być specyficzne jedynie dla
urządzeń.
Utrzymywanie informacji
Najprostszymi przykładami wywołań należących do tej kategorii są
wywołania pozwalające pobrać bieżący czas i datę.
Bardziej skomplikowane pozwalają poznać wszelkie informacje
statystyczne związane z systemem, jak: ilość wolnego miejsca na dysku,
ilość dostępnej pamięci operacyjnej, liczba użytkowników, itp.
18
Kategorie wywołań systemowych
Komunikacja między procesami
W przypadku komunikacji przez sieć lub łącza logiczne muszą istnieć
wywołania pozwalające utworzyć połączenie, nadać i odebrać komunikat
oraz zamknąć połączenie.
W przypadku komunikacji przez pamięć musi istnieć funkcja systemowa
pozwalająca zażądać od systemu operacyjnego obszaru pamięci, który
będzie współdzielony przez dwa lub większą liczbę procesów
równocześnie.
19
Przerwania w systemie MS-DOS
BIOS = Basic Input/Output System
Zadaniem BIOS-u jest odizolowanie systemu operacyjnego od bezpośredniej
obsługi sprzętu (hardware), co umożliwia wymianę i doskonalenie urządzeń bez
zmian metod posługiwania się nimi.
BIOS zawiera procedury obsługi podstawowych części składowych komputera, a
także procedury inicjujące ten system po włączeniu zasilania i ładujące system
operacyjny z pamięci masowej.
20
Przerwania w systemie MS-DOS
System operacyjny DOS i programy użytkowe mogą żądać od systemu BIOS
wykonania operacji przez wykonanie instrukcji przerwania programowego (INT).
Poszczególne części BIOS obsługujące różne urządzenia mają przydzielone
oddzielne numery przerwań.
W systemie DOS występują cztery źródła przerwań.
– Przerwanie niemaskowalne (błąd parzystości, błąd sygnalizowany przez
kartę rozszerzającą lub koprocesor arytmetyczny).
– Przerwania sprzętowe (pochodzą od urządzeń wejścia-wyjścia
znajdujących się na płycie głównej lub karcie rozszerzającej).
– Przerwania generowane przez procesor (tzw. wyjątki, np. wykrycie
dzielenia przez zero).
– Przerwania programowe (są wynikiem wykonania instrukcji INT).
21
Przerwania w MS-DOS
Priorytety
W jednej chwili może zgłosić kilka urządzeń żądanie o przerwanie, a
procesor w danej chwili może obsłużyć tylko jedno z nich.
Każdemu przerwaniu sprzętowemu przyporządkowano pewien
numer (priorytet). Numer ten mówi, w jakiej kolejności należy
wykonywać przerwania
Przerwanie o najwyższym priorytecie (IRQ0) ma numer 8 i jest to
przerwanie zegarowe.
Jeśli w tej samej chwili klawiatura i zegar zgłoszą żądanie o
przerwanie, procesor najpierw wykona przerwanie zegarowe,
ponieważ ma większy priorytet (0), a dopiero później przerwanie
klawiatury (priorytet 1).
22
Tabela przerwań sprzętowych procesora x86
Numer
Wektor
Opis
0x00
0x0000:0x0000
Dzielenie przez zero
0x01
0x0000:0x0004
Tryb pracy krokowej procesora
0x02
0x0000:0x0008
Przerwania niemaskowalne
0x03
0x0000:0x000C
Punkt przerwania (przerwanie wykonywania kodu
programu)
0x04
0x0000:0x0010
Przepełnienie arytmetyczne
0x06
0x0000:0x0018
Nieprawidłowy kod operacji
0x07
0x0000:0x001C
Koprocesor arytmetyczny niedostępny
Tabela przerwań sprzętowych kontrolera
Przerwanie
IRQ
Adres wektora
Funkcje komputera x86
08h
IRQ0
0x0000:0x0020
Czasomierz systemowy
09h
IRQ1
0x0000:0x0024
Kontroler klawiatury
0Ah
IRQ2
0x0000:0x0028
Przyłączona do linii IRQ od 8 do 15
0Bh
IRQ3
0x0000:0x002C
Port COM2: 2F8h:2FFh
0Ch
IRQ4
0x0000:0x0030
Port COM1: 3F8h-3FFh
0Dh
IRQ5
0x0000:0x0034
Port LPT2: 378h lub 278h
0Eh
IRQ6
0x0000:0x0038
Kontroler dyskietek
0Fh
IRQ7
0x0000:0x003C
Port LPT1: 3BCh lub 378h
010h
IRQ8
0x0000:0x01C0
Zegar czasu rzeczywistego
011h
IRQ9
0x0000:0x01C4
Zastępuje linię IRQ 2
012h
IRQ10
0x0000:0x01C8
Nieprzypisana
013h
IRQ11
0x0000:0x01CC
Nieprzypisana
014h
IRQ12
0x0000:0x01D0
Port myszy komputera PS/2
015h
IRQ13
0x0000:0x01D4
NPU (jednostka przetwarzania numerycznego)
016h
IRQ14
0x0000:0x01D8
Dysk twardy
017h
IRQ15
0x0000:0x01DC
Karta drugiego dysku twardego
24
Wektor przerwań
W procesorach x86 adresy przerwań przechowywane są w tzw. tablicy wektorów
przerwań.
Tablica ta ma 256 pozycji i zajmuje 1024 bajty pamięci i rozpoczyna się od adresu
0000:0000, czyli na samym początku pamięci komputera.
Adresy procedur przerwań są 32-bitowe – w dwóch pierwszych bajtach zapisany
jest offset, a w następnych dwóch segment.
Do szybkiego znajdywania adresu przerwania można posłużyć się wzorem:
offset = 4*NR
segment = 4*NR + 2
gdzie NR jest numerem przerwania.
Np. offset przerwania 5 zapisany jest pod adresem 0000:0014H, a segment pod
adresem 0000:0016H.
25
Przerwania programowe
Przerwania programowe są generowane przez program przy użyciu instrukcji INT
Z przerwań programowych możemy korzystać na trzy sposoby
Wymuszenie generacji przerwania o podanym adresie - np. funkcją
INT nr_przerwania
Przerwanie jest obsługiwane w standardowy sposób
Zmianę standardowego programu obsługi przerwania używanego przez system
(np. przerwania 1CH generowanego przez zegar systemowy).
Można to osiągnąć pisząc własną funkcję obsługi przerwania.
Można wykorzystać jeden z wolnych numerów przerwań (np. od F1H do FFH) i
przyporządkować mu własną funkcję obsługi.
W praktyce przerwania programowe stosuje się najczęściej do wykonywania
operacji wejścia-wyjścia oraz pewnych operacji systemowych (np.: przydzielanie
pamięci, ustawianie/pobieranie czasu itp.)
26
Przykład – zmiana adresu przerwania
Zmień adres przerwania zegarowego 1CH, tak aby wskazywał na procedurę,
zakładając, zaczyna się ona etykietą PRZERWANIE
CLI
MOV
MOV
MOV
MOV
STI
AX,0
ES:AX
ES:70H,OFFSET PRZERWANIE
ES:72H,SEG PRZERWANIE
Można również to uczynić za pomocą przerwania 21H i funkcji 25H.
W rejestrze AL podajemy numer przerwania, natomiast adres przekazujemy w
DS:DX.
MOV
MOV
MOV
MOV
MOV
INT
AX,SEG PRZERWANIE
DS,AX
DX,OFFSET PRZERWANIE
AL,01CH
AH,25H
21H
27
Tabela przerwań programowych (BIOS)
Numer przerwania
Wektor
Opis
0x05
0x0000:0x0014
Obsługa klawisza Print-Screen
0x10
0x0000:0x0040
Obsługa kart graficznych
0x11
0x0000:0x0044
Konfiguracja sprzętowa BIOS
0x12
0x0000:0x0048
Dostępny rozmiar pamięci
0x13
0x0000:0x004C
Operacje dyskowe
0x14
0x0000:0x0050
Obsługa komunikacji szeregowej
0x15
0x0000:0x0054
Usługi systemowe
0x16
0x0000:0x0058
Obsługa klawiatury
0x17
0x0000:0x005C
Obsługa drukarki
0x19
0x0000:0x0064
Ładowanie systemu operacyjnego
0x1A
0x0000:0x0068
Zegar czasu rzeczywistego (RTC)
0x1B
0x0000:0x006C
Obsługa kombinacji Ctrl+Break
0x1F
0x0000:0x007C
Obsługa tablicy znaków karty graficznej
Lista przerwań programowych (DOS)
Nr przerwania
Wektor
Opis
0x20
0x0000:0x0080
Zakończenie programu
0x21
0x0000:0x0084
Interfejs funkcji systemowych DOS
0x22
0x0000:0x0088
Adres zakończenia programu
0x23
0x0000:0x008C
Adres wyjścia z programu po zakończeniu przez
Ctrl+C
0x24
0x0000:0x0090
Adres procedury obsługi błędów krytycznych
0x25
0x0000:0x0094
Obsługa dysku - odczyt
0x26
0x0000:0x0098
Obsługa dysku - zapis
0x27
0x0000:0x009C
Obsługa programów TSR
0x28
0x0000:0x0A0
Pętla oczekiwania na naciśnięcie klawisza
0x2E
0x0000:0x00B4
Wykonywanie poleceń zewnętrznych
0x2F-0x3F
0x0000:0x0B8
0x0000:0x0FC
Obszar innych przerwań wykorzystywanych przez
programy działające w środowisku DOS (sterowniki
myszy, CDROMu, interfejs programów rezydentnych
etc.)
Funkcje DOS
Niektóre przerwania podzielone są na podfunkcje np. 10H czy 21H.
Jeżeli chcemy wywołać jakąś funkcję systemową to w rejestrze AH
umieszczamy numer funkcji i wywołujemy określone przerwanie.
Standardowe znakowe wejście/wyjście
01h - Czytanie znaku z echem
02h - Wypisywanie znaku
03h - Czytanie znaku z urządzenia dodatkowego
04h - Wypisywanie znaku do urządzenia dodatkowego
05h - Drukowanie znaku
06h - Bezpośrednie korzystanie z konsoli
07h - Bezpośrednie czytanie z konsoli
08h - Czytanie znaku
09h - Wypisywanie tekstu
0Ah - Czytanie wiersza z klawiatury
0Bh - Sprawdzanie stanu klawiatury
0Ch - Opróżnianie bufora klawiatury
30
Funkcje DOS
Gospodarka pamięcią operacyjną
48h - Przydział pamięci
49h - Zwalnianie pamięci
4Ah - Zmiana wielkości przydzielonej pamięci
58h - Ustaw/Pobierz strategię przydziału pamięci
Zarządzanie procesami
31h - Usypianie procesu
4B00h - Ładowanie i uruchamianie programu
4B03h - Ładowanie nakładki
4Ch - Kończenie procesu
4Dh - Pobieranie kodu powrotu procesu potomnego
62h - Pobieranie adresu PSP
31
Funkcje DOS
Operacje na plikach używających dojść
3Ch - Tworzenie dojścia
3Dh - Otwieranie dojścia
3Eh - Zamykanie dojścia
3Fh - Czytanie przez dojście
40h - Pisanie przez dojście
42h - Ustawianie wskaźnika w pliku
45h - Kopiowanie dojścia
46h - Zmiana dojścia
5Ah - Tworzenie pliku roboczego
5Bh - Tworzenie nowego pliku
67h - Ustawienie maksymalnej liczby otwartych dojść
68h - Stabilizowanie pliku
6Ch - Rozszerzone otwieranie dojścia
32
Funkcje DOS
Nadzorowanie pracy urządzeń
4400h - Pytanie o opis urządzenia
4401h - Ustalanie opisu urządzenia
4402h - Wysyłanie polecenia do urządzenia znakowego
4403h - Odbieranie informacji od urządzenia znakowego
4404h - Wysyłanie polecania do urządzenia blokowego
4405h - Odbieranie informacji od urządzenia blokowego
4406h - Pytanie o stan urządzenia wejściowego
4407h - Pytanie o stan urządzenia wyjściowego
4408h - Pytanie, czy urządzenie ma wymienny nośnik
440Bh - Ustalanie liczby nawrotów
440Ch - Ustalanie matrycy znaków urządzeń
440Dh - Ogólna kontrola urządzeń blokowych
440Eh - Pobierz mapę urządzenia
440Fh - Ustaw mapę urządzenia
33
Funkcje DOS
Działania na katalogach
39h - Tworzenie katalogu
3Ah - Usuwanie katalogu
3Bh - Ustalanie katalogu bieżącego
41h - Usuwanie pozycji z katalogu
43h - Sprawdzanie lub zmiana atrybutów pliku
47h - Pytanie o katalog bieżący
4Eh - Znajdowanie pierwszego pliku w katalogu
4Fh - Znajdowanie następnego pliku katalogu
56h - Zmiana pozycji w katalogu
57h - Sprawdzanie lub zmiana daty i czasu modyfikacji pliku
Funkcje sieciowe
4409h - Pytanie, czy urządzenie blokowe jest dostępne przez sieć
440Ah - Pytanie, czy plik lub urządzenie są dostępne przez sieć
5E00h - Pytanie o nazwę stanowiska roboczego
5E02h - Ustalanie znaków sterujących drukarką
5F02h - Pytanie o pozycję listy przypisań
5F03h - Dodanie pozycji do listy przypisań
5F04h - Usuwanie pozycji z listy przypisań
34
Funkcje DOS
INNE FUNKCJE SYSTEMOWE
0Dh Stabilizowanie stanu dysków
0Eh Ustalanie dysku bieżącego
19h Pytanie o dysk bieżący
1Ah Ustalanie buforu roboczego
1Bh Pytanie o charakterystykę dysku roboczego
1Ch Pytanie o charakterystykę urządzenia blokowego
25h Ustalanie adresu kodu obsługi przerwania
2Ah Pytanie o datę
2Bh Ustalanie daty
2Ch Pytanie o czas
2Dh Ustalanie czasu
30h Pytanie o numer wersji systemu
33h Pytanie wrażliwości na znak Control-C lub jej ustalenie
35h Pytanie o adres kodu obsługi przerwania
36h Pytanie o rozmiar wolnego obszaru na dysku
38h Pytanie o kod kraju lub ustalenie tego kodu
54h Pytanie o stan sygnalizacji weryfikacji
59h Pytanie o pełny kod błędu
65h Pobierz rozszerzone informacje o kraju
66h Ustal/Pobierz globalną matrycę znaków
35
Przerwania maskowalne i niemaskowalne
Istnieją dwa rodzaje przerwań sprzętowych:
maskowalne to jest takie, które mogą być przekazane do procesora,
niemaskowalne NMI (Non Maskable Interrupt), które muszą być
przekazywane do procesora zawsze.
NMI generowane jest w sytuacjach krytycznych (gdyż ma najwyższy priorytet) np.
przy błędzie parzystości.
Tablica wektorów przerwań procesowa Intel x86 ma 256 pozycji z czego pierwsze
32 są przeznaczone na NMI
36
Przerwania maskowalne i niemaskowalne
O tym, czy przerwanie maskowalne jest w danej chwili maskowane czy nie
informuje znacznik przerwań IF (interrupt flag) w rejestrze znaczników.
Jeżeli jest on równy zero przerwania są maskowane.
Zawartość znacznika możemy ustawiać lub zerować za pomocą instrukcji CLI (clear
interrupts) zerowanie, oraz STI (set interrupts) ustawianie.
Przerwana możemy także maskować wybiórczo tzn. powodować, by przy
ustawionym znaczniku IF (przerwania dozwolone) niektóre przerwania nie
pojawiały się.
W PIC istnieje rejestr maskowania przerwań, który określa, które przerwania
sprzętowe będą pojawiać się. Każdy bit tego rejestru odpowiada jednemu
przerwaniu sprzętowemu (IRQ0 – IRQ7).
37
Tryby pracy sterownika przerwań 8259A
Tryb pracy układu 8259A ustalany jest programowo.
Układ otrzymuje w fazie programowania 2-4 bajty konfiguracyjne ICW1 –
ICW4 (Initialization Command Word), które decydują o późniejszym zachowaniu
systemu obsługi przerwań.
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).
Maskowanie zwykłe – korzystając ze słowa sterującego OCW1 można załadować
rejestr maskowania przerwań odp. słowem – maską, blokującą wybrane źródła
przerwań.
Jeżeli żądanie przerwania zostało już potwierdzone przez procesor za pomocą
sygnału INTA=0, przerwanie to będzie mimo to blokować zgłoszenia przerwań o
niższych priorytetach.
Można temu zapobiec – za pomocą bitu EOI w słowie sterującym OCW2 oraz za
pomocą trybu maskowania specjalnego, programowanego słowem OCW3.
38
Tryby pracy sterownika przerwań 8259A
Maskowanie specjalne – Jeżeli realizowany jest program obsługi
przerwania, który w trakcie wykonywania został zamaskowany, można za
pomocą maskowania specjalnego, programowanego słowem sterującym
OCW3, umożliwić obsługę przerwań o niższych priorytetach nie czekając
na zakończenie realizowanego programu obsługi przerwania wyższego,
lecz zamaskowanego priorytetu.
Rotacje specjalne – polega na tym, że można programować w dowolnej
chwili realizacji programu źródła przerwania o najniższym priorytecie.
Jest zawsze przesunięciem priorytetów o określoną liczbę pozycji w
prawo.
Może być wykonana w dowolnej chwili trwania programu.
39
Tryby pracy sterownika przerwań
Autorotacja – polega na tym że obsłużonemu żądaniu przerwań zostaje zawsze
przyporządkowany najniższy priorytet.
Zmiana priorytetów następuje każdorazowo w wyniku realizacji sterowania EOI.
Autorotacja jest stosowana szczególnie wtedy, gdy brak przekonujących
argument za przyporządkowaniem jednym źródłom przerwań wyższych
priorytetów niż innym.
W przypadku autorotacji każde źródło musi czekać na obsługę co najwyżej do
zakończenia obsługi siedmiu pozostałych źródeł przerwań.
Może być zrealizowana po zakończeniu trwania programu.
Tryb ankietowania – element 8259 nie pracuje jako sterownik przerwań, lecz
jako generator flag statusowych, które mogą być testowane przez system
mikroprocesorowy w celu wykonania operacji wejścia – wyjścia.
Operacje te muszą być inicjowane przez mikroprocesor za pomocą słowa
sterującego OCW3.
40
Przykład – zmiana priorytetów
Bezpośrednio po wyzerowaniu sterownika priorytety przerwań zostają ustawione
w ten sposób, iż ich wartość maleje wraz ze wzrostem indeksu wejścia (wejście
IR0 posiada priorytet najwyższy, równy 0, zaś IR7 — najniższy, równy 7).
Priorytety te mogą być zmieniane w sposób cykliczny.
Wskazanemu wejściu przypisuje się priorytet najniższy, zaś priorytety pozostałych
wejść ulegają rotacji identycznej jak przesunięcie najniższego priorytetu.
Programowanie sterownika 8259A odbywa się przy pomocy słów sterujących
wysyłanych na port 20H
Postać tego słowa zmieniająca priorytety przerwań to 11000xxx gdzie xxx to
numer wejścia które otrzyma najniższy priorytet (7).
mov
out
al,
20h,
11000111b
al
41
Przykład – zmiana częstości przerwania zegara
Funkcja powoduje zmianę wartości początkowej licznika 0 układu 8253 przy pomocy słowa
sterującego 36h wysłanego na port 43h, a następnie młodszego i starszego bajtu nowej
wartości wysłanej na port 40h .
Wpisanie 0h powoduje ustawienie licznika na domyślną wartość która umożliwia
osiągnięcie najdłuższego interwału czasu.
mov
out
mov
out
out
al,
43h,
al,
40h,
40h,
36h
al
0
al
al
Wstawienie 4000h powoduje czterokrotne zwiększenie częstotliwości generowania
przerwań przez licznik.
mov
out
mov
out
mov
out
al,
43h,
ax,
40h,
al,
40h,
36h
al
4000h
al
ah
al
42
Mieszanie kodu C i asemblera
Nie każde przerwanie lub operację sprzętową da się wykonać w
języku C.
Jest możliwe umieszczanie wstawek w kodzie.
Uwaga – nie są one w standardzie ANSI C.
#pragma inline
int main()
{
char*napis="\nTekst przykladowy $";
asm{
MOV DX, napis
MOV AH,9
INT 33
}
}
#pragma inline
int main()
{
char*napis="\nTekst przykladowy $";
_asm MOV DX, napis
_asm MOV AH,9
_asm INT 33
}
}
43
Asembler i C
Zdefiniowano zmienne globalne odwołujące się do rejestrów
_AX, _AL, AH, _BX, _BL, _BH, _CX, _CL, _CH, _DX, _DL,
_DH, _CS, _DS, _SS, _ES, _SP, _BP, _SI, _DI
REGS – unia zawierająca stan wszystkich rejestrów.
main()
{
union REGS r;
r.x.ax = 1;
r.h.cl = 2;
}
44
Język C: pamięć i przerwania
FP_OFF(adres); – wyznaczenie ofsetu . Wyodrębnienie z adresu części, która
stanowi przemieszczenie względem początku segmentu
FP_SEG(adres); – wyznaczenie adresu segmentu dla danego adresu
MK_FP(seg, off); – utworzenie adresu na podstawie segmentu i offetu
getvect(nr_przerwania); – zwraca adres funkcji obsługującej dane przerwanie
(wartość wektora przerwania)
setvect(nr_przerwania, adres/nazwa_funkcji); – przypisuje funkcję jako obsługę
przerwania (aktualizuje wektor)
inport(nr_portu), inportb – odczyt danej z portu o numerze danym parametrem
outport, outportb – zapis danej do portu o numerze danym parametrem
45
Język C: pamięć i przerwania
int86(nr_przerw, in_regs, out_regs);
Załadowanie zestawu rejestrów do procesora, wykonanie przerwania i zwrócenie
zawartości rejestrów procesora
intdos(in_regs, out_regs);
Załadowanie zestawu rejestrów do procesora, wykonanie przerwania 21H i
zwrócenie zawartości rejestrów procesora
enable();
Pozwala maskować przerwania jest dozwolone od każdego urządzenia
zewnętrznego.
disable();
Wyłącza dostęp przerwaniom sprzętowym.
46
Przykład w języku C
int main()
{
char napis[] = "Mój napis!$";
struct REGPACK reg;
reg.r_ax = 0x900;
reg.r_dx = FP_OFF(napis);
reg.r_ds = FP_SEG(napis);
intr(0x21, &reg);
return 0;
}
47
Przykład: obsługa zegara
#include <stdio.h>
#include <dos.h>
#define INT 0x1C
static volatile count, flag;
void interrupt far timer()
{
if(count++%18)
return;
flag++;
}
main()
{
void interrupt (far *ref)();
unsigned int i = 0;
ref = getvect(INT);
setvect(INT, timer);
while(!kbhit())
{
printf("%u", i++)
if(flag)
flag--;
putchar('\a');
}
setvect(INT, ref);
}
48
Przykład: melodyjka
W programie użytkownika ma być wyłączona operacja drukowania,
spowodowana naciśnięciem klawiszy Shift i PrtSc.
Zamiast tej operacji ma być grana melodia.
#include <dos.h>
#include <conio.h>
void interrupt nowa_funkcja();
void interrupt(*stara_funkcja)();
int main()
{
stara_funkcja = getvect(0x05);
setvect(0x05, nowa_funkcja);
while(1)
{
if( kbhit( ))
if( getch( ) == 27)
break;
}
setvect(0x05, stara_funkcja);
}
const int n=7;
const unsigned int ton[n]=
{1500, 0, 1000, 0, 700, 500, 300};
const unsigned int czas[n]=
{200, 100, 500, 400, 400, 400,400};
void interrupt nowa_funkcja()
{
static int n;
for( i=0; i<n; i++)
{
sound(ton[i]);
delay( czas[i] );
}
nosound();
}
49