Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Медленная работа DOS на современных компьютерах


Автор: Zavlab 2.2.2006, 14:18
Здравствуйте.
Решил я систему передачи сделать по своей квартире на основе LPT-порта.
Задача рубится на корню, когда я тестовым способом обнаружил очень низкую скорость работы программы. За 55мс обычный счетчик успевает досчитать до 30000 (счетная частота при этом составляет 540кГц), а если с выводом на LPT, то частота падает в 2 раза: счетчик досчитавает до 15000, что есть эквивалентом 270кГц на выходе порта.
Программу упростил до предела, но чуда не стало. Ниже ее исходник
Код

{$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.


Суть: идет циклический счет (переменная 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 работает низкочастотный блок. (Где бы там перемычку передвинуть). Этот ответ всего лишь версия.
Жду Ваших мнений...

Автор: Romikgy 2.2.2006, 14:50
Сабж здесь не причем, при быстром проце и дос летает, а вот работа с лпт портом, у тя слишком простая, есть спец режимы параллельного порта , где скорости достигаются вполне нормальные, а что касается сабжа, то в досе проц работает в реальном режиме, получается, точно не вспомню, толи 286 толи 186 проц но с тактовой, твоего проца, а винда переводит проц в защищенный режим, и там уже своя петрушка

Автор: Snowy 2.2.2006, 14:51
http://www.piafi.ru/library/timeslc.zip поможет.

Автор: armageddon 2.2.2006, 19:02
скорей сего проблема не в проге, а в самом соеденении

Автор: Zavlab 4.2.2006, 10:28
Дорогие Romikgy, Snowy, armageddon обращу Ваше внимание на свою цитату
Цитата

За 55мс обычный счетчик успевает досчитать до 30000 (счетная частота при этом составляет 540кГц), а если с выводом на LPT...

Я думаю, что если бы "обычный счетчик " успевал бы досчитать до 5 миллиардов (или больше), то вопрос был бы к LPT, а так к (?!) к процессору. Сообщу также, что медленная работа замечена и у других программ (Volkov, sirena и моих разработок использующих процедуру delay (хоть свою пиши)).
По поводу других режимов LPT - тоже интересно.
http://www.piafi.ru/library/timeslc.zip уникальная разработка, но в данном случае задача как раз наоборот.
Получаю знания . . .

Автор: Snowy 4.2.2006, 16:49
delay всегда была глючной.
Она никак не зависит от времени.
На разных компьютерах дает совершенно разные интервалы.
Попробуй найти в сети альтернативный модуль Crt.
Хотя для DOS нет универсального решения без перепрограммирования таймера.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)