mikro sekunders forsinkelse i C

H

hameeds01

Guest
im gør programmering i C & im benytter Parallelport for mit projekt,
hvad er kommandoen for at give en forsinkelse i mikro sekunder

søvn (x), x i sekunder
forsinkelse (x), x i millisekunder

hvad med mikro sekunder ??????????

 
Hej, Et trick, som jeg altid brugt i fortiden var følgende:

Udfør dummy læse operationer på parallelport register (som at læse input tilstand af havnen), dette vil give dig omkring 0,5 os - 2us forsinkelse.afhængig af platform og alder af din platform.

så hvis du har brug 100us forsinkelse do 200 dummy læser!.

hilsen,

Paul.

PS: Jeg taler om en reel adgang til printerporten ikke via en Windows-driver!.

 
Hej

problemet med denne metode processoren tilbringe tid uden nogen form for operation.
hvis der counter jeg kan gøre det tælle og afbryde mig i slutningen af den periode?

tak

 
Hej,

for denne lille perioder er det ikke wothy at bruge interruts.det højeste, du kan bruge er en flertrådede ansøgning om tider, der er større end et par millisekunder.Til mindre tider, der forsøger at anvende QueryPerformanceFreqency og QueryPerformanceCounter funktioner.

 
Hej,

Jeg tror, den bedste måde at søge på nettet efter en timer kode med mikro sekund nøjagtighed, og bruge det i din kode med en travl vente algoritme.

Hilsen,
Shohdy

 
Hej Her er noget kode, som virker på alle PC-platformen.Den software, er skrevet af mig for nogle år siden, og benytter en intern genereret timing signal findes på alle pc'er Koden er i inline ASM til C. Det virker kun på Windows, hvis du har direkte adgang til hardwaren.Timingen signalet er 15us impulser.

hilsen,

Paul.
Beklager, men du skal logge ind for at se denne vedhæftede fil

 
Hellom,
Jeg brugte disse til at få mikrosekund forsinkelser

/***************************** Delay.h ***************** /
# ifndef __DELAY_H__
# define __DELAY_H__

klasse Delay
(
public:
Delay ();
~ Delay ();
static void delaySeconds (float sekunder);
static void delayMiliSeconds (float miliseconds);
static void delayMicroSeconds (float mikrosekunder);
);

# endif
/************************************************* **********/

/************************************ Delay.cpp ********** ******/

# include "stdafx.h"
# include "delay.h"

Delay:: Delay ()
(

)
Delay:: ~ Delay ()
(

)

void Delay:: delaySeconds (float sekunder)
(
__int64 timeEllapsed;
__int64 timeStart;
__int64 timeDelta;

QueryPerformanceFrequency ((LARGE_INTEGER *) (& timeDelta));
QueryPerformanceCounter ((LARGE_INTEGER *) (& timeStart));

__int64 timeToWait = (double) timeDelta * (double) sekunder;

timeEllapsed = timeStart;

while ((timeEllapsed - timeStart) <timeToWait)
(
QueryPerformanceCounter ((LARGE_INTEGER *) (& timeEllapsed));

);
)

void Delay:: delayMiliSeconds (float miliseconds)
(
__int64 timeEllapsed;
__int64 timeStart;
__int64 timeDelta;

QueryPerformanceFrequency ((LARGE_INTEGER *) (& timeDelta));

__int64 timeToWait = (double) timeDelta * (double) miliseconds/1000.0f;

QueryPerformanceCounter ((LARGE_INTEGER *) (& timeStart));

timeEllapsed = timeStart;

while ((timeEllapsed - timeStart) <timeToWait)
(
QueryPerformanceCounter ((LARGE_INTEGER *) (& timeEllapsed));

);
)

void Delay:: delayMicroSeconds (float mikrosekunder)
(
__int64 timeEllapsed;
__int64 timeStart;
__int64 timeDelta;

QueryPerformanceFrequency ((LARGE_INTEGER *) (& timeDelta));

__int64 timeToWait = (double) timeDelta * (double) mikrosekunder / 1000000.0f;

QueryPerformanceCounter ((LARGE_INTEGER *) (& timeStart));

timeEllapsed = timeStart;

while ((timeEllapsed - timeStart) <timeToWait)
(
QueryPerformanceCounter ((LARGE_INTEGER *) (& timeEllapsed));

);
)

 
is the proper way to do it on a Windows platform.

Det sidste indlæg af bilgekaan
er den rigtige måde at gøre det på en Windows platform.Det bruger de interne 64 tælleren til Pentium, at stigninger af en hver taktcyklus.Hvis du bruger Win API-kald i VB du nødt til at bruge den decimal datatype, da det er et 64 bit heltal type.På en 266 Mhz platform, jeg kunne få en 3 os beslutning at to på hinanden følgende opkald til QueryPerformanceCounter () rutine.Du skal huske på, at dit program kan være væk i flere millisekunder i et multitasking-miljø, og tunge HD-adgang kan gøre dit program forsvinde for 10's af millisekunder, så vær opmærksom på dette.

 
Hej,
Aldrig forvente forsinkelser at være perfekt.Forsinkelser så fine som mikrosekunder er difficault at opnå.Kan være du kan bruge gettimeofday ().Det alleast returnerer tid i mikrosekunder.Brug af montage-kode (som afstemningssteder nogle havne), vil give mindre forsinkelser.Så kan du bør kombinere assebly kode og en gettimeofday () opfordring til at kontrollere, om den nødvendige søvn tid er forbi eller ej.Jeg er i stand til at gøre det i Linux.

 
hey lousinells

jeg er ikke i stand til at finde gettimeofday () funktion

kunne u pls afgøre mig der header fil til at omfatte?

 
Hej,
Vær sikker på, om disse overskrifter er tilgængelige i din platform.Jeg har gjort det i Linux-platform (Debian Sarge 3.1r2).

Kode:# include <sys/time.h>

# include <time.h>int gettimeofday (struct timeval * tv, struct timezone * tz);

int settimeofday (const struct timeval * TV, const struct timezone * tz);

 
hvad med CPU-hastigheder, plejer det gøre en stor forskel i mikrosekunder, og er det godt nok til tidstro anvendelse.

 
Faktisk er vi ikke gør en præcis forsinkelse.vi er bare gør en mindre forsinkelse med nogle Monteringsvejledningen og holde-om at kontrollere, om den krævede forsinkelse er udløbet eller ikke i en løkke.I en normal CPU med rimelig hastighed vil dette arbejde, fordi monteringsvejledning kan gøre forsinkelser i størrelsesordenen få mikro-sekunder.Så dette bør arbejde.
mehboob_iiui skrev:

hvad med CPU-hastigheder, plejer det gøre en stor forskel i mikrosekunder, og er det godt nok til tidstro anvendelse.
 

Welcome to EDABoard.com

Sponsor

Back
Top