Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

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

Podobne prezentacje


Prezentacja na temat: "Systemy operacyjne Wykład 4 Implementacja systemu przerwań dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki"— Zapis prezentacji:

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

2 Schemat obsługi przerwania 2 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 Program użytkownika żąda od systemu operacyjnego wykonania operacji pobrania danych z urządzenia wejściowego.

3 Schemat obsługi przerwania 3 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 System operacyjny sprawdza, czy urządzenie jest gotowe do transmisji badając zawartość rejestru stanu.

4 Schemat obsługi przerwania 4 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 System operacyjny programuje sterownik urządzenia wpisując odpowiedni rozkaz do jego rejestru sterowania.

5 Schemat obsługi przerwania 5 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.

6 Schemat obsługi przerwania 6 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 IRQ 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.

7 Schemat obsługi przerwania 7 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.

8 Schemat obsługi przerwania 8 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 Sterowanie zostaje przekazane do procedury obsługi przerwania.

9 Schemat obsługi przerwania 9 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 Podprogram obsługi przerwania kopiuje zawartość rejestru danych sterownika do bufora w pamięci i kończy swoją pracę. Procesor wraca do przerwanego zadania.

10 Wektorowy system przerwań 10 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 11 Problemem jest zapamiętanie kontekstu procesora, aby mógł on wrócić do zadania które realizował przed wystąpieniem przerwania. Najmniejszy kontekst obejmuje adres powrotu i rejestr stanu maszyny (dla x86 jest to rejestr flag). Najczęściej kontekst pamiętany jest na stosie. 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.

12 Konflikt przerwań 12 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ń 13 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 14 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 15 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 16 Podobnie jak zwykłe podprogramy, wywołania systemowe mogą wymagać pewnych argumentów wywołania. przez rejestry; przez stos; przez pamięć – adres początku obszaru pamięci, gdzie zapisane są argumenty, umieszczany jest w rejestrach. Te argumenty mogą być przekazywane na trzy różne sposoby:

17 Kategorie wywołań systemowych 17 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 18 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 19 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 20 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 21 System operacyjny DOS i programy użytkowe mogą żądać od systemu BIOS wykonania operacji przez wykonanie instrukcji przerwania programowego (INT). 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). Poszczególne części BIOS obsługujące różne urządzenia mają przydzielone oddzielne numery przerwań.

22 Przerwania w MS-DOS 22 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 NumerWektorOpis 0x000x0000:0x0000Dzielenie przez zero 0x010x0000:0x0004Tryb pracy krokowej procesora 0x020x0000:0x0008Przerwania niemaskowalne 0x030x0000:0x000CPunkt przerwania (przerwanie wykonywania kodu programu) 0x040x0000:0x0010Przepełnienie arytmetyczne 0x060x0000:0x0018Nieprawidłowy kod operacji 0x070x0000:0x001CKoprocesor arytmetyczny niedostępny

24 Tabela przerwań sprzętowych kontrolera 24 PrzerwanieIRQAdres wektoraFunkcje komputera x86 08hIRQ0 0x0000:0x0020 Czasomierz systemowy 09hIRQ1 0x0000:0x0024 Kontroler klawiatury 0AhIRQ2 0x0000:0x0028 Przyłączona do linii IRQ od 8 do 15 0BhIRQ3 0x0000:0x002C Port COM2: 2F8h:2FFh 0ChIRQ4 0x0000:0x0030 Port COM1: 3F8h-3FFh 0DhIRQ5 0x0000:0x0034 Port LPT2: 378h lub 278h 0EhIRQ6 0x0000:0x0038 Kontroler dyskietek 0FhIRQ7 0x0000:0x003C Port LPT1: 3BCh lub 378h 010hIRQ8 0x0000:0x01C0 Zegar czasu rzeczywistego 011hIRQ9 0x0000:0x01C4 Zastępuje linię IRQ 2 012hIRQ10 0x0000:0x01C8 Nieprzypisana 013hIRQ11 0x0000:0x01CC Nieprzypisana 014hIRQ12 0x0000:0x01D0 Port myszy komputera PS/2 015hIRQ13 0x0000:0x01D4 NPU (jednostka przetwarzania numerycznego) 016hIRQ14 0x0000:0x01D8 Dysk twardy 017hIRQ15 0x0000:0x01DC Karta drugiego dysku twardego

25 Wektor przerwań 25 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 26 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 27 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 Numer przerwaniaWektorOpis 0x050x0000:0x0014Obsługa klawisza Print-Screen 0x100x0000:0x0040Obsługa kart graficznych 0x110x0000:0x0044Konfiguracja sprzętowa BIOS 0x120x0000:0x0048Dostępny rozmiar pamięci 0x130x0000:0x004COperacje dyskowe 0x140x0000:0x0050Obsługa komunikacji szeregowej 0x150x0000:0x0054Usługi systemowe 0x160x0000:0x0058Obsługa klawiatury 0x170x0000:0x005CObsługa drukarki 0x190x0000:0x0064Ładowanie systemu operacyjnego 0x1A0x0000:0x0068Zegar czasu rzeczywistego (RTC) 0x1B0x0000:0x006CObsługa kombinacji Ctrl+Break 0x1F0x0000:0x007CObsługa tablicy znaków karty graficznej Tabela przerwań programowych (BIOS)

29 Lista przerwań programowych (DOS) Nr przerwaniaWektorOpis 0x200x0000:0x0080Zakończenie programu 0x210x0000:0x0084Interfejs funkcji systemowych DOS 0x220x0000:0x0088Adres zakończenia programu 0x230x0000:0x008CAdres wyjścia z programu po zakończeniu przez Ctrl+C 0x240x0000:0x0090Adres procedury obsługi błędów krytycznych 0x250x0000:0x0094Obsługa dysku - odczyt 0x260x0000:0x0098Obsługa dysku - zapis 0x270x0000:0x009CObsługa programów TSR 0x280x0000:0x0A0Pętla oczekiwania na naciśnięcie klawisza 0x2E0x0000:0x00B4Wykonywanie poleceń zewnętrznych 0x2F-0x3F0x0000: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 30 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 31 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 32 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 33 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 34 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 35 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 36 Istnieją dwa rodzaje przerwań sprzętowych: NMI generowane jest w sytuacjach krytycznych (gdyż ma najwyższy priorytet) np. przy błędzie parzystości. maskowalne to jest takie, które mogą być przekazane do procesora, niemaskowalne NMI (Non Maskable Interrupt), które muszą być przekazywane do procesora zawsze. Tablica wektorów przerwań procesowa Intel x86 ma 256 pozycji z czego pierwsze 32 są przeznaczone na NMI

37 Przerwania maskowalne i niemaskowalne 37 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 38 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. 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).

39 Tryby pracy sterownika przerwań 8259A 39 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ń 40 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. 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. 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.

41 Przykład – zmiana priorytetów 41 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). moval, b out20h,al

42 Przykład – zmiana częstości przerwania zegara 42 moval,36h out43h,al moval,0 out40h,al 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. Wstawienie 4000h powoduje czterokrotne zwiększenie częstotliwości generowania przerwań przez licznik. moval,36h out43h,al movax,4000h out40h,al moval,ah out40h,al

43 Mieszanie kodu C i asemblera 43 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 44 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 45 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 46 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. int86(nr_przerw, in_regs, out_regs); Załadowanie zestawu rejestrów do procesora, wykonanie przerwania i zwrócenie zawartości rejestrów procesora

47 Przykład w języku C 47 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, ®); return 0; }

48 Przykład: obsługa zegara 48 #include #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 49 #include 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


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

Podobne prezentacje


Reklamy Google