|
|
|
|
Основной цикл с прерываниями
Структуру метода основного цикла с прерываниями можно рассматривать как систему опроса с прерываниями. Как и в случае с
чистой системой опроса, в этом методе используется понятие "основного цикла". Во время этого цикла может ничего не делаться, а
может что-то выполняться, что будет прерываться так часто, как
того требуют внешние устройства или часы (таймер). Как только
возникает какое-либо событие, прерывание посылается в процессор.
Отдельная стандартная программа обслуживания прерывания (ISR)
связывается с каждым видом прерывания.
Давайте вернемся к примеру упрощенной системы управления домашним хозяйством. В нашем примере прерывания разработаны так,
что работа процессора прерывается, когда:
1. температура выходит за пределы диапазона от (ref_temp - delta) до (ref_temp + delta)
2. уровень дыма выходит за пределы безопасности.
Процедуры adjust_temp и initiate_alarm представляют собой
две программы ISR, соответствующие указанным двум видам прерываний.
В общем случае прерывание не может быть связано с процедурой
water_lawn, потому что эта процедура использует функцию прерывания "int 21h" операционной системы MS-DOS для определения времени
суток. Поскольку программа операционной системы MS-DOS не является реентерабельной, программа ISR не может произвести другое прерывание в
операционной системе MS-DOS. Поэтому процедура water_lawn не разрабатывается в виде программы ISR, но вызывается
из главного программного цикла main_loop:
forever:
call water_lawn ;
call wait_loop ; для протекания некоторого времени
; до повторного вызова процедуры water_lawn
jmp forever
|
Стандартные программы обслуживания прерываний называются
adjust_temp и initiate_alarm. Текст программы ISR такой же, что и
для уже описанных процедур, со следующей разницей:
1. Программа ISR использует команду IRET вместо команды
RET в обычной процедуре. Команда IRET осуществляет
возврат управления в главную программу по завершении
выполнения программы ISR.
2. Вы должны сохранять регистры, используемые программой
ISR. Регистры должны восстанавливаться до выполнения
команды IRET.
3. Прерывания должны разрешаться/запрещаться.
Программа adjust_temp должна разрешать использование прерываний. В противном случае сигнал об обнаружении дыма может остаться нераспознанным, что
неприемлемо. Аналогично, программа initiate_alarm должна запрещать управления, потому что она является процедурой наивысшего приоритета и
не должна прерываться вплоть до возбуждения сигнала о пожаре.
Указанные программы ISR должны быть связаны с соответствующими уровнями прерываний. Связь эта может быть реализована через
функцию "Установить вектор прерываний" в операционной системе
MS-DOS. Функция прерывания "int 21h" с кодом функции в AH=25h используется для этой цели. DS:DX указывает на программу ISR до выполнения
запроса.
mov ah,25h ; функция= установить вектор
; прерываний
mov al,int_level ; уровень прерываний в AL
mov dx,sadjust_temp
mov ds,dx ; адрес программы ISR в DS:DX
mov dx,offset adjust_temp
int 21h ; обращение к операционной
; системе DOS
|
Подобные запросы к функциям должны выполняться для других программ ISR в системе.
Преимуществами этого подхода являются:
. на опрос неактивных устройств не тратится время
. на любое количество асинхронных внешних событий (если большинство устройств неактивны) поступает очень быстрый ответ
. более простой текст программ, поскольку каждая программа ISR пишется независимо от других.
Недостатками этого подхода являются:
. сложное взаимодействие между программой ISR и главной программой
. сложное протекание главной программы, что является следствием асинхронной природы возникновения событий.
|
|