Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

TTimeStamp, TTime, ...

[es] :: Pascal / Delphi / Kylix :: TTimeStamp, TTime, ...

[ Pregleda: 2405 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

badam

Član broj: 78553
Poruke: 97
62.108.111.*



+2 Profil

icon TTimeStamp, TTime, ...22.05.2006. u 15:10 - pre 218 meseci
Koristim komponentu TVicLpt v1.3 koja ima event:
Code:

procedure TForm1.VicLPT1LptInterrupt(DataPort, StatusPort: Byte;
  TimeStampLo, TimeStampHi: Cardinal);
begin

end;

U helpu komponente, procedura je opisana:
Citat:

Parameters:

DataPort - single byte value read from LPT data port
StatusPort - single byte value read from LPT status port
TimeStampLo - low part of time stamp (see QueryPerformanceCounter API function)
TimeStampHi - high part of time stamp

Remarks:

1. DataPort and StatusPort value was read immediately when a hardware interrupt occurs inside of the driver;
2. TimeStampLo, TimeStampHi - timestamp shows when a hardware interrupt occurs in the driver, created with RDTSC assembler instruction.
3. Just double-click at TVicLPT icon on the form to install the interrupt handler.

Meni je potrebno vreme tipa TTimeStamp ili TTime. Ima li neko ideju kako da TimeStampLo i TimeStampHi prevedem u neki drugi tip?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: TTimeStamp, TTime, ...22.05.2006. u 16:35 - pre 218 meseci
Koliko vidim to je trenutak kada se dogodio interrupt gledano u ciklusima procesora, isto ono što vraća i QueryPerformanceCounter funkcija samo razbijena na dva dela. Te delove možeš spojiti otprilike ovako:

Code:

var
  Temp: Int64;
begin
  LARGE_INTEGER(Temp).LowPart := TimeStampLo;
  LARGE_INTEGER(Temp).HighPart := TimeStampHi;
end;


Šta dalje sa tom vrednošću zavisi šta želiš, primera radi ako tražiš vreme koje je proteklo između dva interapta, možeš uraditi sledeće:

Code:

var
  t2, t1, freq: Int64; 
begin
  t1 := // vreme iz prvog interapta spojeno na gore opisani način
  t2 := // vreme iz drugog interapta 
   
  QueryPerformanceFrequency(freq);
  Result := (t2 - t1) / freq;
end;


 
Odgovor na temu

badam

Član broj: 78553
Poruke: 97
62.108.111.*



+2 Profil

icon Re: TTimeStamp, TTime, ...22.05.2006. u 17:02 - pre 218 meseci
Hvala puno, radi pos'o. Jos jedno pitanje: Da li je rezultat funkcije QueryPerformanceFrequency konstantan u nekom domenu (domenu racunara)? Odnosno, mogu li pri kreiranju glavne forme uzeti vrednost u neku promenljivu, da ne pozivam funkciju pri svakom interaptu?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: TTimeStamp, TTime, ...22.05.2006. u 23:30 - pre 218 meseci
Vrednost je garantovana dok je računar uključen, posle restarta/shutdowna se može promeniti. Dakle slobodno možeš inicijalizovati neku promenljivu na početku rada programa i dalje je koristiti kada zatreba.
 
Odgovor na temu

badam

Član broj: 78553
Poruke: 97
62.108.117.*



+2 Profil

icon Re: TTimeStamp, TTime, ...25.05.2006. u 16:33 - pre 217 meseci
Opet problem.

Pri izvrsenju koda:

Code:

procedure TGlavna.VicLPT1LptInterrupt(DataPort, StatusPort: Byte;
  TimeStampLo, TimeStampHi: Cardinal);
var i,j,k:Int64;
begin
  QueryPerformanceCounter(j);
  QueryPerformanceFrequency(k);
  Large_Integer(i).LowPart:=TimeStampLo;
  Large_Integer(i).HighPart:=TimeStampHi;
  Memo1.Lines.Append(IntToStr(j)+'  '+IntToStr(i)+' '+IntToStr(k));


rezultat u memo1 bio je:

Code:

73632997332  34565325050265 3579545
73636556977  34566994522265 3579545
73639627592  34568434639415 3579545
73675046698  34585046201865 3579545
73678440259  34586637784165 3579545
73680258297  34587490443815 3579545
73691390162  34592711281515 3579545
73696302988  34595015403415 3579545
73701327123  34597371713115 3579545
73715025176  34603796106265 3579545
73715245618  34603899493928 3579545
73720695529  34606455503490 3579545


Problem:

1. i 2. kolona se razlikuju, a ne bi trebalo (ne tako mnogo).
Postoji li nacin da ih uskladim posto moram da koristim i jednu i drugu vrednost - TimeStamp komponente je merodavan posto daje tacno vreme kada se interapt desio, a ne kada je obradjen, a sa druge strane, bitan je i preview vremena koje je proslo nakon poslednjeg interapta (znaci, u timeru trenutno oduzimam babe i zabe). Valjda sam bio jasan.
Ajd, savkicu zablistaj jos jednom i imas pivo.


Edit: Zaboravih da kazem, a mozda pomogne:

Citat:

Code:


var
  t2, t1, freq: Int64; 
begin
  t1 := // vreme iz prvog interapta spojeno na gore opisani način
  t2 := // vreme iz drugog interapta 
   
  QueryPerformanceFrequency(freq);
  Result := (t2 - t1) / freq;
end;



Ovaj kod daje Razliku u necemu sto nisu sekunde (>400 puta manji interval), dok kod sa QueryPerformanceCounter()/QueryPerformanceFrequency() daje sekunde.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: TTimeStamp, TTime, ...27.05.2006. u 01:12 - pre 217 meseci
> Problem:

> 1. i 2. kolona se razlikuju, a ne bi trebalo (ne tako mnogo).
> Postoji li nacin da ih uskladim posto moram da koristim i jednu i drugu vrednost - TimeStamp komponente je merodavan posto daje tacno vreme kada se interapt > desio, a ne kada je obradjen, a sa druge strane, bitan je i preview vremena koje je proslo nakon poslednjeg interapta (znaci, u timeru trenutno oduzimam babe i > zabe). Valjda sam bio jasan.

Hm, da. Ta komponenta koristi procesorski timer a QueryPerformanceCounter koristi uglavnom ACPI counter tako da se i ne mogu direktno porediti vrednosti. Ono što možeš raditi je i da ti pređeš na procesorski timer. Kod bi išao ovako:

Code:

function RDTSC: Int64; assembler;
asm
  DB $0F,$31
end;

function GetCyclesPerMS: Int64;
var
  a, b, c: int64;
begin
  QueryPerformanceFrequency(a);
  QueryPerformanceCounter(b);
  a := b + a div 10;
  c := RDTSC;

  repeat
    QueryPerformanceCounter(b);
  until (b >= a);

  Result := (RDTSC - c) div 100;
end;

var
  t1, t2: Int64;
begin
  t1 := // Vreme iz interrupt rutine
  t2 := RTSC;

  Result := (t2 - t1) / GetCyclesPerMS; // Vreme u MS
end;

 
Odgovor na temu

badam

Član broj: 78553
Poruke: 97
62.108.111.*



+2 Profil

icon Re: TTimeStamp, TTime, ...17.06.2006. u 17:05 - pre 217 meseci
Opet ja. Nisam pre stigao da se pozabavim sa problemom.
Nisam siguran da je to bas ono sto mi treba (voleo bih da me neko razuveri).
Izjeda me crv: funkcija GetCyclesperMS vraca broj cycleova po ms u momentu kada se pozove (razlikuje se od momenta do momenta), a meni je potrebno u momentu interapta. Da li je, mozda, ta razlika zanemarljiva ili na vrednost umnogome utice zauzetost procesora.
Ajd pa fala opet.
Pozdrav
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: TTimeStamp, TTime, ...17.06.2006. u 20:56 - pre 217 meseci
Broj ciklusa zavisi od brzine procesora, a brzina procesora je fiksna (osim ako nije neki power saving režim), kada jednom dobiješ broj nema potrebe da ga ponovo tražiš. GetCyclesPerMS je primer kako možeš doći do približnog broja ciklusa za kratko vreme, za tačniji rezultat bi trebalo da meri čitavu sekundu i da se poveća prioritet threada. Ali nije obavezno da tako meriš broj ciklusa, možeš saznati brzinu procesora pa iz toga izvesti broj ciklusa.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: TTimeStamp, TTime, ...

[ Pregleda: 2405 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.