Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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;
      }

оглавление

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог