Spec-Zone.ru › Ada 2012
Справочное руководство Ada 2012

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

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

Существуют следующие определяемые языком пакеты:
with System;
with System.Multiprocessors;
package Ada.Interrupts is
type Interrupt_Id is определяемое реализацией;
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;
function Get_CPU (Interrupt : Interrupt_Id)
return System.Multiprocessors.CPU_Range;
private
... -- не определено языком
end Ada.Interrupts;
package Ada.Interrupts.Names 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) к прерыванию, указанному параметром Interrupt. Эта функция вызывает 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.
ПРИМЕЧАНИЯ
8 Пакет Interrupts.Names содержит определяемые реализацией имена (и константные значения) для прерываний, поддерживаемых реализацией.

Примеры

Пример обработчиков прерываний:
Device_Priority : constant
array (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);
...


Spec-Zone.ru

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