Справочник по Ada 2005
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 Правило, что исключение, распространяемое из обработчика прерывания, не имеет эффекта, моделируется по аналогии с правилом об исключениях, распространяемых из блоков задач.