![]() |
Медленное выполнение DOS программ
Здравствуйте.
Решил я систему передачи сделать по своей квартире на основе LPT-порта. Задача рубится на корню, когда я тестовым способом обнаружил очень низкую скорость работы программы. За 55мс обычный счетчик успевает досчитать до 30000 (счетная частота при этом составляет 540кГц), а если с выводом на LPT, то частота падает в 2 раза: счетчик досчитавает до 15000, что есть эквивалентом 270кГц на выходе порта. Программу упростил до предела, но чуда не стало. Ниже ее исходник <CODE> {$O+,F+} Program OutInterruptToLPT; Uses Graph, Dos, Crt; var b:byte; L,ck,w,i,j,deL:LongInt;{-2147483648..2147483647} l_Const,k_Port:Real; mx,my,mButton,X,Y1,Y2,Gd,Gm:integer; OldInterrupt:Pointer; reg: registers; S10:string[10]; bt:boolean; Procedure Mouse(VAR mx,my,mButton:integer); begin mbutton:=0; reg.ax:=3; intr ($33,reg); mx:=reg.cx; my:=reg.dx; mbutton:=reg.bx; end; Procedure Control; interrupt; Begin { mouse (mx,my,mButton);} deL:=(deL +L) div 2; L:=0; l_Const:=0.055/deL; {sec} k_Port:=1 if bt AND (mButton>0) then begin got0XY(2,2); writeln('del ',del); WriteLn('l_Const ',l_Const); WriteLn('k_Port ',k_Port); end; bt:=Not (mButton>0); END; {control} BEGIN x:=256; del:=0; w:=0; ck:=0; L:=0; clrscr; WriteLn('Runing'); mx:=256; { reg.ax:=1; intr ($33,reg);} GetIntVec ($1C,OldInterrupt); SetIntVec ($1C,@Control); repeat inc (L); {R-} inc(ck); if ck>=k_Port then begin ck:=0; inc (b); port[$378]:=b; end; {R+} until keypressed; SetIntVec ($1C,OldInterrupt); END. </Code> Суть: идет циклический счет (переменная L) от 0 до победного, когда-нибудь возникает прерывание с интервалом 55мс или 0,055с в котором значение L выводится на экран и L:=0. За каждый проход цикла Repeat Until в порт LPT[$378] выводится число b (локальный счетчик). Переменная del содержит среднее количество до которого успевается возвыситься L. Переменная l_Const содержит время в секундах за которое происходит 1 проход цикла. (процедуры mouse отключены) Среда Windows98 без графической оболочки, загружается с дискетки, Среда разработки Turbo Pascal 7.0 Оборудование Atlon 1900+, частота шины 333МГц. Подозрения: проблема аппаратная, специально для DOSa & K работает низкочастотный блок. (Где бы там перемычку передвинуть). Этот ответ всего лишь версия. Жду Ваших мнений... |
Есть версия, что твой способ подсчета цикла не слишком быстрый.
Если хочешь так хитро считать, то выводи прямым обращением к видео памяти. Хотя как по мне лучше определить время за которое скажем выполнится 100000 записей в порт. Чем кол-во записей за 1 сек. P.S. Ты засеки время выполнения следующего фрагмента for i:=1 to 100000 do WriteLn('string'); Я не проверял, лень перегружаться под ДОС, но на вскидку думаю сек 10. Это нормально. Так работает вывод в ДОС, да и в консоле Винды тоже |
чего то у тебя там как то хитро сделано
а зачем ты мышиное прерывание используеш? вкратце опиши суть твоей программки и дело тут имхо не в выводе в консоль |
| Часовой пояс GMT +4, время: 17:30. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.