На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 5 / Основной цикл с прерываниями Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Основной цикл с прерываниями

Структуру метода основного цикла с прерываниями можно рассматривать как систему опроса с прерываниями. Как и в случае с чистой системой опроса, в этом методе используется понятие "основного цикла". Во время этого цикла может ничего не делаться, а может что-то выполняться, что будет прерываться так часто, как того требуют внешние устройства или часы (таймер). Как только возникает какое-либо событие, прерывание посылается в процессор. Отдельная стандартная программа обслуживания прерывания (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 и главной программой


. сложное протекание главной программы, что является следствием асинхронной природы возникновения событий.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz