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