Wyj
ątki, przerwania w języku Ada
1
ADA-wyjatki-przerw6
Wyjątki i przerwania w języku ADA
1. Wyjątki
Wykonuj
ąca się aplikacja może natrafić na przypadki w których nie
b
ędzie mogła kontynuować biężącej sekwencji instrukcji. Jest to
spowodowane:
•
B
łędami w aplikacji
•
Zdarzeniami zewnetrznymi (w komputerze, systemie operacyjnym)
Jako
że aplikacja nie może się zakończyć zdarzenia te są sygnalizowane
jako tak zwane wyj
ątki na które trzeba w zaplanowany sposób
zareagowa
ć. Wyjątki mają nastepujące cechy:
•
Nieznany moment wystapienia
•
Konieczno
ść obsługi
1.1 Wyjątki pierwotnie zdefiniowane
Wyj
ątki predefiniowane zadeklarowane są w pakietach. Podstawowe
wyj
ątki zdefiniowane są w pakiecie Standard.
1. Constaint_Error
•
Warto
ść indeksu tablicy jest poza zakresem danego typu
•
Warto
ść skalarna przekroczyła zakres.
•
Drugi argument operacji /, mod, rem jest równy zeru.
•
Parametr aktualny typu
in
lub
in out
jest wska
źnikiem i
ma warto
ść NULL
2. Program_Error
•
W programie nast
ępuje odwołanie do niedostępnego bytu
•
Wywo
łanie podprogramu lub wejścia do obiektu chronionego
którego deklaracja nie zosta
ła jeszcze opracowana.
•
Wykonanie funkcji nie zako
ńczone instrukcją
return
.
3. Storage_Error
•
Brak pami
ęci do opracowania deklaracji lub wykonania
instrukcji
4. Tasking_Error
•
Komunikacja z zadaniem niemo
żliwa.
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
2
ADA-wyjatki-przerw6
1.2 Deklarowanie i zgłaszanie wyjątków
Deklarowanie i zg
łaszanie wyjątków odbywa się w następujący sposób:
Deklaracja_Wyjatku :=
Nazwa_Wyjatku {, Nazwa_Wyjatku} :
exception
;
Zg
łoszenie_Wyjątku :=
raise
[Nazwa_Wyjatku];
procedure dzielenie(x,y: in Float; wynik: out Float)
is
Blad_dziel:
exception
;
begin
if(y = 0.0) then
raise
Blad_dziel;
else
wynik := x/y;
end if;
...
end dzielenie;
Przyk
ład 1-1 Deklarowanie i zgłaszanie wyjątku
1.3 Obsługa wyjątków
Wyj
ątek który został zgłoszony musi zostać obsłużony.
Strefa_Obs
ługi_Wyjatków ::=
Segment_Obs
ługi_Wyjatków {, Segment_Obsługi_Wyjatków}
Segment_Obs
ługi_Wyjatków :=
when
Nazwa_Wyj
ątku { | Nazwa_Wyjątku} => Instrukcje
|
when others
=> Instrukcje
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
3
ADA-wyjatki-przerw6
procedure Open_Or_Create(File : in out File_Type;
Mode : File_Mode; Name : String) is
begin
-- Spróbój otworzyć plik. Gdy plik nie istnieje
-- wygenerowany będzie wyjatek Name_Error
Open(File, Mode, Name);
exception
when Name_Error =>
Create(File, Mode, Name);
end Open_Or_Create;
Przyk
ład 1-2 Przykład obsługi wyjątku
1.4 Propagacja wyjątków
Powstanie wyj
ątku spowoduje przekazanie sterowania do strefy obsługi
wyj
ątku w bloku w którym wyjątek został wygenerowany. Gdy brak strefy
obs
ługi wyjątek zostaje ponownie zgłoszony w bloku otaczającym. To
ponowne zg
łoszenie nazywa się propagacją wyjątku.
Blok 3
Blok 2
Blok 1
Obsluga
Wyjatek
Rysunek 1-1 Propagacja wyj
ątku
Mo
żliwe jest zgłoszenie wyjątku w bloku otaczającym przez wykonanie
instrukcji
raise
. Je
żeli wyjątek nie zostanie obsłużony program kończy
si
ę komunikatem
Program_Error
.
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
4
ADA-wyjatki-przerw6
2. Przerwania
J
ęzyk Ada umożliwia obsługę przerwań. Przyjęto następujący model
obs
ługi przerwań:
•
Przerwanie reprezentuje zdarzenie sprz
ętowe lub zdarzenie systemu
operacyjnego.
•
Na wyst
ąpienie przerwania składa się jego generacja i dostarczenie.
•
Generacja przerwania powodowana jest przez sprz
ęt lub system
operacyjny i czyni przerwanie dost
ępne dla oprogramowania.
•
Dostarczenie przerwania jest akcj
ą powodującą uruchomienie
fragmentu oprogramowania odpowiedzialnego za jego obs
ługę.
•
Wygenerowane przerwanie które nie zosta
ło dostarczone nazywa się
przerwaniem oczekuj
ącym (ang. pending).
•
Pewne lub wszystkie przerwania mog
ą być zablokowane.
Zablokowane przerwanie nie jest dostarczane.
•
Pewne przerwania s
ą zarezerwowane. Dla przerwań
zarezerwowanych u
żytkownik nie może zdefiniować własnych
procedur. Przerwania maj
ą sterowniki wbudowane w system
wykonawczy.
•
Ka
żde przerwanie które nie jest zarezerwowane posiada domyślną
procedur
ę jego obsługi.
Sprzęt
System operacyjny
Aplikacja w Adzie
obsluga
przerwania
Blokowanie
Wywolanie
Rysunek 2-1 Ilustracja obs
ługi przerwań
Przerwania obs
ługiwane są odmiennie w standardzie Ada83 i Ada95.
•
Ada83 – wej
ścia zadania
•
Ada95 – wywo
łanie bezparametrowej procedury obiektu chronionego.
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
5
ADA-wyjatki-przerw6
2.1 Obsługa przerwań w języku Ada95
Obs
ługa przerwania w Ada95 polega na wywołanie bezparametrowej
procedury obiektu chronionego. Typy, pragmy i procedury zwi
ązane z
obs
ługą przerwań zawarte są w pakiecie Ada.Interrupt.
U
życie pragmy
Interrupt_Handler
informuje system
że procedura
handler_name ma by
ć użyta do obsługi przerwania.
pragma
Interrupt_Handler
(handler_name);
Procedura taka mo
że zostać powiązania z przerwaniem statycznie lub
dynamicznie.
Powiązanie statyczne
Aby dokona
ć statycznego powiązanie procedury z przerwaniem należy
u
żyć pragmy Attach_Handler.
pragma
Attach_Handler
(handler
_name, expression);
•
expression - wyra
żenie które identyfikuje przerwanie
•
handler_name - nazwa bezparametrowej procedury w obiekcie
chronionym.
with Ada.Interrupts; use Ada.Interrupts;
with Ada.Interrupts.names; use Ada.Interrupts.names;
protected Device_Interface is
procedure Handler;
pragma Attach_Handler(Handler, Int_ID);
end Device_Interface;
protected body Device_Interface is
procedure Handler is
…
end Handler;
end Device_Interface;
Przyk
ład 2-1 Statyczne powiązanie przerwania z procedurą
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
6
ADA-wyjatki-przerw6
Powiązanie dynamiczne
Aby u
żyć powiązania dynamicznego należy najpierw za pomocą pragmy
Interrupt_Handler wskaza
ć która procedura ma obsługiwać przerwania.
Nast
ępnie należy wywołać procedurę Attach_Handler która wiąże
procedur
ę obsługi z przerwaniem.
procedure Attach_Handler(New_Handler :in Parameterles
s_Handler;Interrupt : in Interrupt_ID);
New_Handler – Nowy handler przerwania
Interrupt - identyfikator przerwania
with Ada.Interrupts; use Ada.Interrupts;
with Ada.Interrupts.names; use Ada.Interrupts.names;
protected Device_Interface is
procedure Handler;
pragma Interrupt_Handler(Handler);
end Device_Interface;
…
Attach_Handler(Device_Interface.Handler, Int_ID);
Przyk
ład 2-2 Dynamiczne przerwania z procedurą
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
7
ADA-wyjatki-przerw6
2.2 Pakiet Ada.interrupts
package Ada.Interrupts is
type Interrupt_ID is implementation-defined;
type Parameterless_Handler is
access protected procedure;
-- Zwraca True gdy przerwanie jest zarezerwowane
function Is_Reserved (Interrupt : Interrupt_ID)
return Boolean;
-- Zwraca True gdy przerwanie jest przypisane do
-- handlera
function Is_Attached (Interrupt : Interrupt_ID)
return Boolean;
-- Zwraca wskaźnik na bieżacy hadler przerwania
function Current_Handler (Interrupt : Interrupt_ID)
return Parameterless_Handler;
-- Przyporządkowuje handler do przerwania
procedure Attach_Handler
(New_Handler : in Parameterless_Handler;
Interrupt : in Interrupt_ID);
--
Przyporządkowuje
New_Handler
do przerwania
-- i zwraca poprzedni
Old_Handler
procedure Exchange_Handler
(Old_Handler : out Parameterless_Handler;
New_Handler : in Parameterless_Handler;
Interrupt : in Interrupt_ID);
-- Przywraca domyslny handler do przerwania
procedure Detach_Handler
(Interrupt : in Interrupt_ID);
-- Zwraca adres przypisany do przerwania
function Reference(Interrupt : Interrupt_ID)
return System.Address;
private
... -- not specified by the language
end Ada.Interrupts;
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
8
ADA-wyjatki-przerw6
3.
Szeregowanie zadań i priorytety
w j
ęzyku Ada
Zadania j
ęzyka Ada wykonywane są współbieżnie. Dodatkowe
specyfikacje dotycz
ące metod realizacji tej współbieżności zawarte są w
aneksie D – Systemy Czasu Rzeczywistego. Aneks ten opisuje:
•
Priorytety zada
ń i ich zmiany
•
Strategie szeregowania zada
ń i obsługę wejść
•
Dodatkowe mechanizmy synchronicznego i asynchronicznego
sterowania zadaniami
3.1 Priorytety
Priorytet zadania jest odzwierciedleniem pilno
ści zadania względem
innych zada
ń.
Priorytety dotycz
ą:
•
Przydzia
łu procesora zadaniu
•
Kolejno
ści wyboru gałęzi instrukcji
select
.
•
Kolejno
ści wykonania wejść, funkcji i procedur w obiektach
chronionych
Wyró
żnia się dwa rodzaje priorytetów
•
Priorytety statyczne – przypisywane zadaniom w trakcie tworzenia
•
Priorytety dynamiczne – zmieniane w trakcie wykonywania zadania
Dozwolony zakres priorytetów zale
żny jest od implementacji.
subtype Any_Priority is Integer range implementation-defined;
subtype Priority is Any_Priority
range Any_Priority'First .. implementation-defined;
subtype Interrupt_Priority is Any_Priority
range Priority'Last+1 .. Any_Priority'Last;
Default_Priority : constant Priority := (Priority'First + P
riority'Last)/2;
Any_Priority`First
Priority`Last
Priority
Interrupt_Priority
DefaultPriority
Any_Priority`Last
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
9
ADA-wyjatki-przerw6
Wymaga si
ę aby implementacja dostarczała przynajmniej 30
priorytetów standardowych i przynajmniej 1 priorytet przerwa
ń.
3.2 Priorytety statyczne
Zadaniu nadaje si
ę priorytet za pomocą pragm:
pragma Priority(wyrażenie);
pragma Interrupt_Priority[(wyrażenie)];
task bufor is
entry wstaw(x : in Integer);
entry wez(x : out Integer);
pragma Priority(10);
end bufor;
task type intro_task (TPriority : System.Priority) is
entry wstaw(x : in Integer);
entry wez(x : out Integer);
pragma Priority(TPriority);
end bufor;
Priorytet nadawany zadaniu przez pragm
ę priority jest nazywany
priorytetem bazowym. Zadanie mo
że chwilowo mieć priorytet bieżący
wy
ższy od bazowego.
Problem inwersji priorytetów
W przypadku, gdy wiele zada
ń o różnych priorytetach korzysta z obiektu
chronionego mo
że dojść do inwersji priorytetów. Negatywne zjawiska
zwi
ązane z inwersją priorytetu można ograniczyć poprzez zastosowanie
ró
żnych protokołów zajmowania zasobów. W dodatku D określona jest
pragma
Locking_Policy która, umożliwia określenie metody
zajmowania zasobu.
pragma Locking_Policy(policy_identifier);
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
10
ADA-wyjatki-przerw6
Metody zajmowania zasobu zale
żą od implementacji. Wymaga się
jednak aby przynajmniej jedna metoda: protokó
ł pułapu priorytetu (ang.
Imediate Ceiling Priority Protocol) był zaimplementowany.
Protokó
ł pułapu priorytetu ICPP.
Obiektowi chronionemu P nadaje si
ę priorytet G nazywany priorytetem
granicznym. Jest on równy wielko
ści maksymalnej z priorytetów zadań
u
żywających danego obiektu chronionego. Gdy zadanie Z korzysta z
obiekty chronionego P to na czas korzystania otrzymuje ono priorytet G.
Je
żeli z obiektem chronionym P skomunikowało by się zadanie o
priorytecie wy
ższym niż G to system wygenerowałby wyjątek
Programm_Error
.
Dziedziczenie priorytetu
Zadanie wywo
łujące obiekt chroniony dziedziczy jego priorytet.
Dziedziczenie priorytetu dotyczy tak
że zadań:
W trakcie wykonywania instrukcji
accept serwer dziedziczy priorytet
zadania wywo
łującego gdy priorytet zadania wywołującego jest wyższy
od priorytetu zadania serwera. Gdy priorytet zadania wywo
łującego jest
ni
ższy priorytet serwera pozostaje bez zmiany.
Ustalanie strategii szeregowania
Regu
łę szeregowania można ustanowić za pomocą pragmy:
pragma Task_Dispatching_Policy(Policy_Identifier)
Aneks D wymaga aby zrealizowana by
ła przynajmniej jedna strategia
szeregowania – strategia karuzelowa (FIFO_within_prioryty).
Realizuje ona zasad
ę:
1. Zawsze wykonywane jest zadanie o najwy
ższym priorytecie
2. Gdy zada
ń o najwyższym priorytecie jest więcej to wykonują się one
wed
ług algorytmu karuzelowego.
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
11
ADA-wyjatki-przerw6
Ustalanie strategii wywoływania wejść
Mo
że się zdarzyć że zadania inicjujące spotkania nie będą mogły być na
bie
żąco obsługiwane przez zadanie przyjmujące i będą ustawione w
kolejk
ę.
T1
TN
accept
T1
Tn
T3
Zadania wywolujące weścia
Zadanie serwera
Kolejka zadań
wywolujących
T2
FIFO lub
priorytetowa
Rysunek 3-1 Kolejka zada
ń wywołujących
Standardow
ą regułą wywoływania wejść zadania jest kolejka FIFO.
Mo
żliwy jest jednak wybór innej strategii kolejkowania zadań
wywo
łujących za pomocą pragmy Queuing_Policy.
pragma Queuing_Policy(Policy_Identifier)
W aneksie D wyspecyfikowane s
ą dwie reguły.
1. FIFO_Queuing
2. Priority_Queuing
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
12
ADA-wyjatki-przerw6
3.3 Priorytety dynamiczne
Priorytety dynamiczne pozwalaj
ą na zmianę priorytetu w trakcie
wykonywania zadania.
with System;
with Ada.Task_Identification;
package Ada.Dynamic_Priorities is
procedure Set_Priority(Priority: in Any_Priority;
T : in Task_ID := Current_Task);
function Get_Priority(T: ask_ID := Current_Task)
return System.Any_Priority;
end Ada.Dynamic_Priorities;
Procedura
Set_Priority pozwala na ustalenie priorytetu zadania
okre
ślonego drugim parametrem.
Funkcja Get
_Priority zwraca priorytet zadania określonego
pierwszym parametrem.
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
13
ADA-wyjatki-przerw6
4. Ada w systemach wbudowanych
Ada jest szeroko stosowana w systemach wbudowanych. Dost
ępne są
pakiety umo
żliwiające wykonywanie programów w Adzie:
1. W
środowisku systemu operacyjnego (LynxOS, VxWorks, Linux)
2. Bez systemu operacyjnego
Komputer macierzysty
Kompilator Ady
Narzędzia
konfiguracyjne
aplikacja
urządzenie
Komputer docelowy
System
macierzysty
System wykonawczy
RS232
TCP/IP
JTAG
System wbudowany
Łącze
komunikacyjne
Rys. 4-1 System skro
śnego rozwoju oprogramowania
Przyk
ład - ERC32 Ada firmy XGC na płytę DEM32
System przeznaczony dla aplikacji krytycznych (lotnictwo,
kosmonautyka.
•
System macierzysty – Red Hat Linux na komputerze PC, Solaris2.6
na maszynie Sun SPARC
•
Docelowy system operacyjny – nie jest wymagany
•
Sprz
ęt docelowy Saab Ericsson DEM32.
W jego sk
ład wchodzi
procesor TSC695 z zegarem 20MHz, 4 MB RAM i chipset (Atmel)
ERC32.
•
Kompilator GNAT - okrojona Ada 95
Saab Ericsson DEM32
PDF created with pdfFactory trial version
Wyj
ątki, przerwania w języku Ada
14
ADA-wyjatki-przerw6
5. Źródła
[1] Z. Huzar, Z. Fry
źlewicz, I. Dubielewicz, ADA 95, wyd. Helion
1998.
[2] Gilles Motet, Tomasz Szmuc, Programowanie systemów
czasu rzeczywistego z zastosowaniem j
ęzyka ADA, AGH
uczelniane wydawnictwo naukowo dydaktyczne, Kraków 2002.
[3] Pyle I. C. Ada, Warszawa WNT 1986.
[4] Richard Riehle, Ada Distilled, An Introduction to Ada
Programming for Experienced Computer Programmers
http://www.adaic.org/docs/distilled/adadistilled.pdf
PDF created with pdfFactory trial version