; или нет
mov ah,2ch ; функция считывания времени
int 21h ; обращение к DOS при возврате
; cx содержит часы и минуты
mov bl,watering ; началось ли орошение?
test bl,1 ;
jz start_or_not нет, тогда начать орошение
mov dh,stop_hours ; не пора ли кончить поливку?
mov dl,stop_mins ; сравнивать со временем ос-
танова
cmp cx,dx ; пора прекратить орошение?
jl exit ; нет,пусть орошение продолжается
mov watering,0 ; орошение прекращено
mov al, stop_code ; вывести код останова
out water_port, al ; через water_port
ret ; выполнено
start_or_not:
mov dh,start_hours ; время начала находится в DX
mov dl,start_mins ;
cmp cx,dx ; пора ли начать орошение?
jl exit ; нет еще
mov watering,1 ; да, орошение началось
mov al,start_code ; вывести код пуска
out water_port,al ; через water_port
exit:
ret ; выполнено
----------------------------------------------------------------
В этой программе предполагается, что время остановки (значе-
ние "stop_hours:stop_mins") больше времени начала орошения (зна-
чения "start_hours:start_mins). Глобальная булевая переменная
"watering" используется здесь таким образом, что сигнал на запуск
или останов поливки должен выдаваться только один раз в день.
Теперь, когда у нас есть индивидуальные процедуры управления
- 5-24 -
нагреванием, пожарной тревогой и орошением газонов, давайте про-
ведем исследование требований ко всей системе. Температуру следу-
ет регулировать повторно каждые несколько минут. Сигнал пожарной
тревоги должен раздаваться сразу же после обнаружения огня (или
дыма) - здесь недопустима задержка!
Газон должен орошаться ежедневно в течение двух часов начи-
ная с 18.30. Мы предположили, что соответствующие устройства и
преобразователи для ввода/вывода данных уже связаны с процессором
через интерфейс. Теперь мы готовы обсудить общую конструкцию сис-
темы реального времени для упрощенного управления домашним хо-
зяйством.
Мы будем рассматривать три синхронных метода: упорядоченного
опроса (без прерываний), основного цикла с прерываниями цикли-
ческих планировщиков. Как мы уже упоминали, синхронные методы тре-
буют наличия только одного и задачи в системе для их реализации.
Система упорядоченного опроса
Система упорядоченного опроса состоит из главного цикла, в
течение которого все устройства последовательно опрашиваются (или
вызываются нужные процедуры) по одному. Программа для упрощенной
системы домашнего контроля использует эту структуру, что демонс-
трируется программой в системе 5-5.
В этой программе слова "wait_loop" обозначают программный
цикл, в котором происходит ожидание в течение некоторого времени.
В общем случае может потребоваться вводить "передышки" в системы
опроса. Для того, чтобы понять необходимость введения таких "пе-
редышек", рассмотрим пример управления управляемой компьютером
автомашины. Предположим, что компьютер решил повернуть машину в
право и выдал команду: "поворот направо". Колеса начали выполнять
поворот, но в этот момент, предположим, компьютер продолжает про-
верять и оценивать входные данные с все большей скоростью. И
компьютер продолжает считать, что машина еще не поворачивает и
повторно посылает команду поворота вправо. Прежде чем осознать,
что машина уже поворачивает, компьютер успевает выдать несколько
команд "поворота вправо", что приведет к заносу машины. Чтобы из-
бежать подобной ситуации компьютер должен быть так запрограммиро-
ван, чтобы он имел возможность делать паузы после выдачи команд
для их выполнения. Но в случае управления домашним хозяйством та-
кие паузы недопустимы, так как обнаружение пожара требует немед-
ленных, а не "отложенных" действий, как уже было упомянуто выше.
Листинг 5-5. Программа ref_level
----------------------------------------------------------------
; ref_level - опасный уровень дыма
forever:
call adjust_temp ;вызов стандартной подпрог-
;раммы
in al, smoke_port ;получить значение уровня
;дыма
cmp al, ref_level ;проверка наличия опасности
jl no_danger
call initiate_alarm ;включить сигнал тревоги
no_danger:
call water_lawn ;вызов стандартной подпрог-
- 5-25 -
;раммы
call wait_loop ;пауза (отсутствие действий)
jmp forever
wait_loop:
mov cx, 0ffh ;значение в cx определяет
;время ожидания
wait:
loop wait
ret
----------------------------------------------------------------
Преимуществами описанного метода являются:
. простая конструкция системы
. быстрое время ответа.
Недостатками же являются следующие:
. процессор всегда находится в занятом состоянии, поскольку он
полностью посвящен опросу портов
. время циклов может стать чрезмерным по мере возрастания ко-
личества опрашиваемых устройств
. время тратится на опрос портов, большую часть времени нахо-
дящихся в неактивном состоянии, например, датчиков дыма в
нашем примере.
Основной цикл с прерываниями
Структуру метода основного цикла с прерываниями можно расс-
матривать как систему опроса с прерываниями. Как и в случае с
чистой системой опроса, в этом методе используется понятие "ос-
новного цикла". Во время этого цикла может ничего не делаться, а
может что-то выполняться, что будет прерываться так часто, как
того требуют внешние устройства или часы (таймер). Как только
возникает какое-либо событие, прерывание посылается в процессор.
Отдельная стандартная программа обслуживания прерывания (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 ; для протекания некоторого времени
- 5-26 -
; до повторного вызова процедуры 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,seg adjust_temp
mov ds,dx ; адрес программы ISR в DS:DX
mov dx,offset adjust_temp
int 21h ; обращение к операционной
; системе DOS
Подобные запросы к функциям должны выполняться для других
программ ISR в системе.
Преимуществами этого подхода являются:
. на опрос неактивных устройств не тратится время
. на любое количество асинхронных внешних событий (если
большинство устройств неактивны) поступает очень быстрый от-
вет
. более простой текст программ, поскольку каждая программа ISR
пишется независимо от других.
Недостатками этого подхода являются:
. сложное взаимодействие между программой ISR и главной
программой
. сложное протекание главной программы, что является
следствием асинхронной природы возникновения событий.
- 5-27 -
Циклические планировщики
Для того, чтобы понять работу циклических планировщиков