|
|
| Посл.отвђт | Сообщен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 |