Справочник Ada 95
C.3.1 Обработчики защищенных процедур
Синтаксис
Форма директивы pragma Interrupt_Handler следующая:
pragma Interrupt_Handler(handler_name);
Форма директивы pragma Attach_Handler следующая:
pragma Attach_Handler(handler_name, expression);
Правила разрешения имен
Для директив Interrupt_Handler и Attach_Handler имя handler_name должно ссылаться на защищенную процедуру без параметров.
Для директивы Attach_Handler ожидаемый тип для expression — Interrupts.Interrupt_ID (см. C.3.2).
Правила допустимости
Директива Attach_Handler допускается только непосредственно внутри protected_definition, где объявлена соответствующая подпрограмма. Соответствующее объявление protected_type_declaration или single_protected_declaration должно быть на уровне библиотеки.
Директива Interrupt_Handler допускается только непосредственно внутри protected_definition. Соответствующее объявление protected_type_declaration должно быть на уровне библиотеки. Кроме того, любое объявление object_declaration такого типа должно быть на уровне библиотеки.
Динамическая семантика
Если директива Interrupt_Handler встречается в protected_definition, то соответствующая процедура может быть динамически присоединена, как обработчик, к прерываниям (см. C.3.2). Такие процедуры могут быть присоединены к нескольким прерываниям.
expression в директиве Attach_Handler, вычисляемая во время создания объекта, определяет прерывание. В рамках инициализации объекта, если указана директива Attach_Handler, процедура handler присоединяется к указанному прерыванию. Проводится проверка, что соответствующее прерывание не зарезервировано. Если проверка не пройдена, генерируется Program_Error, и существующая обработка прерывания не изменяется.
Если используется политика Ceiling_Locking (см. D.3), то при инициализации защищенного объекта, к которому применяется директива Attach_Handler или Interrupt_Handler, проверяется, что приоритет потолка, определенный в protected_definition, находится в диапазоне System.Interrupt_Priority. Если проверка не пройдена, генерируется Program_Error.
При завершении работы защищенного объекта для любой из его процедур, присоединенных к прерываниям, обработчик отсоединяется. Если обработчик был присоединен процедурой из пакета Interrupts или если ранее пользовательский обработчик для прерывания не был присоединен, восстанавливается стандартная обработка. Если использовалась директива Attach_Handler и последний присоединенный обработчик для того же прерывания совпадает с обработчиком, присоединенным при инициализации защищенного объекта, восстанавливается предыдущий обработчик.
При присоединении обработчика к прерыванию, прерывание блокируется (в соответствии с Разрешением Реализации в C.3) во время выполнения каждого защищенного действия над защищенным объектом, содержащим обработчик.
Ошибочное выполнение
Если используется политика Ceiling_Locking (см. D.3), прерывание доставлено обработчику, а приоритет аппаратного прерывания выше приоритета потолка соответствующего защищенного объекта, выполнение программы является ошибочным.
Если обработчики для данного прерывания, присоединенные с помощью директивы Attach_Handler, не присоединяются и отсоединяются в порядке стека (LIFO), выполнение программы является ошибочным. В частности, при завершении защищенного объекта выполнение является ошибочным, если какие-либо процедуры защищенного объекта присоединены к прерываниям через pragma Attach_Handler, и последний присоединённый обработчик для того же прерывания не совпадает с обработчиком, присоединённым при инициализации защищенного объекта.
Метрики
Реализация должна документировать следующие метрики:
- 1.
- Максимальная задержка для обработчика прерывания, который является безпараметрической защищенной процедурой, в тактах процессора. Это время выполнения, не связанное напрямую с процедурой обработчика или прерванным выполнением. Оценивается как 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 Пример возможного ограничения, определенного реализацией, — запрет использования стандартных пулов памяти внутри тела защищенной процедуры, которая является обработчиком прерывания.