CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник по библиотечным функциям языка Си
Interrupt - package пакет работы с прерываниями
Описание
Пакет работы с прерываниями спроектирован как общецеле-
вой пакет по управлению прерываниями 8086. Для каждого
вектора прерываний можно определить новую реакцию.
C функция, обрабатывающая прерывание, определяет, свя-
зано ли прерывание с прежним вектором прерывания или
нет.
int_intercept связывает стандартную C - функцию
(*funcptr) с вектором прерывания для обработки данного
прерывания при его появлении. Параметр vector опре-
деляет вектор прерывания 8086 (0...255), с которым свя-
зывается функция. Аргумент stacksize определяет количе-
ство байтов памяти, отводимой под стек для функции об-
работки. Размер стека должен быть не менее 256 байтов.
Если функция обработки прерывания (*funcptr)() возв-
ратит нулевое значение, то будет вызвана прежняя функ-
ция обработки прерывания, cвязанная с этим вектором,
иначе выполнится возврат из прерывания.
Значения из регистров могут быть считаны или записаны
через указатель (*pd) на структуру INT_DATA, который
поступает к (*funcptr)(). Существует несколько правил,
которым необходимо следовать, занимаясь обработкой пре-
рываний на C:
1). Ни MS DOS, ни BIOS не могут быть вызваны в про-
цессе обработки прерывания, если при этом может
произойти прерывание. Это объясняется тем, что
MS DOS и BIOS не являются повторно входимыми.
2). Нельзя при обработке прерывания или в вызванной
отсюда функции использовать в стеке памяти боль-
ше, чем отведено под стек.
3). Не обращайтесь к какой-либо функции, не являю-
щейся повторно входимой. (Результат будет
непредсказуем).
4). Непозволительно выполнение операций ввода/вы-
вода в обработке прерывания.
5). Когда используются переменные, изменяемые
при обработке прерывания, объявляйте их как
`volatile'.
6). Отключите для функции обработки прерывания конт-
роль переполнения стека.
int_off выключает прерывания 8086 командой CLI (clear
interrupt flag).
int_on включает прерывание 8086 командой STI
(set interrupt flag).
Функция int_restore является обратной к int_intercept.
int_restore отключает первоначальный обработчик преры-
ваний, который был подцеплен к указанному вектору пос-
редством int_intercept. Поэтому int_restore не должна
вызываться до обращения к int_intercept, связывающего
(новую) реакцию с этим вектором прерываний.
int_getvector получает содержимое указанного вектора
прерываний, разлагает его на сегмент и смещение и запо-
минает их в переменных psegment и poffset.
int_setvector устанавливает адрес пользовательской
процедуры, используя offset и segment, в указанном
векторе прерываний.
Использование
#include <int.h>
void int_getvector(unsigned vector, unsigned *poffset,
unsigned *psegment);
int int_intercept(unsigned vector, int (*funcptr)
(struct INT_DATA *pd), unsigned stacksize);
void int_off(void);
void int_on(void);
int int_restore(unsigned vector);
void int_setvector(unsigned vector, unsigned offset,
unsigned segment);
Возвращаемое значение
Значение, возвращаемое int_intercept и int_restore,
индицирует успех или неудачу. 0 возвращается в случае
успеха и -1 в противном случае.
ПРЕДУПРЕЖДЕНИЕ: Переопределение прерывания является
тонкой процедурой, требующей хоро-
шего понимания MS DOS и семейства
IBM PC для успешного применения.
Пример
#include <int.h>
volatile int ctrl_c_count = 0;
int do_ctrl_c();
main()
{
int_intercept(0х23, do_ctrl_c, 256);
/* установили реакцию */
while(ctrl_c_count<3)
printf("Число Ctrl C равно %d/n", ctrl_c_count);
int_restore(0х23); /* восстановили старую */
}
do_ctrl_c()
{
++ctrl_c_count;
return 1;
}
