Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Маскирование аппаратных прерываний





Выше мы использовали команду микропроцессора CLI (функцию Турбо-Си disable) для запрета всех аппаратных прерываний. Но аппаратные прерывания можно запрещать и выборочно. Для этого можно воспользоваться портом 0x21, в который записывается байт - маска аппаратных прерываний. Единица в разряде этого байта соответствует запрету соответствующего аппаратного прерывания, 0 - разрешению прерывания. Соответствие разрядов прерываниям приводится ниже (здесь и далее при поразрядном анализе байтов или слов номер 0 имеет самый младший бит):

  - прерывание таймера;
  - прерывание клавиатуры;
  - каскадирование прерываний (только AT);
  - прерывание асинхронного порта COM2;
  - прерывание асинхронного порта COM3;
  - прерывание контроллера жестких дисков (только XT);
  - прерывание контроллера гибких дисков;
  - прерывание принтера.

Приведенный ниже программный пример иллюстрирует выборочное маскирование прерываний. Функция Турбо-Си clock возвращает количество прерываний таймера, поступивших с начала выполнения нашей программы. Первые 10 значений, выводимые на экран, будут последовательно возрастать, показывая нам, что прерывания от таймера поступают. Затем в порт 0x21 записывается код, содержащий единицу в младшем разряде. Следующие 10 значений возвращаемые функцией clock будут неизменны: прерывания от таймера не поступают. Наконец, мы восстанавливаем значение, ранее находившееся в порту 0x21, и видим, что прерывания от таймера поступают вновь.

/*= ПРИМЕР 3.3 =*//*======== Маскирование аппаратных прерываний ============*/#include <dos.h>#include <time.h>main() { unsigned char mask; /* Исходная маска прерываний */ int i; /* Индикация исходного состояния */ for (i=0; i<10; i++) { printf("%3d ",clock()); delay(100); } printf(" маска=%02x\n",(mask=inportb(0x21))); /* Запрет прерываний от таймера */ outportb(0x21,mask|0x01); /* Индикация нового состояния */ for (i=0;i<10;i++) { printf("%3d ",clock()); delay(100); } printf(" маска=%02x\n",inportb(0x21)); /* Восстановление старой маски */ outportb(0x21,mask); /* Индикация восстановленного состояния */ for (i=0;i<10;i++) { printf("%3d ",clock()); delay(100); } printf(" маска=%02x\n",inportb(0x21));}

Из текста программы видно, что порт 0x21 доступен и для записи, и для чтения. Таким образом, для корректного запрета выбранного прерывания необходимо прочитать текущее состояние маски прерываний, и занести в него запрещающую единицу при помощи операции "логическое ИЛИ".

Для AT разряд 2 используется для каскадирования второго контроллера прерываний. Доступ к маске второго контроллера - через порт 0xA1. Назначения разрядов второй маски следующие:

  - прерывание часов реального времени;
  - прерывание контроллера EGA;
  - прерывание математического сопроцессора;
  - прерывание контроллера жестких дисков;
2,3,4,7 - зарезервированы.

 

Date: 2015-05-23; view: 555; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.011 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию