background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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  

ż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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com

background image

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 

www.pdffactory.com