imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 02.02.2006, 14:43     # 1
Vlad_Vl
Guest
 
Сообщения: n/a

Angry Медленное выполнение 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 работает низкочастотный блок. (Где бы там перемычку передвинуть). Этот ответ всего лишь версия.
Жду Ваших мнений...
 
Старый 03.02.2006, 02:33     # 2
Willow
Junior Member
 
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118

Willow Реально крут(а)Willow Реально крут(а)Willow Реально крут(а)Willow Реально крут(а)
Есть версия, что твой способ подсчета цикла не слишком быстрый.
Если хочешь так хитро считать, то выводи прямым обращением к видео памяти. Хотя как по мне лучше определить время за которое скажем выполнится 100000 записей в порт. Чем кол-во записей за 1 сек.

P.S.
Ты засеки время выполнения следующего фрагмента

for i:=1 to 100000 do WriteLn('string');

Я не проверял, лень перегружаться под ДОС, но на вскидку думаю сек 10. Это нормально. Так работает вывод в ДОС, да и в консоле Винды тоже

Последний раз редактировалось Willow; 03.02.2006 в 02:41.
Willow вне форума  
Старый 07.02.2006, 04:53     # 3
iam_xor
Junior Member
 
Аватар для iam_xor
 
Регистрация: 08.09.2004
Сообщения: 50

iam_xor Ушлепокiam_xor Ушлепок
чего то у тебя там как то хитро сделано
а зачем ты мышиное прерывание используеш?
вкратце опиши суть твоей программки

и дело тут имхо не в выводе в консоль
iam_xor вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 20:41.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.