J. Ułasiewicz Programowanie aplikacji współbieżnych 1
8. Zdarzenia i ich obsługa
Istnieją dwie metody pozyskania informacji o zdarzeniach: 1. Cykliczne odpytywanie urządzenia czy zdarzenie zaszło ( ang. polling).
2. Wykorzystanie przerwań generowanych przez zdarzenia ( ang. interrupt).
Maksymalny czas reakcji na zdarzenia Tmax jest najdłuższym możliwym czasem od wystąpienia zdarzenia Z do rozpoczęcia procedury jego obsługi.
Rozpoczecie
Zdarzenie Z
Czas
Zakonczenie
z procedury
reakcji na
z procedury
obslugi
zdarzenie
obslugi
zdarzenia
zdarzenia
Tmax
Inna
P - Procedura
Inna
aktywnosc
obslugi zdarzenia
aktywnosc
Czas reakcji na zdarzenia
Maksymalny czas reakcji na zdarzenia powinien być mierzony dla najmniej korzystnych warunków. Stąd mamy pewność że w rzeczywistej sytuacji czas reakcji na zdarzenie nie będzie dłuższy od Tmax.
Należy tak konstruować systemy aby maksymalny czas reakcji na zdarzenia był jak najkrótszy.
Zdarzenia i ich obsługa
J. Ułasiewicz Programowanie aplikacji współbieżnych 2
8.1
Odpytywanie cykliczne
Procedura P0
T0
F1
Procedura P1
Z1
T1
Z2
F2
Procedura P2
T2
Fn
Procedura Pn
Zn
Tn
Znaczniki
Procedury
Czasy wykonan
Obsługa zdarzeń metodą odpytywania
Maksymalny czas reakcji na pewne zdarzenie (powiedzmy Z1) Tmax jest sumą czasów wykonań procedur P0,P2,P3,…,Pn i wynosi: n Tmax = ∑ Ti i=0
Metoda odpytywania posiada następujące cechy.
1. Długi czas reakcji na zdarzenie – maksymalnie suma czasów obsługi wszystkich zdarzeń.
2. Trudności w uszeregowaniu obsługi zdarzeń według priorytetów.
3. Przy braku zdarzeń utrata czasu procesora na wykonanie jałowych czynności
4. Prostota implementacji – nie jest wymagany specjalny sprzęt.
Zdarzenia i ich obsługa
J. Ułasiewicz Programowanie aplikacji współbieżnych 3
8.2
Obsługa zdarzeń poprzez przerwania
Obsługa przerwania polega na przerwaniu aktualnie wykonywanego procesu i wykonaniu procedury przypisanej danemu zdarzeniu gdy takie zdarzenie zajdzie.
Procedura nazywa się procedurą obsługi przerwania ( ang. interrupt handler).
Często używany jest też skrót ISR ( ang. Interrupt Service Routine).
Powrót
Zdarzenie Z1
z procedury
P1 - Procedura
Przerwanie
obslugi
obslugi
przerwania
przerwania
P1
P0 - Proces
glówny
P0
P0
Obsługa zdarzenia Z1 poprzez procedurę obsługi przerwania P1
Zachodzi potrzeba rozstrzygnięcia które zdarzenie ma obsługiwane gdy wiele z nich wystąpi naraz. Istnieją tu dwie podstawowe strategie postępowania: 1. Jednopoziomowy system przerwań.
2. Priorytetowy system przerwań.
Gdy za obsługę oczekuje więcej nie obsłużonych przerwań wybór przerwania do obsługi może być dokonany według różnych zasad.
1. Poszczególnym przerwaniom mogą być przypisane priorytety.
2. Przerwania mogą być obsługiwane według kolejności zgłoszeń.
Zdarzenie Z1
Zdarzenie Z2
Przyjecie obslugi
przerwania
Z2
Obsluga
Obsluga
przerwania
przerwania
P0 - Proces
Z1
Z2
glówny
P0
P0
Dwa przerwania obsługiwane w systemie jednopoziomowym Zdarzenia i ich obsługa
J. Ułasiewicz Programowanie aplikacji współbieżnych 4
Obsluga
przerwania
Z1
Obsluga
zawieszona
przerwania
Zdarzenie Z1
Zdarzenie Z2
Z1
wznowiona
Obsluga
Obsluga
Kontynuacja
przerwania
przerwania
obslugi
Z1
Z2
przerwania
P0
Z1
P0
Dwa przerwania obsługiwane w systemie wielopoziomowym Obsługa przerwań w systemie komputerowym jest czasami blokowana przez system operacyjny. Maksymalny czas zablokowania przerwań Tdmax jest podstawową miarą jakości systemu czasu rzeczywistego.
Czas Tdmax powinien być on jak najkrótszy..
Maksymalny czas Tmax reakcji na zdarzenie, w systemie z przerwaniami, jest równy maksymalnemu czasowi zablokowania przerwań Tdmax czyli Tmax
= Tdmax .
Gdy w systemie występują przerwania, nie można założyć że dany fragment kodu wykona się niepodzielnie.
Obsługa zdarzeń poprzez przerwania ma dla systemu komputerowego daleko idące konsekwencje.
Istnieją dwie strategie obsługi zdarzeń poprzez przerwania: 1. Zdarzenie
obsługiwane jest przez procedurę obsługi przerwania.
2. Procedura
obsługi przerwania odblokowuje proces który wykonuje obsługę zdarzenia.
Zdarzenia i ich obsługa
J. Ułasiewicz Programowanie aplikacji współbieżnych 5
8.3 Obsługa przerwań w komputerach typu PC
Procesory seri 80x86 stosowane w komputerach PC obsługują następujące rodzaje przerwań:
1. Przerwania zewnętrzne – generowane są przez urządzenia zewnętrzne i koordynowane przez kontroler przerwań.
2. Przerwania wewnętrzne - generowane są przez układy wewnętrzne procesora i zwykle związane z naruszeniem systemu ochrony.
3. Przerwania programowe – generowane przez oprogramowanie.
Procesor posiada jedną linię zgłaszania przerwania IRQ ( ang. Interrupt Request). Liczba urządzeń mogących zgłosić przerwanie jest większa.
Aby rozwiązać ten problem stosuje się urządzenie nazywane kontrolerem przerwań ( ang. Interrupt Controller)
RAM
Procedura
Linie
obslugi
P1
NMI
przerwan
przerwania
Urzadzenie
IRQ0
IRQ1
255
INTA Kontroler
VH7
IRQi
INT
Procesor
INT
przerwan
Tablica
V
Kontroler
wektorów
VH1
IRQ7
urzadzenia
przerwan
VH0
IMR
CR
0
Baza B
V = B + i
i - numer lini IRQ
kontrolera
Obsługa przerwań w komputerze PC
Linia IRQ0 posiada najwyższy priorytet, Linia IRQ7 najniższy. Kontroler posiada dwa dostępne z zewnątrz 8 bitowe rejestry:
1. Rejestr poleceń CR ( ang. Control Register). Do rejestru CR system wpisuje polecenia i odczytuje zeń statusy.
2. Rejestr maski IMR ( ang. Interrupt Maskl Register).
Rejestr IMR pozwala na zamaskowanie przyjmowania przerwań. Gdy bit i IMR jest ustawiony na 1 przerwanie IRQi będzie ignorowane. Gdy bit i ustawimy na 0 przerwanie IRQi będzie przyjmowane.
Funkcje kontrolera przerwań:
1. Arbitraż przerwań.
2. Maskowanie przerwań.
3. Tworzenie powiązania pomiędzy pobudzeniem lini przerwania IRQi a wektorem przerwań VHi.
Zdarzenia i ich obsługa
J. Ułasiewicz Programowanie aplikacji współbieżnych 6
Gdy przerwanie IRQi zostanie przyjęte, kontroler przekazuje do procesora bajt zawierający liczbę V = B + i (baza kontrolera + numer przerwania). Na tej podstawie procesor wykonuje instrukcję INT V a zatem i procedurę obsługi przerwania IRQi . Adres procedury obsługi przerwania IRQi procesor pobiera z wektora VHi = V.
IRQ
IRQ Wektor
Urządzenie
Master Slave HEX
0
8
Timer – generuje przerwania
zegarowe
1
9
Klawiatura
8
70
Zegar czasu rzeczywistego RTC
2
9
71
W kontrolerze master wejście z
kontrolera slave
W kontrolerze slave wolne
10
72
wolne
11
73
wolne
12
74
wolne
13
75
Koprocesor
14
76
Kontroler 1 dysków IDE
15
77
Kontroler 2 dysków IDE
3
B
Układ transmisji szeregowej COM2
4
C
Układ transmisji szeregowej COM1
5
D
Port drukarki LPT1
6
E
Kontroler dysków elastycznych
7
F
Port drukarki LPT2
Tablica linii przerwań, wektorów przerwań i urządzeń generujących przerwania w komputerze AT
Zdarzenia i ich obsługa
J. Ułasiewicz Programowanie aplikacji współbieżnych 7
8.4
Programowanie obsługi przerwań w systemie QNX
Aby zaimplementować obsługę pewnego przerwania w procesie należy: 1. Napisać procedurę obsługi tego przerwania.
2. Zainstalować procedurę w systemie to znaczy spowodować aby procedura była wykonana gdy wybrane przerwanie zostanie przez system odebrane (instalacja procedury).
Instalacja procedury obsługi przerwania
int qnx_hint_attach(unsigned intnum, void far *handler, unsigned DS)
intnum
Numer przerwania – odpowiada numerowi lini IRQ
kontrolera przerwań (liczba od 0 do 15)
handler
Nazwa funkcji obsługi przerwania.
DS
Identyfikator segmentu danych procesu.
Funkcja zwraca:
> 0 – identyfikator procedury obsługi przerwań ( mała liczba typu int)
- 1 – gdy błąd.
Parametr DS jest identyfikator segmentu danych procesu. Aby go uzyskać należy wykonać makro systemowe FP_SEG(…).
Deinstalacja funkcji obsługi przerwania:
int qnx_hint_detach(int iidend)
iidend
Identyfikator funkcji obsługi przerwania – liczba zwracana przez funkcję qnx_hint_attach
Funkcja zwraca: > 0 – sukces, - 1 – błąd. Wykonanie funkcji zrywa powiązanie pomiędzy przerwaniem a funkcją jego obsługi.
Zdarzenia i ich obsługa
J. Ułasiewicz Programowanie aplikacji współbieżnych 8
Maskowanie / odmaskowanie przerwania.
Kontroler przerwań pozwala na zablokowanie przyjmowania przerwań (maskowanie) lub dopuszczenia ich do obsługi (odmaskowanie).
Zamaskowane przerwania nie są obsługiwane. Aby przerwanie zamaskować, odmaskować czy testować stan maski używa się funkcji: int qnx_hint_mask(unsigned intnum, unsigned action) intnum
Numer przerwania – odpowiada numerowi lini IRQ
kontrolera przerwań (liczba od 0 do 15)
action
Specyfikacja akcji: 0 – testuj stan maski, 1 – odmaskuj przerwanie, 2 – zamaskuj przerwanie
Funkcja zwraca:
0 – przerwanie dozwolone (nie zamaskowane)
1 – przerwanie zabronione ( zamaskowane).
Zasady tworzenia funkcji obsługi przerwania:
1. Funkcja musi być poprzedzona kwalifikatorem far.
2. Funkcja może zwracać 0 lub identyfikator utworzonego w procesie depozytu (proxy). Gdy funkcja zwraca numer depozytu jest on generowany i może być odebrany przez funkcję Receive która zostanie wtedy odblokowana.
3. Procedura
obsługi przerwania powinna być tak krótka jak to tylko możliwe. Wszelkie dłuższe akcje powinny być wykonane w procesie który zostanie przez procedurę odblokowany (przez generację depozytu).
4. Funkcja nie może zawierać żadnych wywołań systemowych.
Zdarzenia i ich obsługa
J. Ułasiewicz Programowanie aplikacji współbieżnych 9
Wzorzec konstruowania mechanizmu obsługi przerwań.
// Kompilacja: cc int1.c
-o int1 -Wc -s
#include <stdlib.h>
#include <sys/irqinfo.h>
#include <sys/proxy.h>
#include <sys/kernel.h>
pid_t proxy;
volatile unsigned counter = 0;
// Funkcja obsługi przerwania -------
pid_t far handler(void) {
counter++;
if(counter % 100 == 0)
return(proxy);
else
return(0);
}
void main(void) {
int id,i=0;
pid_t pid;
// Utworzenie proxy ---------------
proxy = qnx_proxy_attach(0,0,0,-1);
// Instalacja handlera ------------
id = qnx_hint_attach(0,&handler,FP_SEG(&counter)); counter = 0;
do {
pid = Receive(0,0,0);
printf("Przerwan %d\n",i);
i++;
} while(i < 100);
qnx_hint_detach(id);
}
Przykład użycia procedury obsługi przerwania
Zdarzenia i ich obsługa