Справочник Ada 95
J.7.1 Входные точки прерываний
Реализации разрешают прикреплять задания задач к прерываниям с помощью клаузы адреса. Такая входная точка называется входной точкой прерывания.
Адрес входной точки задачи соответствует аппаратной точке прерывания способом, определённым реализацией. (См. Ada.Interrupts.Reference в C.3.2.)
Статическая семантика
Определено следующее атрибут:
Для любой входной точки задачи X:
- X'Address
- Для входной точки задачи, адрес которой задан (входная точка прерывания), значение относится к соответствующему аппаратной точке прерывания. Для такой входной точки, как и для любой другой входной точки задачи, смысл этого значения определяется реализацией. Значение этого атрибута имеет тип подтипа System.Address.
- Адрес может быть задан для отдельных входных точек с помощью клаузы attribute_definition_clause.
Динамическая семантика
В рамках инициализации объекта задачи происходит обработка клаузы адреса для входной точки прерывания, которая вычисляет выражение клаузы адреса. Проверяется, что указанный адрес связан с каким-либо прерыванием, к которому может быть прикреплена входная точка задачи. Если эта проверка завершается неудачно, генерируется Program_Error. В противном случае входная точка прерывания прикрепляется к прерыванию, связанному с указанным адресом.
При завершении объекта задачи, если она есть, входная точка прерывания открепляется от соответствующего прерывания и восстанавливается стандартная обработка.
Пока входная точка прерывания прикреплена к прерыванию, прерывание зарезервировано (см. C.3).
Прерывание, доставленное в входную точку задачи, действует как вызов входной точки, инициированный аппаратной задачей, приоритет которой находится в диапазоне System.Interrupt_Priority. Определяется реализацией, выполняется ли вызов как обычный вызов входной точки, вызов входной точки с таймером или условный вызов входной точки; вид вызова может зависеть от конкретного прерывания.
Ограниченные (временные) ошибки
Ошибка при вычислении E'Caller (см. C.7.1) в accept_statement для входной точки прерывания является ограниченной. Возможные последствия аналогичны вызову Current_Task из тела входной точки.
Требования к документации
Реализация должна документировать, к каким прерываниям может быть прикреплена входная точка задачи.
Реализация должна документировать, имеет ли вызов входной точки прерывания эффект обычного вызова входной точки, условного вызова или вызова с таймером, и меняется ли этот эффект при наличии ожидающих прерываний.
Разрешения для реализации
Поддержка данного подпункта является необязательной.
Прерывания, к которым реализация разрешает прикреплять входную точку задачи, могут быть обозначены как зарезервированные на всё время выполнения программы, а не только когда к ним прикреплена входная точка прерывания.
Вызовы входных точек прерываний могут быть реализованы путём прямого выполнения соответствующей accept_statement аппаратным обеспечением. В качестве альтернативы реализация может предоставить внутренний обработчик прерываний для имитации эффекта нормального вызова входной точки задачей.
Реализация может наложить ограничения на спецификации и тела задач, имеющих входные точки прерываний.
Определяется реализацией, разрешены ли прямые вызовы (из программы) к входным точкам прерываний.
Если select_statement содержит как terminate_alternative, так и accept_alternative для входной точки прерывания, то реализация может наложить дополнительные требования к выбору terminate_alternative помимо тех, что указаны в 9.3.
ПРИМЕЧАНИЯ
1 Очередные прерывания соответствуют обычным вызовам входных точек. Прерывания, которые теряются, если они не обрабатываются немедленно, соответствуют условным вызовам входных точек. Из правил приоритета следует, что оператор accept_statement, выполняемый в ответ на прерывание, может быть выполнен с активным приоритетом, с которым аппаратное обеспечение генерирует прерывание, имея приоритет над задачами с более низким приоритетом, без действий по планированию.
2 Управляющая информация, предоставляемая при прерывании, может передаваться связанной входной точке прерывания в качестве одного или нескольких параметров режима in.
Примеры
Пример входной точки прерывания:
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;