Spec-Zone.ru › Ada 95
Справочник Ada 95

C.3.2 Пакет прерываний

Статическая семантика

Существуют следующие определяемые языком пакеты:
with System;
package Ada.Interrupts is
type Interrupt_ID is implementation-defined;
type Parameterless_Handler is
access protected procedure;
Этот абзац был удален.
function Is_Reserved (Interrupt : Interrupt_ID)
return Boolean;
function Is_Attached (Interrupt : Interrupt_ID)
return Boolean;
function Current_Handler (Interrupt : Interrupt_ID)
return Parameterless_Handler;
procedure Attach_Handler
(New_Handler : in Parameterless_Handler;
Interrupt : in Interrupt_ID);
procedure Exchange_Handler
(Old_Handler : out Parameterless_Handler;
New_Handler : in Parameterless_Handler;
Interrupt : in Interrupt_ID);
procedure Detach_Handler
(Interrupt : in Interrupt_ID);
function Reference(Interrupt : Interrupt_ID)
return System.Address;
private
... -- не определено языком
end Ada.Interrupts;
package Ada.Interrupts.Names is
implementation-defined : constant Interrupt_ID :=
implementation-defined;
. . .
implementation-defined : constant Interrupt_ID :=
implementation-defined;
end Ada.Interrupts.Names;

Динамическая семантика

Тип Interrupt_ID — это определяемый реализацией дискретный тип, используемый для идентификации прерываний.
Функция Is_Reserved возвращает True тогда и только тогда, когда указанное прерывание зарезервировано.
Функция Is_Attached возвращает True тогда и только тогда, когда для прерывания прикреплен заданный пользователем обработчик прерываний.
Функция Current_Handler возвращает значение, представляющее прикрепленный обработчик прерывания. Если для прерывания не прикреплен обработчик пользователя, Current_Handler возвращает null.
Процедура Attach_Handler прикрепляет указанный обработчик к прерыванию, перезаписывая любое существующее обработку (включая обработчик пользователя), действующее для этого прерывания. Если New_Handler равен null, восстанавливается обработка по умолчанию. Если New_Handler обозначает защищенную процедуру, к которой не применяется pragma Interrupt_Handler, возникает Program_Error. В этом случае операция не изменяет существующую обработку прерывания.
Процедура Exchange_Handler работает так же, как Attach_Handler, с добавлением, что возвращаемое значение в Old_Handler обозначает предыдущую обработку для указанного прерывания. Если предыдущая обработка не является обработчиком пользователя, возвращается null.
Процедура Detach_Handler восстанавливает обработку по умолчанию для указанного прерывания.
Для всех операций, определенных в этом пакете, которые принимают параметр типа Interrupt_ID, за исключением Is_Reserved и Reference, проверяется, что указанное прерывание не зарезервировано. Если эта проверка завершается неудачно, возникает Program_Error.
Если с помощью процедур Attach_Handler, Detach_Handler или Exchange_Handler предпринимается попытка отсоединить обработчик, который был прикреплен статически (с помощью pragmy Attach_Handler), обработчик не отсоединяется и возникает Program_Error.
Функция Reference возвращает значение типа System.Address, которое может быть использовано для прикрепления записи задачи через предложение address (см. J.7.1) к прерыванию, указанному параметром Interrupt. Эта функция вызывает Program_Error, если прикрепление записей задач к прерываниям (или к этому конкретному прерыванию) не поддерживается.

Требования к реализации

В любое время во время прикрепления или обмена обработчиками текущий обработчик соответствующего прерывания не должен быть неопределенным.

Требования к документации

Если используется политика Ceiling_Locking (см. D.3), реализация должна документировать приоритет по умолчанию потолка, назначенный защищенному объекту, который содержит либо pragma Attach_Handler, либо Interrupt_Handler, но не pragma Interrupt_Priority. Этот по умолчанию приоритет не обязательно должен быть одинаковым для всех прерываний.

Рекомендации по реализации

Если реализация поддерживает определяемые реализацией формы процедур обработчиков прерываний, таких как защищенные процедуры с параметрами, то для каждой такой формы обработчика должен быть задан тип, аналогичный Parameterless_Handler, в дочернем пакете Interrupts с теми же операциями, что и в предопределенном пакете Interrupts.
ПРИМЕЧАНИЯ
8 Пакет Interrupts.Names содержит определяемые реализацией имена (и постоянные значения) для прерываний, которые поддерживаются реализацией.

Примеры

Пример обработчиков прерываний:
Device_Priority : constant
array (1..5) of System.Interrupt_Priority := ( ... );
protected type Device_Interface
(Int_ID : Ada.Interrupts.Interrupt_ID) is
procedure Handler;
pragma Attach_Handler(Handler, Int_ID);
...
pragma Interrupt_Priority(Device_Priority(Int_ID));
end Device_Interface;
...
Device_1_Driver : Device_Interface(1);
...
Device_5_Driver : Device_Interface(5);
...


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API