mikro sekund opóźnienia w C

H

hameeds01

Guest
im doing programowania w C i im za pomocą portu równoległego do mojego projektu,
Co to jest polecenie za udzielenie zwłoki w mikro sekund

sleep (x) x w sekundach
opóźnienia (x) x w sekundach milli

co ?????????? mikro sekund

 
Cześć, Jeden trick, że zawsze wykorzystywane w przeszłości był następujący:

Wykonaj obojętne dalsze operacje na Parallelport rejestru (jak czytanie stan wejścia do portu) to daje około 0,5 nami - 2us zwłoki.w zależności od platformy i wiek danej platformy.

więc jeśli potrzebujesz 100us opóźnienia do 200 manekina czyta!.

pozdrowienia,

Pawła.

PS: Mówię o rzeczywisty dostęp do drukarki za pośrednictwem portu NIE Driver Windows!.

 
Cześć

Problem ten sposób procesor spędzić czas bez pracy.
jeżeli licznik i można je policzyć i przerywaj mi na koniec periode?

dzięki

 
Cześć,

ten mały okresów nie jest wothy korzystać interruts.najbardziej można użyć to wielowątkowy wniosku o czasy większy niż kilka milisekund.Dla mniejszych czasy próby użycia QueryPerformanceFreqency i funkcje QueryPerformanceCounter.

 
Cześć,

Myślę, że najlepszym sposobem na wyszukiwanie netto kod timer z mikro sekund dokładność, oraz wykorzystanie go w kodzie z zajęty algorytm czekać.

Pozdrowienia,
Shohdy

 
Cześć tu jakiś kod, który działa na każdej platformie PC.Oprogramowanie zostało napisane przeze mnie kilka lat temu i zastosowań wewnętrznych wygenerowany sygnał czasu znaleźć na każdym PC kod jest inline asm na C. To działa tylko na Windows, jeśli mają bezpośredniego dostępu do tego sprzętu.Sygnał czasu jest 15US impulsów.

pozdrowienia,

Pawła.
Przepraszamy, ale musisz się zalogować, aby wyświetlić ten załącznik

 
Hellom,
I wykorzystał je, aby uzyskać mikrosekund opóźnienia

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

Klasa Delay
(
publicznych:
Delay ();
~ Delay ();
static void delaySeconds (float sekund);
static void delayMiliSeconds (float milisekund);
static void delayMicroSeconds (float mikrosekund);
);

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

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

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

Delay: Delay ()
(

)
Opóźnienie: ~ Delay ()
(

)

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

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

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

timeEllapsed = timeStart;

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

);
)

void Delay: delayMiliSeconds (float milisekund)
(
__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 mikrosekund)
(
__int64 timeEllapsed;
__int64 timeStart;
__int64 timeDelta;

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

__int64 timeToWait = (double) timeDelta * (double) mikrosekund / 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.

Ostatni post przez bilgekaan
jest właściwy sposób to zrobić na platformie Windows.Używa wewnętrznego 64 licznik na Pentium że przyrosty w jednym cyklu zegara.Jeśli używasz Win Api wzywa VB musisz użyć dziesiętny typ danych, gdyż jest 64 bitowa liczba całkowita typu.Na platformie 266 Mhz mógłbym dostać 3 nami rozdzielczości co dwa kolejne połączenia z QueryPerformanceCounter () rutynowe.Trzeba pamiętać, że program może być Odszedł na kilka milisekund w środowisku wielozadaniowym i ciężkich dostęp HD może wnieść swój program zniknie z dnia na 10 milisekund, więc być tego świadomi.

 
Cześć,
Nigdy nie należy spodziewać się opóźnień być doskonały.Opóźnienia grzywny mikrosekund jest difficault do osiągnięcia.Może być można użyć gettimeofday ().To alleast zwraca czas w mikrosekund.Montaż za pomocą kodu (np. obwodów niektórych portów) daje mniejsze opóźnienia.Więc może należy połączyć assebly kod i gettimeofday () w celu sprawdzenia, czy niezbędny czas snu jest powyżej lub nie.Jestem w stanie to zrobić w Linuksie.

 
hey lousinells

Nie jestem w stanie znaleźć gettimeofday () funkcja

kulisy u pls powiedz mi co nagłówek pliku zawiera?

 
Cześć,
Upewnij się, czy nagłówki są dostępne w danej platformy.Uczyniłem to na platformie Linux (Debian Sarge 3.1r2).

Kod:# 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);

 
Co o prędkości procesora, przyzwyczajenie to zrobić dużo różnica w mikrosekund, a to jest wystarczająco dobre dla stosowania w czasie rzeczywistym.

 
Tak naprawdę nie robią dokładnie zwłoki.jesteśmy tylko co mniejsze opóźnienia, z niektórych instrukcji montażu i utrzymywania na sprawdzeniu, czy wymagane jest przez okres opóźnienia lub nie w pętli.W normalnej prędkości procesora do uczciwej pracy, bo to instrukcje montażu może opóźnienia rzędu kilku mikro sekund.Tak to powinno działać.
mehboob_iiui napisał:

Co o prędkości procesora, przyzwyczajenie to zrobić dużo różnica w mikrosekund, a to jest wystarczająco dobre dla stosowania w czasie rzeczywistym.
 

Welcome to EDABoard.com

Sponsor

Back
Top