Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

Обработчики защищённых процедур

Абзацы с 1 по 6 перемещены в Приложении J, «Устаревшие функции».

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

Для безаргументной защищённой процедуры могут быть указаны следующие аспекты представления языка:
Interrupt_Handler

Тип аспекта Interrupt_Handler — Boolean. Если он задан непосредственно, то определение аспекта должно быть статическим выражением. Этот аспект никогда не наследуется; если он не задан явно, то аспект имеет значение False.
Attach_Handler

Аспект Attach_Handler представляет собой выражение, тип которого должен быть Interrupts.Interrupt_Id. Этот аспект никогда не наследуется.

Правила легальности

Если для защищённой процедуры задан аспект Attach_Handler или Interrupt_Handler, то соответствующее объявление protected_type_declaration или single_protected_declaration должно быть на уровне библиотеки и не должно быть объявлено внутри тела обобщённого компонента. В дополнение к местам, где обычно применяются правила легальности (см. 12.3), это правило также применяется в частях с описанием реализации обобщённого компонента.
Этот абзац был удалён.

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

Если аспект Interrupt_Handler защищённой процедуры равен True, то процедура может быть динамически прикреплена, как обработчик, к прерываниям (см. C.3.2). Такие процедуры могут быть прикреплены к нескольким прерываниям.
Выражение, заданное для аспекта Attach_Handler защищённой процедуры P, вычисляется в процессе создания защищённого объекта, содержащего P. Значение выражения идентифицирует прерывание. В качестве части инициализации этого объекта, P (процедура-обработчик) прикрепляется к идентифицированному прерыванию. Проверяется, что соответствующее прерывание не зарезервировано. Если проверка завершается неудачно, генерируется исключение Program_Error, а существующая обработка прерывания не затрагивается.
Если в силе политика Ceiling_Locking (см. D.3), то при инициализации защищённого объекта, содержащего защищённую процедуру, для которой задан аспект Attach_Handler или аспект Interrupt_Handler равен True, проверяется, что начальный приоритет потолка объекта находится в диапазоне System.Interrupt_Priority. Если проверка завершается неудачно, генерируется исключение Program_Error.
При завершении работы защищённого объекта для любой из его процедур, прикреплённых к прерываниям, обработчик отсоединяется. Если обработчик был прикреплён процедурой из пакета Interrupts или ранее пользовательский обработчик не был прикреплён к прерыванию, восстанавливается стандартная обработка. Если был указан аспект Attach_Handler, и последний прикреплённый обработчик для того же прерывания идентичен обработчику, прикреплённому во время инициализации защищённого объекта, восстанавливается предыдущий обработчик.
При прикреплении обработчика к прерыванию прерывание блокируется (в соответствии с разрешением реализации в C.3) во время выполнения каждой защищённой операции над защищённым объектом, содержащим обработчик.
Если в силе ограничение No_Dynamic_Attachment, проверяется, что прерывание, идентифицированное аспектом Attach_Handler, не появляется в каком-либо ранее разработанном аспекте Attach_Handler; если проверка завершается неудачно, генерируется Program_Error.

Ошибочное выполнение

Если в силе политика Ceiling_Locking (см. D.3), прерывание передаётся обработчику, и приоритет аппаратного прерывания выше, чем приоритет потолка соответствующего защищённого объекта, выполнение программы является ошибочным.
Если обработчики для данного прерывания, прикреплённые через аспект Attach_Handler, не прикрепляются и не отсоединяются в порядке стека (LIFO), выполнение программы является ошибочным. В частности, при завершении защищённого объекта выполнение является ошибочным, если любые из процедур защищённого объекта прикреплены к прерываниям через аспект Attach_Handler, и последний прикреплённый обработчик для того же прерывания не совпадает с обработчиком, прикреплённым во время инициализации защищённого объекта.

Метрики

Реализация должна документировать следующую метрику:
  • Максимальная задержка для обработчика прерывания, являющегося безаргументной защищённой процедурой, в тактах процессора. Это время выполнения, не непосредственно связанное с процедурой-обработчиком или прерванным выполнением. Оно оценивается как C – (A+B), где A — время выполнения заданной последовательности инструкций без прерывания, B — время выполнения обычного вызова заданной защищённой процедуры, а C — время выполнения той же последовательности инструкций при прерывании одним выполнением той же процедуры, вызываемой через прерывание.

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

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

Рекомендации по реализации

По возможности, реализация должна допускать вызов обработчиков прерываний непосредственно аппаратным обеспечением.
По возможности, реализация должна обнаруживать нарушения любых ограничений, определённых реализацией, до выполнения.
ПРИМЕЧАНИЕ 1 Аспект Attach_Handler может обеспечить статическое прикрепление обработчиков к прерываниям, если реализация поддерживает предварительную разработку защищённых объектов. (См. C.4.)
ПРИМЕЧАНИЕ 2 Для защищённого объекта, у которого (защищённая) процедура прикреплена к прерыванию, правильный приоритет потолка — по крайней мере, такой же высокий, как и самый высокий приоритет процессора, на котором это прерывание будет когда-либо доставлено.
ПРИМЕЧАНИЕ 3 Защищённые процедуры также могут быть динамически прикреплены к прерываниям с помощью операций, объявленных в предопределённом пакете Interrupts.
ПРИМЕЧАНИЕ 4 Пример возможного ограничения, зависящего от реализации, — запрет использования стандартных пулов памяти в теле защищённой процедуры, являющейся обработчиком прерываний.


Spec-Zone.ru

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