Справочник по Ada 2005
Обработчики защищённых процедур
Синтаксис
Форма псевдодирективы Interrupt_Handler выглядит следующим образом:
pragma Interrupt_Handler(имя_обработчикаимя);
Форма псевдодирективы Attach_Handler выглядит следующим образом:
Правила разрешения имён
Для псевдодиректив Interrupt_Handler и Attach_Handler имя имя_обработчика должно обозначать защищённую процедуру с беспараметричным профилем.
Для псевдодирективы Attach_Handler ожидаемый тип для выражения — Interrupts.Interrupt_ID (см. C.3.2).
Правила легальности
Псевдодиректива Attach_Handler разрешена только непосредственно внутри определения_защищенной_процедуры, где объявлена соответствующая подпрограмма. Соответствующее объявление объявление_типа_защищённой_процедуры или единственное_объявление_защищённой_процедуры должно быть на уровне библиотеки.
Псевдодиректива Interrupt_Handler разрешена только непосредственно внутри определения_защищенной_процедуры, где объявлена соответствующая подпрограмма. Соответствующее объявление объявление_типа_защищённой_процедуры или единственное_объявление_защищённой_процедуры должно быть на уровне библиотеки.
Динамическое семантическое поведение
Если псевдодиректива Interrupt_Handler появляется в определении_защищенной_процедуры, то соответствующую процедуру можно динамически прикрепить в качестве обработчика к прерываниям (см. C.3.2). Такие процедуры могут быть прикреплены к нескольким прерываниям.
Выражение в псевдодирективе Attach_Handler, вычисленное во время создания объекта, указывает на прерывание. В рамках инициализации этого объекта, если указана псевдодиректива Attach_Handler, процедура обработчик присоединяется к указанному прерыванию. Проверяется, что соответствующее прерывание не зарезервировано. Если проверка завершается неудачно, генерируется исключение Program_Error, и существующая обработка прерывания не изменяется.
Если в действии политика Ceiling_Locking (см. D.3), то при инициализации защищённого объекта, к процедурам которого применяется псевдодиректива Attach_Handler или Interrupt_Handler, проверяется, что приоритет потолка, определённый в определении_защищенной_процедуры, находится в диапазоне 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 применяются к защищённой процедуре, реализация имеет право наложить реализационно-зависимые ограничения на соответствующее объявление объявление_типа_защищённой_процедуры и тело_защищённой_процедуры.
Реализация может использовать другой механизм для вызова защищённой процедуры в ответ на аппаратное прерывание, чем для вызова этой же защищённой процедуры из задачи.
Независимо от того, что указано в этой подглаве в других местах, псевдодирективы Attach_Handler и Interrupt_Handler разрешается использовать для других, реализационно-определённых, форм обработчиков прерываний.
Рекомендации для реализации
По возможности, реализация должна позволять вызывать обработчики прерываний непосредственно аппаратурой.
По возможности, реализация должна обнаруживать нарушения реализационно-определённых ограничений до времени выполнения.
ПРИМЕЧАНИЯ
4 Псевдодиректива Attach_Handler может обеспечить статическое присоединение обработчиков к прерываниям, если реализация поддерживает предварительную разработку защищённых объектов. (См. C.4.)
5 Защищённый объект, к которому прикреплена (защищённая) процедура, должна иметь приоритет потолка, по крайней мере, такой же высокий, как и наивысший приоритет процессора, при котором данное прерывание будет получено.
6 Защищённые процедуры также могут быть динамически прикреплены к прерываниям с помощью операций, объявленных в предопределённом пакете Interrupts.
7 Примером возможного реализационно-зависимого ограничения является запрет использования стандартных пулов памяти в теле защищённой процедуры, являющейся обработчиком прерываний.