Справочник по Ada 2012
Обработчики защищённых процедур
Абзацы с 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), это правило также применяется в части private экземпляра генерического блока.
Этот абзац был удалён.
Динамическая семантика
Если аспект 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) во время выполнения каждой защищённой операции над защищённым объектом, содержащим обработчик.
Ошибка выполнения
Если используется политика 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 могут использоваться для других, определённых реализацией, форм обработчиков прерываний.
Рекомендации по реализации
По возможности реализация должна позволять вызывать обработчики прерываний напрямую аппаратным обеспечением.
По возможности реализация должна обнаруживать нарушения любых ограничений, определённых реализацией, до выполнения программы.
ПРИМЕЧАНИЯ
4 Аспект Attach_Handler может обеспечить статическое присоединение обработчиков к прерываниям, если реализация поддерживает предварительную разработку защищённых объектов. (См. C.4.)
5 Защищённый объект, у которого (защищённая) процедура прикреплена к прерыванию, должен иметь приоритет блокировки по меньшей мере такой же высокий, как самый высокий приоритет процессора, при котором это прерывание будет когда-либо передаваться.
6 Защищённые процедуры также могут быть динамически прикреплены к прерываниям с помощью операций, объявленных в предопределённом пакете Interrupts.
7 Примером возможного ограничения, определённого реализацией, является запрет использования стандартных хранилищ памяти внутри тела защищённой процедуры, которая является обработчиком прерывания.