Системный таймер и его программирование
Модератор: Andy
В моей программе необходимо циклично делать точную задержку на 1 миллисекунду. Применяю стандартную функцию 86h прерывания 15h. Но вся проблема заключается в том, что данная функция делает задержку с помощью системного таймера, который постоянно "занят", т.к. он используется ОС для обновления системного времени.
Подскажите пожалуйста, как можно временно "освободить" таймер, чтобы он мог воспринимать команды моей программы, чтобы он мог делать необходимую мне задержку?
Подскажите пожалуйста, как можно временно "освободить" таймер, чтобы он мог воспринимать команды моей программы, чтобы он мог делать необходимую мне задержку?
-
- Сообщения: 270
- Зарегистрирован: 09 янв 2010, 04:14
- Контактная информация:
Я так понимаю речь идет про ДОС, то тогда в чем проблема. Вручную исправь вектор прерывания от таймера на свою функцию и все.
Если не затруднит, подскажи как это можно сделать? Я пытаюсь перепрограммировать таймер(сделать с помощью него задержку) с помощью следующих установок:BulldozerBSG писал(а):Я так понимаю речь идет про ДОС, то тогда в чем проблема. Вручную исправь вектор прерывания от таймера на свою функцию и все.
Код: Выделить всё
XOR Cx, Cx
MOV Dx, 1000
MOV Ah, 86h
INT 15h
-
- Сообщения: 270
- Зарегистрирован: 09 янв 2010, 04:14
- Контактная информация:
А где вы нашли описание этой функции. У вас неверные сведения. Эта функция всего лишь задержка на указанное время.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: отменить ожидание события.
Используйте данную функцию, а в основной программе проверяйте установление флага. И если установлен, то его сбрасываем и выполняйте вашу подпрограмму, иначе опять проверять.
Подскажите пожалуйста, а как с помощью этой функции сделать так, чтобы при истечении времени управление передавалось моей программе и в таймер ещё раз устанавливалось необходимое мне значение и он вновь запускался? Необходимо корректировать таблицу векторов прерывания и если "Да", то как это можно сделать?BulldozerBSG писал(а):А где вы нашли описание этой функции. У вас неверные сведения. Эта
83H Ждать события. Запустить таймер и установить флаг по истечении интервала.
вход: AL = код подфункции:
AL = 0: уст. интервал (и запустить таймер)
ES:BX = адрес пользовательского байта. бит 7 в этом байте
будет включен по истечении интервала.
CX,DX = длина интервала в микросекундах (CX - старшая часть)
AL = 1: отменить ожидание события.
Используйте данную функцию, а в основной программе проверяйте установление флага. И если установлен, то его сбрасываем и выполняйте вашу подпрограмму, иначе опять проверять.
-
- Сообщения: 270
- Зарегистрирован: 09 янв 2010, 04:14
- Контактная информация:
Думаю из примера все будет понятно
Код: Выделить всё
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 есть "свободные" подфункции, которые можно перепрограммировать. Ни могли бы Вы подсказать их номера и написать, как это можно сделать(мне в голову пришла хорошая идея)? Я хочу назначить одно из таких прерываний на выполнение моей процедуры.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
-
- Сообщения: 270
- Зарегистрирован: 09 янв 2010, 04:14
- Контактная информация:
Ну если приблизительно ясно, то сидим и разбираем мой пример. А по поводу функции 83h я дал достаточно полное описание. И там явно сказано что AL=0 - устанавливаем таймер, AL=1 - отменить ожидание таймера! А пр всякие свободные функции прерывания 15h ничего не слышал.
Поэтому источник информации в студию про свободные функции.
И когда вы научитесь пользоваться справочниками, там все предельно ясно написано... и прерывания и функции и вся ебениматика.
Поэтому источник информации в студию про свободные функции.
И когда вы научитесь пользоваться справочниками, там все предельно ясно написано... и прерывания и функции и вся ебениматика.