Справочник Ada (Ada 2022)
C.3.2 Пакет Interrupts
Статическая семантика
Существуют следующие определяемые языком пакеты:
with System;
with System.Multiprocessors;
package Ada.Interrupts
with Nonblocking, Global => in out synchronized is
type Interrupt_Id is определяется реализацией;
type Parameterless_Handler is
access protected procedure
with Nonblocking => False;
with System.Multiprocessors;
package Ada.Interrupts
with Nonblocking, Global => in out synchronized is
type Interrupt_Id is определяется реализацией;
type Parameterless_Handler is
access protected procedure
with Nonblocking => False;
Этот абзац был удален.
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;
function Get_CPU (Interrupt : Interrupt_Id)
return System.Multiprocessors.CPU_Range;
return System.Multiprocessors.CPU_Range;
private
... -- не определяется языком
end Ada.Interrupts;
... -- не определяется языком
end Ada.Interrupts;
package Ada.Interrupts.Names
with Nonblocking, Global => null is
определяется реализацией : constant Interrupt_Id :=
определяется реализацией;
. . .
определяется реализацией : constant Interrupt_Id :=
определяется реализацией;
end Ada.Interrupts.Names;
with Nonblocking, Global => null is
определяется реализацией : 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 обозначает защищенную процедуру, для которой аспект Interrupt_Handler имеет значение False, генерируется Program_Error. В этом случае операция не изменяет существующее поведение прерывания.
Процедура Exchange_Handler работает аналогично Attach_Handler с добавлением того, что значение, возвращаемое в Old_Handler, обозначает предыдущее поведение для указанного прерывания. Если предыдущее поведение не является обработчиком, заданным пользователем, возвращается null.
Процедура Detach_Handler восстанавливает стандартное поведение для указанного прерывания.
Для всех операций, определённых в этом пакете и принимающих параметр типа Interrupt_Id, за исключением Is_Reserved и Reference, выполняется проверка, что указанное прерывание не зарезервировано. Если проверка не пройдена, генерируется Program_Error.
Если с помощью процедур Attach_Handler, Detach_Handler или Exchange_Handler предпринимается попытка отсоединить обработчик, который был прикреплён статически (с помощью аспекта Attach_Handler), обработчик не отсоединяется и генерируется Program_Error.
Функция Reference возвращает значение типа System.Address, которое может быть использовано для прикрепления входа задачи через клаузу address (см. J.7.1) к указанному прерыванию. Эта функция генерирует Program_Error, если прикрепление входов задач к прерываниям (или к этому конкретному прерыванию) не поддерживается.
Функция Get_CPU возвращает процессор, на котором выполняется обработчик для прерывания Interrupt. Если обработчик может выполняться на нескольких процессорах, возвращается значение System.Multiprocessors.Not_A_Specific_CPU.
Требования к реализации
В любое время во время прикрепления или обмена обработчиками текущий обработчик соответствующего прерывания не должен быть неопределённым.
Требования к документации
Реализация должна документировать, когда применяется политика Ceiling_Locking (см. D.3), стандартный приоритет потолка, присвоенный защищенному объекту, содержащему защищенную процедуру, которая указывает аспект Attach_Handler или Interrupt_Handler, но не указывает аспект Interrupt_Priority. Этот стандарт может различаться для разных прерываний.
Рекомендации по реализации
Если поддерживаются определяемые реализацией формы процедур обработчиков прерываний, такие как защищенные процедуры с параметрами, то для каждой такой формы обработчика в дочернем пакете Interrupts следует указать аналогичный тип Parameterless_Handler с теми же операциями, что и в предопределённом пакете Interrupts.
ПРИМЕЧАНИЕ Пакет Interrupts.Names содержит определяемые реализацией имена (и постоянные значения) для прерываний, поддерживаемых реализацией.
Примеры
Пример обработчиков прерываний:
Device_Priority : constant
array (Ada.Interrupts.Interrupt_Id range 1..5) of
System.Interrupt_Priority := ( ... );
protected type Device_Interface
(Int_Id : Ada.Interrupts.Interrupt_Id)
with Interrupt_Priority => Device_Priority(Int_Id) is
procedure Handler
with Attach_Handler => Int_Id;
...
end Device_Interface;
...
Device_1_Driver : Device_Interface(1);
...
Device_5_Driver : Device_Interface(5);
...
array (Ada.Interrupts.Interrupt_Id range 1..5) of
System.Interrupt_Priority := ( ... );
protected type Device_Interface
(Int_Id : Ada.Interrupts.Interrupt_Id)
with Interrupt_Priority => Device_Priority(Int_Id) is
procedure Handler
with Attach_Handler => Int_Id;
...
end Device_Interface;
...
Device_1_Driver : Device_Interface(1);
...
Device_5_Driver : Device_Interface(5);
...