Страница 1 из 1

Системный таймер и его программирование

Добавлено: 01 фев 2010, 12:32
Maximys
В моей программе необходимо циклично делать точную задержку на 1 миллисекунду. Применяю стандартную функцию 86h прерывания 15h. Но вся проблема заключается в том, что данная функция делает задержку с помощью системного таймера, который постоянно "занят", т.к. он используется ОС для обновления системного времени.
Подскажите пожалуйста, как можно временно "освободить" таймер, чтобы он мог воспринимать команды моей программы, чтобы он мог делать необходимую мне задержку?

Re: Системный таймер и его программирование

Добавлено: 01 фев 2010, 23:30
BulldozerBSG
Я так понимаю речь идет про ДОС, то тогда в чем проблема. Вручную исправь вектор прерывания от таймера на свою функцию и все.

Re: Системный таймер и его программирование

Добавлено: 02 фев 2010, 10:01
Maximys
BulldozerBSG писал(а):Я так понимаю речь идет про ДОС, то тогда в чем проблема. Вручную исправь вектор прерывания от таймера на свою функцию и все.
Если не затруднит, подскажи как это можно сделать? Я пытаюсь перепрограммировать таймер(сделать с помощью него задержку) с помощью следующих установок:

Код: Выделить всё

XOR Cx, Cx
MOV Dx, 1000
MOV Ah, 86h
INT 15h
таким образом я пытаюсь сделать необходимую мне задержку, а как исправить таблицу векторов прерываний я не представляю.

Re: Системный таймер и его программирование

Добавлено: 02 фев 2010, 22:46
BulldozerBSG
Maximys писал(а):Если не затруднит, подскажи как это можно сделать? Я пытаюсь перепрограммировать таймер(сделать с помощью него задержку) с помощью следующих установок:

Код: Выделить всё

XOR Cx, Cx
MOV Dx, 1000
MOV Ah, 86h
INT 15h
таким образом я пытаюсь сделать необходимую мне задержку, а как исправить таблицу векторов прерываний я не представляю.
А где вы нашли описание этой функции. У вас неверные сведения. Эта функция всего лишь задержка на указанное время.

INT 15H
86H Ждать. Циклит с разрешенными прерываниями до истечения интервала времени.
вход: CX,DX = сколько микросекунд ждать до возврата к пользователю

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

INT 15H
83H Ждать события. Запустить таймер и установить флаг по истечении интервала.
вход: AL = код подфункции:
AL = 0: уст. интервал (и запустить таймер)
ES:BX = адрес пользовательского байта. бит 7 в этом байте
будет включен по истечении интервала.
CX,DX = длина интервала в микросекундах (CX - старшая часть)
AL = 1: отменить ожидание события.

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

Re: Системный таймер и его программирование

Добавлено: 04 фев 2010, 12:42
Maximys
BulldozerBSG писал(а):А где вы нашли описание этой функции. У вас неверные сведения. Эта
83H Ждать события. Запустить таймер и установить флаг по истечении интервала.
вход: AL = код подфункции:
AL = 0: уст. интервал (и запустить таймер)
ES:BX = адрес пользовательского байта. бит 7 в этом байте
будет включен по истечении интервала.
CX,DX = длина интервала в микросекундах (CX - старшая часть)
AL = 1: отменить ожидание события.

Используйте данную функцию, а в основной программе проверяйте установление флага. И если установлен, то его сбрасываем и выполняйте вашу подпрограмму, иначе опять проверять.
Подскажите пожалуйста, а как с помощью этой функции сделать так, чтобы при истечении времени управление передавалось моей программе и в таймер ещё раз устанавливалось необходимое мне значение и он вновь запускался? Необходимо корректировать таблицу векторов прерывания и если "Да", то как это можно сделать?

Re: Системный таймер и его программирование

Добавлено: 04 фев 2010, 15:33
BulldozerBSG
Думаю из примера все будет понятно

Код: Выделить всё

        org     100h                    ; code starts at offset 100h
        use16                           ; use 16-bit code
start:
; инициализация таймера
timer_on:
        mov     ah, 83h
        mov     al, 0h
        mov     bx, time_flag
        mov     cx, 10h
        mov     dx, 0
        int     15h
; циклическая проверка флага
l_001:
        cmp     byte[time_flag], 80h
        jnz     l_001
printm:
        mov     ah,9h
        mov     dx,hello
        int     21h
        mov     byte[time_flag], 0h
        dec     [count]
        cmp     [count], 0h
        jnz     timer_on
exit:
        int     20h

time_flag db 0
hello db 'Hello world!',0Dh, 0Ah, 24h
count db 10  

Re: Системный таймер и его программирование

Добавлено: 05 фев 2010, 11:32
Maximys
BulldozerBSG писал(а):Думаю из примера все будет понятно

Код: Выделить всё

        org     100h                    ; code starts at offset 100h
        use16                           ; use 16-bit code
start:
; инициализация таймера
timer_on:
        mov     ah, 83h
        mov     al, 0h
        mov     bx, time_flag
        mov     cx, 10h
        mov     dx, 0
        int     15h
; циклическая проверка флага
l_001:
        cmp     byte[time_flag], 80h
        jnz     l_001
printm:
        mov     ah,9h
        mov     dx,hello
        int     21h
        mov     byte[time_flag], 0h
        dec     [count]
        cmp     [count], 0h
        jnz     timer_on
exit:
        int     20h

time_flag db 0
hello db 'Hello world!',0Dh, 0Ah, 24h
count db 10  
Приблизительно ясно. У функции 83h можно назначить код подфункции(в Al), насколько мне известно, у прерывания 15h есть "свободные" подфункции, которые можно перепрограммировать. Ни могли бы Вы подсказать их номера и написать, как это можно сделать(мне в голову пришла хорошая идея)? Я хочу назначить одно из таких прерываний на выполнение моей процедуры.

Re: Системный таймер и его программирование

Добавлено: 05 фев 2010, 13:16
BulldozerBSG
Ну если приблизительно ясно, то сидим и разбираем мой пример. А по поводу функции 83h я дал достаточно полное описание. И там явно сказано что AL=0 - устанавливаем таймер, AL=1 - отменить ожидание таймера! А пр всякие свободные функции прерывания 15h ничего не слышал.

Поэтому источник информации в студию про свободные функции.

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