Справочник по Ada 2005
C.3.2 Пакет Interrupts
Статическая семантика
Существуют следующие определённые языком пакеты:
with System;
package Ada.Interrupts is
type Interrupt_ID is определяется реализацией;
type Parameterless_Handler is
access protected procedure;
package Ada.Interrupts is
type Interrupt_ID is определяется реализацией;
type Parameterless_Handler is
access protected procedure;
Этот абзац был удален.
function Is_Reserved (Interrupt : Interrupt_ID)
return Boolean;
return Boolean;
function Is_Attached (Interrupt : Interrupt_ID)
return Boolean;
return Boolean;
function Current_Handler (Interrupt : Interrupt_ID)
return Parameterless_Handler;
return Parameterless_Handler;
procedure Attach_Handler
(New_Handler : in Parameterless_Handler;
Interrupt : in Interrupt_ID);
(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);
(Old_Handler : out Parameterless_Handler;
New_Handler : in Parameterless_Handler;
Interrupt : in Interrupt_ID);
procedure Detach_Handler
(Interrupt : in Interrupt_ID);
(Interrupt : in Interrupt_ID);
function Reference(Interrupt : Interrupt_ID)
return System.Address;
return System.Address;
private
... -- не определено языком
end Ada.Interrupts;
... -- не определено языком
end Ada.Interrupts;
package Ada.Interrupts.Names is
определяется реализацией : constant Interrupt_ID :=
определяется реализацией;
. . .
определяется реализацией : constant Interrupt_ID :=
определяется реализацией;
end Ada.Interrupts.Names;
определяется реализацией : constant Interrupt_ID :=
определяется реализацией;
. . .
определяется реализацией : constant Interrupt_ID :=
определяется реализацией;
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 пытаются отсоединить обработчик, прикреплённый статически (с помощью pragma Attach_Handler), обработчик не отсоединяется, и поднимается исключение Program_Error.
Функция Reference возвращает значение типа System.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);
...
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);
...