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

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_statement для входа прерывания. Возможные последствия аналогичны вызову Current_Task из тела входа.

Требования к документации

Реализация должна документировать, к каким прерываниям может быть привязан вход задачи.
Реализация должна документировать, оказывает ли вызов входа прерывания эффект обычного вызова входа, условного вызова или вызова с таймером, и меняется ли эффект при наличии ожидающих прерываний.

Разрешения реализации

Поддержка этого подпункта является необязательной.
Прерывания, к которым реализация допускает привязку входа задачи, могут быть обозначены как зарезервированные на весь период выполнения программы; то есть не только когда к ним привязан вход прерывания.
Вызовы входа прерывания могут быть реализованы путем прямого выполнения соответствующего выражения accept_statement аппаратным обеспечением. В качестве альтернативы реализации разрешается предоставить внутренний обработчик прерываний для имитации эффекта вызова входа обычной задачей.
Реализация может ввести ограничения на спецификации и тела задач, имеющих входы прерывания.
Определяется реализацией, разрешены ли прямые вызовы (из программы) входам прерывания.
Если выражение select_statement содержит как альтернативу terminate_alternative, так и альтернативу accept_alternative для входа прерывания, то реализации разрешается наложить дополнительные требования к выбору альтернативы terminate_alternative в дополнение к требованиям, изложенным в 9.3.
ПРИМЕЧАНИЯ
1 Очереди прерываний соответствуют обычным вызовам входов. Прерывания, которые теряются, если не обрабатываются немедленно, соответствуют условным вызовам входов. Согласно правилам приоритетов, выражение accept_statement, выполненное в ответ на прерывание, может быть выполнено с активным приоритетом, при котором аппаратное обеспечение генерирует прерывание, имея преимущество перед задачами с более низким приоритетом, без действия планирования.
2 Информация управления, которая предоставляется при прерывании, может быть передана связанному входу прерывания как один или несколько параметров режима in.

Примеры

Пример входа прерывания:
задача Interrupt_Handler is
вход Done;
для Done'Address используется Ada.Interrupts.Reference(Ada.Interrupts.Names.Device_Done);
конец Interrupt_Handler;





Spec-Zone.ru

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