Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wykład 4 Implementacja systemu przerwań

Podobne prezentacje


Prezentacja na temat: "Wykład 4 Implementacja systemu przerwań"— Zapis prezentacji:

1 Wykład 4 Implementacja systemu przerwań
Systemy operacyjne Wykład 4 Implementacja systemu przerwań dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki

2 Schemat obsługi przerwania
Sterownik Urządzenia Rejestr stanu Rejestr sterownika Rejestr danych Procesor (SO) Urządzenie Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań Program użytkownika żąda od systemu operacyjnego wykonania operacji pobrania danych z urządzenia wejściowego. procedura obsł. przerw. 2 Bufor danych

3 Schemat obsługi przerwania
Sterownik Urządzenia Rejestr stanu Rejestr sterownika Rejestr danych Procesor (SO) Urządzenie Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań System operacyjny sprawdza, czy urządzenie jest gotowe do transmisji badając zawartość rejestru stanu. procedura obsł. przerw. 2 Bufor danych

4 Schemat obsługi przerwania
Sterownik Urządzenia Rejestr stanu Rejestr sterownika Rejestr danych Procesor (SO) Urządzenie Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań System operacyjny programuje sterownik urządzenia wpisując odpowiedni rozkaz do jego rejestru sterowania. procedura obsł. przerw. 2 Bufor danych

5 Schemat obsługi przerwania
Sterownik Urządzenia Rejestr stanu Rejestr sterownika Rejestr danych Procesor (PU) Urządzenie Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań System operacyjny oddaje procesor procesowi użytkownika. procedura obsł. przerw. 2 W tym samym czasie sterownik nadzoruje pracę urządzenia, bez interwencji procesora. Bufor danych

6 Schemat obsługi przerwania
IRQ Sterownik Urządzenia Rejestr stanu Rejestr sterownika Rejestr danych Procesor (SO) Urządzenie Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań 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. procedura obsł. przerw. 2 Bufor danych Powoduje to automatyczne zapamiętanie bieżącego stanu procesora i adresu powrotu oraz przekazanie sterowania do systemu operacyjnego.

7 Schemat obsługi przerwania
Sterownik Urządzenia Rejestr stanu Rejestr sterownika Rejestr danych Procesor (SO) Urządzenie Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań 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. procedura obsł. przerw. 2 Bufor danych

8 Schemat obsługi przerwania
Sterownik Urządzenia Rejestr stanu Rejestr sterownika Rejestr danych Procesor (SO) 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

9 Schemat obsługi przerwania
Sterownik Urządzenia Rejestr stanu Rejestr sterownika Rejestr danych Procesor (SO) Urządzenie Adres proc. obsł. przerw. 1 Adres proc. obsł. przerw. 2 Tablica wektorów przerwań Podprogram obsługi przerwania kopiuje zawartość rejestru danych sterownika do bufora w pamięci i kończy swoją pracę. procedura obsł. przerw. 2 Procesor wraca do przerwanego zadania. Bufor danych

10 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.

11 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.

12 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.

13 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.

14 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.

15 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).

16 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.

17 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.

18 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.

19 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.

20 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.

21 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).

22 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).

23 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

24 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 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

25 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.

26 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.)

27 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 AX,0 MOV ES:AX MOV ES:70H,OFFSET PRZERWANIE MOV ES:72H,SEG PRZERWANIE STI 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 AX,SEG PRZERWANIE MOV DS,AX MOV DX,OFFSET PRZERWANIE MOV AL,01CH MOV AH,25H INT 21H

28 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

29 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.)

30 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

31 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

32 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

33 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

34 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ń

35 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

36 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

37 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).

38 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.

39 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.

40 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.

41 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 al, b out 20h, al

42 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 al, 36h out 43h, al mov al, 0 out 40h, al Wstawienie 4000h powoduje czterokrotne zwiększenie częstotliwości generowania przerwań przez licznik. mov al, 36h out 43h, al mov ax, 4000h out 40h, al mov al, ah

43 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 }

44 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; }

45 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

46 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.

47 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; }

48 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);

49 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();


Pobierz ppt "Wykład 4 Implementacja systemu przerwań"

Podobne prezentacje


Reklamy Google