Wyj
ątki, przerwania w języku Ada
1
ADA-wyjatki-przerw3
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-przerw3
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-przerw3
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-przerw3
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-przerw3
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);
Wyra
żenie expression identyfikuje przerwanie a handler_name jest
nazw
ą 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-przerw3
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-przerw3
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-przerw3
3. Ada w systemach wbudowanych
Using the GNAT Ada front end, and targeting the ERC32 spacecraft microprocessor,
ERC32 Ada offers top performance for mission-critical applications.
ERC32 Ada Features:
Fast user-mode multi tasking
Compact run-time system
Suitable for mission-critical applications
See the
Key Characteristics
report for details.
The standard target board is the Temic (Atmel) ERC32 Starter Kit. This includes the
Temic (Atmel) TSC695 running at 20MHz with 4 M Bytes of fast RAM. ERC32 Ada
also targets earlier chipsets such as the Temic CBA, CCA and CDA.
ERC32 Ada includes customized
GNAT
Ada front end and offers a
restricted Ada 95
programming language suitable for mission-critical applications.
Saab Ericsson DEM32
4. Ź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