Справочник по Ada (Ada 2022)
J.7.1 Входные точки прерываний
Реализации разрешается подключать задания входов к прерываниям с помощью ключевого слова address. Такой вход называется входом прерывания.
Адрес задания входа соответствует прерыванию аппаратуры определённым образом в реализации. (См. Ada.Interrupts.Reference в C.3.2.)
Статическая семантика
Определено следующее свойство:
Для любого задания входа X:
X'Address
Для задания входа, адрес которого указан (вход прерывания), значение относится к соответствующему прерыванию аппаратуры. Для такого входа, как и для любого другого задания входа, значение этого свойства определяется реализацией. Значение этого свойства имеет тип подтипа System.Address.
Адрес может быть указан для отдельных входов с помощью определения_признака_атрибута.
Динамическая семантика
В качестве части инициализации объекта задания, ключевое слово address для входа прерывания обрабатывается, что приводит к вычислению выражения ключевого слова address. Проверяется, что указанный адрес связан с каким-либо прерыванием, к которому можно подключить задание входа. Если проверка завершается неудачно, генерируется Program_Error. В противном случае вход прерывания подключается к прерыванию, связанному с указанным адресом.
При завершении объекта задания, вход прерывания, если таковой имеется, отключается от соответствующего прерывания, и восстанавливается обработка по умолчанию.
Пока вход прерывания подключен к прерыванию, прерывание зарезервировано (см. C.3).
Прерывание, переданное заданию входа, действует как вызов входа, выполненный заданием аппаратуры, приоритет которого находится в диапазоне System.Interrupt_Priority. Определяется реализацией, выполняется ли вызов как обычный вызов входа, вызов входа с таймером или условный вызов входа; тип вызова может зависеть от конкретного прерывания.
Ограниченные (временные) ошибки
Ошибка ограничена, если в операторе_приёма для входа прерывания вычисляется E'Caller (см. C.7.1). Возможные эффекты такие же, как при вызове Current_Task из тела входа.
Требования к документации
Реализация должна задокументировать, к каким прерываниям может быть подключено задание входа.
Реализация должна задокументировать, приводит ли вызов входа прерывания к обычному вызову входа, условному вызову или вызову с таймером, а также зависит ли эффект от наличия ожидающих прерываний.
Разрешения для реализации
Поддержка данного подпункта является необязательной.
Прерывания, к которым реализация позволяет подключать задания входа, могут быть помечены как зарезервированные на протяжении всего времени выполнения программы; то есть не только тогда, когда к ним подключен вход прерывания.
Вызовы входа прерывания могут быть реализованы путём прямого выполнения аппаратурой соответствующего оператора_приёма. В качестве альтернативы, реализация может предоставить внутренний обработчик прерываний для имитации эффекта вызова входа обычной задачей.
Реализация может наложить ограничения на спецификации и тела заданий, которые имеют входы прерывания.
Определяется реализацией, разрешены ли прямые вызовы (из программы) к входам прерывания.
Если выражение_с_выбором содержит как альтернатива_прекращения, так и альтернатива_приёма для входа прерывания, то реализация может наложить дополнительные требования к выбору альтернатива_прекращения помимо тех, которые указаны в 9.3.
ПРИМЕЧАНИЕ 1 Очередные прерывания соответствуют обычным вызовам входов. Прерывания, которые теряются, если не обработаны немедленно, соответствуют условным вызовам входов. Из правил приоритета следует, что оператор приёма, выполняемый в ответ на прерывание, может выполняться с активным приоритетом, с которым аппаратура генерирует прерывание, имея преимущество перед задачами с более низким приоритетом, без действия планировщика.
ПРИМЕЧАНИЕ 2 Информация управления, предоставленная при прерывании, может передаваться связанному входу прерывания в виде одного или нескольких параметров режима входной.
Примеры
Пример входа прерывания:
задание Interrupt_Handler есть
вход Done;
для Done'Address используется Ada.Interrupts.Reference(Ada.Interrupts.Names.Device_Done);
конец Interrupt_Handler;
вход Done;
для Done'Address используется Ada.Interrupts.Reference(Ada.Interrupts.Names.Device_Done);
конец Interrupt_Handler;