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

es                   mov                      b [di], ':'

nopt:

sub                        di, 2

es                   mov                      b [di], dl

sub                        di, 2

es                   mov                      b [di], al

loop                      l3

mov                      flag, 0

l2:

mov                      al, cnt                    ;проверка окончания времени отображения на экране системного

cmp                       al, maxcnt            ;времени

jne                         l1

restv                     08, old_v              ;восстановление ВП системного таймера

restv                     060, old_v1         ;восстановление пользовательского ВП

mov                      ah, 04c

int                         021                       ;завершение выполнения программы

i060_hnd:

inc                         sec         ;циклы проверок правильности счета времени в формате чч:мм:сс

inc                         cnt

cmp                       sec, 60                  ;секунды <= 60

jne                         end_060

mov                      sec, 0

inc                         min

cmp                       min, 60                 ;минуты <= 60

jne                         end_060

mov                      min, 0                  

inc                         hour

cmp                       hour, 24                ;часы <= 24

jne                         end_060

mov                      hour, 0

end_060:

mov                      flag, 1

iret

i08_hnd:

push                      ax, ds

mov                      ds, cs                     ;установка доступа к данным процедуры

inc                         cntr                       ;увеличение значения счетчика прерывании

cmp                       cntr, 18                 ;проверка на прохождение 1 минуты (~990 мсек)

jne                         l10        

mov                       cntr, 0                   ;обнуление счетчика прерывании

int                         060                       ;вызов пользовательского прерывания

l10:

pop                       ds, ax

cs                   jmp                       old_v                    ;передача управления исходному обработчику

Результат выполнения программы – вывод текущего системного времени. В верхнем левом углу экрана. По истечении количества секунд, заданного в maxcnt, программа завершает работу.

3.  Исследование аппаратных прерывании в  ОС QNX

В отличие от DOS, в QNX реализован интерфейс пользователя и контроллера прерываний на основе механизма API. То есть существует некоторый набор функций, макроопределений и других средств, которые позволяют управлять системой прерываний средствами языков высокого уровня, выполняя при этом такие операции, как маскирование прерываний. Принципиальным отличием от DOS является то, что некоторые средства QNX являются специфическими для многозадачной операционной системы.

Рассмотрим основные функции API для работы с прерываниями.

#include <sys/neutrino.h>

int InterruptAttach( int intr, const struct sigevent * (*handler) (void*, int), const void* area, int size,

unsigned flags);

Используется для постановки в соответствие обработчика источнику прерывания.

intr                  номер прерываний, которое требуется перехватить

handler                        указатель на функцию - обработчик прерывания

area                 указатель на пространство связи, которое выделяется для обработчика процессом

size                  размер пространства связи

flags                флаги, которые указывают на специфику перехвата прерывания:

_NTO_INTR_FLAGS_END    -    понижение приоритета указанного обработчика относительно других обработчиков;

_NTO_INTR_FLAGS_PROCESS    -   ставить в соответствие обработчику не тред, но    отдельный процесс;