Руководство по Ada 2012
C.3 Поддержка прерываний
Данный подраздел определяет модель, заданную языком, для аппаратных прерываний, а также механизмы обработки прерываний.
Динамические семантика
Прерывание представляет собой класс событий, которые обнаруживаются аппаратным обеспечением или программным обеспечением системы. Говорят, что прерывания происходят. Происхождение прерывания разделяется на генерацию и доставку. Генерация прерывания — это событие в базовом оборудовании или системе, которое делает прерывание доступным для программы. Доставка — это действие, которое вызывает часть программы в ответ на возникновение прерывания. Между генерацией и доставкой возникновение прерывания (или прерывание) находится в ожидании. Некоторые или все прерывания могут быть заблокированы. Когда прерывание заблокировано, все возникновения этого прерывания предотвращаются от доставки. Некоторые прерывания зарезервированы. Набор зарезервированных прерываний определяется реализацией. Зарезервированное прерывание — это либо прерывание, для которого не поддерживаются пользовательские обработчики, либо прерывание, для которого уже прикреплён обработчик каким-либо другим способом, определённым реализацией. Программные блоки могут быть подключены к незарезервированным прерываниям. При подключении программный блок считается прикреплённым к этому прерыванию. Выполнение этого программного блока, обработчика прерываний, вызывается при доставке возникновения прерывания.
Пока обработчик прикреплён к прерыванию, он вызывается один раз для каждого доставленного возникновения этого прерывания. Во время выполнения обработчика соответствующее прерывание блокируется.
Пока прерывание заблокировано, все возникновения этого прерывания предотвращаются от доставки. Остаются ли такие возникновения в ожидании или теряются, определяется реализацией.
Каждое прерывание имеет стандартную обработку, которая определяет ответ системы на возникновение этого прерывания, когда не прикреплён ни один пользовательский обработчик. Набор возможных стандартных обработок определяется реализацией, как и метод (если он существует) конфигурации стандартных обработок прерываний.
Прерывание доставляется обработчику (или стандартной обработке), который/которое активно для этого прерывания на момент доставки.
Исключение, распространяемое из обработчика, вызванного прерыванием, не имеет эффекта.
Если политика блокировки по потолку (см. D.3) активна, обработчик прерываний выполняется с активным приоритетом, который является приоритетом по потолку соответствующего защищённого объекта.
Требования к реализации
Реализация должна предоставить механизм для определения минимального объёма стека, необходимой для каждого обработчика прерываний, и зарезервировать этот объём для выполнения обработчика. Этот объём должен вмещать вложенные вызовы обработчика, если система это допускает.
Если оборудование или базовая система содержат ожидающие возникновения прерываний, реализация должна обеспечить возможность последующей доставки этих возникновений программе.
Если политика блокировки по потолку не активна, реализация должна предоставить средства для приложения указать, должны ли прерывания блокироваться во время защищённых действий.
Требования к документации
Реализация должна документировать следующие пункты:
1.
Для каждого прерывания, какие прерывания блокируются от доставки, когда выполняется обработчик, прикреплённый к этому прерыванию (либо в результате доставки прерывания, либо в результате обычного вызова процедуры соответствующего защищённого объекта).
2.
Любые прерывания, которые нельзя заблокировать, и эффект прикрепления обработчиков к таким прерываниям, если это разрешено.
3.
Какой стек времени выполнения используется обработчиком прерывания, когда он выполняется в результате доставки прерывания; если это настраиваемо, какой механизм для этого; как указать, какой объём зарезервировать в этом стеке.
4.
Любая специфичная для реализации или оборудования деятельность, которая происходит до того, как пользовательский обработчик прерываний получает управление (например, чтение регистров устройства, подтверждение устройств).
5.
Любые ограничения по времени или другие ограничения, накладываемые на выполнение обработчиков прерываний.
6.
Состояние (блокированное/разблокированное) незарезервированных прерываний при запуске программы; если некоторые прерывания разблокированы, какой механизм программа может использовать для защиты себя перед прикреплением соответствующих обработчиков.
7.
Разрешено ли прерванной задаче возобновить выполнение до возврата обработчика прерываний.
8.
Обработка возникновений прерываний, которые генерируются, пока прерывание заблокировано; то есть, удерживаются ли одно или несколько возникновений для последующей доставки, или все они теряются.
9.
Возникают ли предварительно определённые или определённые реализацией исключения в результате возникновения любого прерывания, и соответствие между аппаратными прерываниями (или ловушками) и предварительно определёнными исключениями.
10.
В многопроцессорной системе правила, регулирующие доставку прерывания на конкретный процессор.
Разрешения для реализации
Если базовая система или оборудование не позволяют блокировать прерывания, то блокировка не требуется в ходе выполнения подпрограмм защищённого объекта, для которых одна из его подпрограмм является обработчиком прерывания.
В многопроцессорной системе с более чем одной системой прерываний, определяется реализацией, будут ли (и как) источники прерываний из отдельных подсистем использовать один и тот же тип Interrupt_Id (см. C.3.2). В частности, значение заблокированного или ожидающего прерывания может тогда применяться только к одному процессору.
Реализации разрешено накладывать временные или другие ограничения на выполнение обработчиков прерываний.
Разрешены другие формы обработчиков, в этом случае следует придерживаться правил этого подраздела.
Активный приоритет выполнения обработчика прерывания допускается изменять от одного возникновения того же прерывания к другому.
Рекомендации по реализации
Если политика блокировки по потолку не активна, реализация должна предоставить средства для приложения указать, какие прерывания блокировать во время защищённых действий, если базовая система позволяет более тонкую настройку блокировки прерываний.
ПРИМЕЧАНИЯ
1 Стандартная обработка прерывания может заключаться в сохранении прерывания в ожидании или в доставке его в обработчик, определённый реализацией. Примеры действий, которые может выполнять обработчик, определённый реализацией, включают прерывание раздела, игнорирование (т.е., отбрасывание возникновений) прерывания или очередь одного или нескольких возникновений прерывания для возможной последующей доставки, когда к этому прерыванию прикреплён пользовательский обработчик.
2 Вызов Task_Identification.Current_Task (см. C.7.1) из обработчика прерываний является ошибкой, ограниченной по времени.
3 Правило, что исключение, распространяемое из обработчика прерываний, не имеет эффекта, моделируется по правилу об исключениях, распространяемых из блоков задач.