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