· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› задержка в микросекундах.(?)

Посл.отвђт Сообщенiе


Дата: Июл 7, 2003 14:48:50

люди , так как же организовать задержку с точностью , скажем, в 10 микросекунд?(не мили!)
я нашёл по этому поводу только одну процедуру:
====================
mov ax,86h
mov dx,word ptr del
mov cx,word ptr del+2
int 15h
====================
но,во-первых,также наталкивался на сведения типа : но генерация происходит с погрешностью до ~978 мс так что задержку менее чем 1024 мс нет смысла организовывать...
и,во-вторых, я не знаю как настроить регистры входа.(CX и DX)вот например ,как будут выглядеть записи в этих регистрах для значения задержки а 10 мс?
или прошу подсказать другую процедуру.
Заранее спасибо!


Дата: Июл 7, 2003 16:03:07

В досе или в вин ? В досе можно перстроить таймер на другую частоту (у Зубкова пример со звуком вроде есть). Стандартный хэндлер звать с прежней частотой.

Приходит в голову сделать эталонный код, который выполняется за некое заданное время. Например, берем простую реализацию:

; В стеке слово - величина задержки
MyDelay proc near
push bp
mov bp,sp
push cx
mov cx,[bp+4]
@@Delay: loop @@Delay
pop cx
pop bp
retn 2

Пусть мы можем мерить время с точностью 1 сек. Тогда делаем, скажем, 1000 вызовов процедуры Delay с неким заданным StartDelay

StartDelay dw 1000
...
call GetTime
; Save time start
mov cx,1000
@@CallDelayProc:
push StartDelay
call MyDelay
loop @@CallDelayProc
call GetTime
; Save End time

Допустим, получилось 5 секунд. Значит, грубо, наш цикл исполняется за 5 сек / 1000 = 0,005 сек. Значит, теоретически уменьшение StartDelay
в 100 раз даст задержку в 0,00005 = 50 мкс. Вот тебе эталон. Если получается не 5 секунд, а 2, то параметр StartDelay уже в 2,5 раза больше должен быть...

Конечно, loop лучше не использовать - его может проглотить конвеер и т.п. Лучше брать команды, которые 100% не допускают оптимизации на уровне конвеера - типа call far, видимо...

Айс может мерять примерно ~60мкс (win98). Значит, можешь и ты...


Дата: Июл 7, 2003 21:12:06

Можно использовать функцию QueryPerformanceCounter. Этот счётчик даёт более 1 импульса в 1 микросек. в зависимости от ОС.


Дата: Июл 7, 2003 21:29:43

могу дать примерчик для доса,
хотя он для паузы >=1 мс (погрешность 0.180 мс)
для 1 мкс можно попробовать изменить значение
1193 на 1, правда погрешность будет составлять
0.193 мкс.

Delay proc near
mov ecx,time ;<-сюда время
Delay_01:
or ecx,ecx
jz Delay_exit
call GetValTimer ;\
mov edx,eax ;|
Delay_One: ;|
call GetValTimer ;|Задержка в 1мс
sub eax,edx ;|
cmp eax,1193*2 ;|
jb Delay_One ;/
dec ecx
jmp Delay_01
Delay_exit:
ret
GetValTimer proc near
xor al,al
out 43h,al
in al,40h
mov ah,al
in al,40h
xchg ah,al
neg ax
movsx eax,ax
ret
GetValTimer endp
Delay endp


Дата: Июл 12, 2003 02:11:12

можно использовать rdtsc и посчитать кол-во тактов проца на 1мс. Потом разделить это на 1000 и получиться такты проца на 1мкс


Дата: Июл 13, 2003 04:29:53

ife @32Bit
_16Bit equ 1
else
_32Bit equ 1
endif

ifndef _32Bit
_cx equ <cx>
_dx equ <dx>
_bx equ <bx>
_ax equ <ax>
_si equ <si>
_di equ <di>
_bp equ <bp>
_sp equ <sp>
else
_cx equ <ecx>
_dx equ <edx>
_bx equ <ebx>
_ax equ <eax>
_si equ <esi>
_di equ <edi>
_bp equ <ebp>
_sp equ <esp>
endif
;--------------------------------------------------------------------- -------¬
;¦ Подпрограмма ожидания события ¦
;¦ Вход: mov ecx, ... ; сетчик в единицах по 15 мксек ¦
;¦ call WaitForEvent ¦
;¦ ... ; код проверки условия ¦
;¦ retn ; ZF = 1 условие выполнено ¦
;¦ Выход: ZF=0 если условие выполнилось пока счетчик не обнулился ¦
;¦ ZF=1 если обнулился счетчик ¦
;L-------------------------------------------------------------------- --------

Pause15: call WaitForEvent
jmp short WFELabel2
WaitForFDDEvent: mov ecx,333333
WaitForEvent: pop _bx
mov ah,10h
WFELabel1: call _bx
jz WFELabel2 ;дождались
in al,61h
and al,10h
xor al,ah
jnz WFELabel1
xor ah,10h
ifndef _32Bit
db 67h
endif
loop WFELabel1

WFELabel2: or ecx,ecx
retn


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.128