Студопедия

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

КАТЕГОРИИ:

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






Запрет/разрешение отдельных аппаратных прерываний.






Программы на асемблере могут запретить аппаратные прерывания. Это маскируемые прерывания; другие аппаратные прерывания, возникающие при некоторых ошибках (таких как деление на ноль) не могут быть маскированы.

Имеются две причины для запрета аппаратных прерываний.

  • В первом случае все прерывания блокируются с тем чтобы критическая часть кода была выполнена целиком, прежде чем машина произведет какое-либо другое действие. Например, прерывания запрещают при изменении вектора аппаратного прерывания, избегая выполнения прерывания когда вектор изменен только наполовину.
  • Во втором случае маскируются только определенные аппаратные прерывания. Это делается когда некоторые определенные прерывания могут взаимодействовать с операциями, критичными к временам. Например, точно рассчитанная по времени процедура ввода/вывода не может себе позволить быть прерванной длительным дисковым прерыванием.

Выполнение прерываний зависит от значения флага прерывания (бит 9) в регистре флагов. Когда этот бит равен 0, то разрешены все прерывания, которые разрешает маска. Когда он равен 1, то все аппаратные прерывания запрещены. Чтобы запретить прерывания, установив этот флаг в 1, используется инструкция CLI. Для очистки этого флага и восстановления прерываний - инструкция STI. Избегайте отключения прерываний на длительный период. Прерывание времени суток происходит 18.2 раза в секунду и если к этому прерыванию был более чем один запрос в то время, когда аппаратные прерывания были запрещены, то лишние запросы будут отброшены исистемное время будет определяться неправильно.

Машина автоматически запрещает аппаратные прерывания при вызове программных прерываний и автоматически разрешает их при возврате. Когда Вы пишете свои программные прерывания, то Вы можете начать программу с инструкции STI, если Вы можете допустить аппаратные прерывания. Однако если за инструкцией CLI не следует STI, то это приведет к остановке машины, так как ввод с клавиатуры будет заморожен.

Для маскирования определенных аппаратных прерываний нужно просто послать требуемую цепочку битов в порт с адресом 21H, который соответствует регистру маски прерываний (IMR). Регистр маски на второй микросхеме 8259 для AT (IRQ8-15) имеет адрес порта A1H. Необходимо установите те биты регистра, которые соответствуют номерам прерываний, которые Вы хотите маскировать.

Нижеприведенный пример блокирует дисковое прерывание. Не забудьте очистить регистр в конце программы, иначе обращение к дискам будет запрещено и после завершения программы.

; ---маскирование 6-го бита регистра маски прерываний

MOV AL, 01000000B; маскируем бит 6

OUT 21H, AL; посылаем в регистр маски прерываний

.

.

MOV AL, 0;

OUT 21H, AL; очищаем IMR в конце программы

В конце кода каждого из Ваших аппаратных прерываний Вы должны включить следующие 2 строчки кода:

MOV AL, 20H

OUT 20H, AL

Если аппаратное прерывание не заканчивается этими строками, то микросхема 8259 не очистит информацию регистра обслуживания, с тем чтобы была разрешена обработка прерываний с более низкими уровнями, чем только что обработанное. Отсутствие этих строк легко может привести к краху программы, так как прерывания от клавиатуры скорее всего окажутся замороженными и даже Ctrl-Alt-Del окажется бесполезным. Эта добавка не нужна для тех векторов прерываний, которые являются расширениями существующих прерываний.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал