Механизм обработки прерываний независимо от архитектуры вычислительной системы подразумевает выполнение некоторой последовательности шагов.
1. Установление факта прерывания (приём сигнала запроса на прерывание) и идентификация прерывания.
2. Запоминание состояния прерванного процесса вычислений. Состояние процесса выполнения программы определяется, прежде всего, значением счетчика команд (адресом следующей команды), содержимым регистров процессора, и может включать также спецификацию режима (например, режим пользовательский или привилегированный) и другую информацию.
3. Управление аппаратно передается на подпрограмму обработки прерывания.
4. Сохранение информации о прерванной программе, которую не удалось спасти на шаге 2 с помощью аппаратуры. В некоторых процессорах предусматривается запоминание довольно большого объема информации о состоянии прерванных вычислений.
5. Собственно выполнение программы, связанное с обработкой прерывания. Эта работа может быть выполнена той же подпрограммой, на которую было передано управление на шаге 3, но в операционных системах достаточно часто она реализуется путем последующего вызова соответствующей подпрограммы.
6. Восстановление информации, относящейся к прерванному процессу (этап, обратный шагу 4).
7. Возврат на прерванную программу.
Шаги 1-3 реализуются аппаратно, шаги 4-7 – программно.
Принципы написания обработчика прерывания
По способу организации программы-обработчики прерываний можно классифицировать как два альтернативных типа: замещающие и перехватывающие векторы прерываний.
К замещающим обработчикам, например, относится обработчик INT 23 (Control/Break), который предполагает замену существующего вектора без его сохранения и восстановления.
По-иному реализуется механизм в обработчике, построенном по принципу перехвата вектора прерывания с последующим его возвратом, при этом обработчик сохраняет значение перехваченного оригинального вектора. Большинство макропрограмм клавиатуры относятся к этому типу обработчиков. Они не замещают вектор прерывания INT 09, а перехватывают прерывание и затем уже "решают", будет ли использоваться оригинальный обработчик BIOS. В любом случае после выполнения процедуры обработки прерывания управление будет передано тому обработчику, чей вектор был перехвачен. Подавляющее большинство обработчиков строится именно по такому принципу.
К сожалению, даже основные аспекты построения обработчиков прерываний традиционно плохо документированы и в этой области системного программирования нет отработанных стандартов. Однако на основе анализа соответствующих программ можно считать, что существуют определенные приемы организации программ-обработчиков прерываний.
Практически в любом обработчике можно выделить следующие основные разделы: инициализация обработчика, активизация обработчика, собственно обработка прерывания и выход из обработчика.
Собственно процедура обработки прерывания - это сугубо индивидуальная задача, на которой почти не отражаются требования, налагаемые системой. Этого нельзя гарантировать в отношении остальных аспектов и компонент обработчика.
Фаза инициализации
Задача этой фазы - обеспечить корректную загрузку обработчика с точки зрения DOS и программ, находящихся в памяти одновременно с обработчиком, привязку обработчика к определенным векторам прерываний и инсталляцию его в качестве резидента. Загрузка обработчика осуществляется таким же образом, как и большинства программ, - при помощи системной функции 4Bh, но в процессе инсталляции резидента могут быть открыты файлы, которые будут закрыты самой операционной системой после выхода из процедуры инициализации. Выход из фазы инициализации заключается в освобождении той части памяти, которая не может быть освобождена операционной системой, и в вызове либо системной функции 31h, либо прерывания DOS INT 27.
Фаза активизации
Активизация обработки прерываний - это действия МП 80286/80386 по передаче управления программе обработки прерываний.
Таблица 7.31
Прерывания, вызванные | ||
INTR | NMI | INT n |
1. Получить номер вектора n из контроллера прерываний, выполнив два специальных цикла "Распознавание прерываний ". 2. Сохранить регистр флажков в стеке. 3. Сохранить CS в стеке. 4. Сохранить IP в стеке. 5. Сбросить IF. 6. Прочитать вектор прерываний n. Поместить селектор в CS и смещение в IP. 7. Начать выполнение команд во входной точке (CS:IP). | 1. Сохранить регистр флажков в стеке. 2. Сохранить CS в стеке. 3. Сохранить IP в стеке. 4. Сбросить IF и запретить NMI. Прочитать вектор прерывания 2. Поместить селектор в CS и смещение в IP. 5. Начать выполнение команд во входной точке (CS:IP). | 1. Сохранить регистр флажков в стеке. 2. Сохранить CS в стеке. 3. Сохранить IP в стеке. 4. Прочитать вектор прерывания n. Поместить селектор в CS и смещение в IP. 5. Начать выполнение команд во вход ной точке (CS:IP |
Фаза обработки
При входе в программу обслуживания прерывания те регистры, которые используются совместно основной программой и обработчиком, должны быть сохранены. Для этого лучше всего каждый используемый регистр немедленно проталкивать (PUSH) в стек. По завершении работы программы-обработчика каждый регистр может быть вытолкнут (POP) из стека в обратном порядке.
Автоматное программирование. Диаграмма состояний и переходов цифрового автомата. Программная реализация ЦА, входных, постоянных и выходных действий состояния. Особенности применения автоматного подхода в системах управления
Автома́тное программи́рование — это парадигма программирования, при использовании которой программа или её фрагмент осмысливается как модель какого-либо формального автомата.
Теорию автоматов преподают не везде. В технических ВУЗах преподают эту теорию применительно к синтезу цифровой аппаратуры, но не применительно к программированию (Такие выводы сделаны моим коллегой Шалыто А. А. для ведущих Питерских ВУЗов).