Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 21:51

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Für 1-2 Mikrosekunden pausieren

Discussion on Für 1-2 Mikrosekunden pausieren within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
Für 1-2 Mikrosekunden pausieren

Hi,

ich möchte einen Emulator für einen Mikrocontroller programmieren.

Der Takt des Controllers liegt bei einem Megaherz und die meisten Instructions brauchen ein oder zwei Maschinenzyklen, d.h. ein oder zwei Mikrosekunden.

Dafür ist mein PC zu schnell - Wie bekomme ich es hin, grob die gleiche Geschwindigkeit wie die des Controllers zu erreichen?
Die Zeit, die der Emulator für die Instruction an sich braucht, ist denke ich vernachlässigbar.

Kann ich das Programm irgendwie über ungefähr diese Zeit pausieren lassen?
Ich nutze Windows und finde kein Adäquat zu nanosleep / usleep. Aber auch wenn es das gibt, habe ich gelesen, dass solche Timer bei so kurzen Zeiten sehr ungenau sind.
dowhile is offline  
Old 07/17/2013, 15:31   #2
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Dr. Coxxy is offline  
Old 07/17/2013, 15:59   #3

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
std::this_thread::sleep_for(std::chrono::microseco nds(1)); schon probiert? Ich weiß nicht mehr, woher ich es habe, aber ich habe gelesen, dass es im Gegensatz zu Sleep() recht präzise sein soll.
snow is offline  
Old 07/17/2013, 16:08   #4
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
So eine Genauigkeit kannst du afaik vergessen. Für einen Emulator reicht es doch oft, einfach durchzusteppen bzw. sowieso schneller laufen zu lassen.


Gruß
Schlüsselbein is offline  
Old 07/17/2013, 17:05   #5
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
das was schlüsselbein gesagt hat, normalerweise sollte man kein realtime brauchen.

hab das hier eben zusammengecodet, ka ob das so wirklich läuft:
Code:
class FakeSleeper
{
private:
public:
	LARGE_INTEGER Frequency;
	LARGE_INTEGER NeededSteps;
private:
public:
	bool Init();
	void SetSleepTime(UINT NumberOfMicroSeconds);
	void FakeSleep();
};

bool FakeSleeper::Init()
{
	if (QueryPerformanceFrequency(&Frequency)) // PerfomanceCounter supported?
	{
		if (Frequency.QuadPart > 1000000) // Frequency high enough to get diffs ~ 1µSecond?
		{
			return true;
		}
	}
	return false;
}

void FakeSleeper::SetSleepTime( UINT NumberOfMicroSeconds )
{
	NeededSteps.QuadPart = Frequency.QuadPart/(1000000/NumberOfMicroSeconds);
}

void FakeSleeper::FakeSleep()
{
	LARGE_INTEGER A;
	QueryPerformanceCounter(&A);
	LARGE_INTEGER B;
	B.QuadPart = A.QuadPart;
	while (B.QuadPart - A.QuadPart < NeededSteps.QuadPart)
	{
		QueryPerformanceCounter(&B);
	}
}
erzeugt bei mir mit werten >= 3mikrosekunden akzeptable ergebnisse mit folgendem code:
Code:
	FakeSleeper Test;

	if (!Test.Init())
	{
		printf("FAIL!\n");
	}
	else
	{
		Test.SetSleepTime(3);
		printf("Testing now:\n");
		LARGE_INTEGER A;
		LARGE_INTEGER B;
		LARGE_INTEGER D;
		LARGE_INTEGER F;
		double Seconds;
		QueryPerformanceFrequency(&F);
		for (UINT i = 0; i < 20; i++)
		{
			QueryPerformanceCounter(&A);
			Test.FakeSleep();
			QueryPerformanceCounter(&B);
			D.QuadPart = B.QuadPart - A.QuadPart;
			Seconds = (1.0/F.QuadPart)*D.QuadPart;
			printf("Time Needed: %.012f\n", Seconds);
		}
	}
eben so hingerotzt, keine garantie für fehler.

EDIT1:
berücksichtigt btw. nicht die zeit für den funktionsaufruf, den check und den return, kann also kumultativ zu ner recht hohen fehlermarge führen.

EDIT2:
und da du kein "echtes" sleep mehr hast wird dir das teil nen cpu kern voll auslasten
Dr. Coxxy is offline  
Reply


Similar Threads Similar Threads
[Suggestion] Premium Status pausieren.
07/12/2013 - Suggestions & Feedback - 19 Replies
Hallo :D Nachdem ich vor habe mir Premium zu holen sobald ich 1000eG habe ich nun eine Idee. Ich fahre den ganzen August weg und bin somit nicht auf epvp. Wäre es möglich in diesem Zeitraum (wenn ich Premium habe)die Laufzeit zu pausieren? Wäre praktisch weil ich kann es ja in diesem Zeitraum nicht nutzen. Was ist eure Meinung(Verbesserungsvorschläge) dazu? Schreibt's unten rein :)
gui pausieren und beenden
11/12/2012 - AutoIt - 4 Replies
gibt es eine einfache möglichkeit ein script mit einer gui zu pausieren, dass ich im prinzip im code durch einen buttonclick stoppe und durch den gleichen wieder weitermachen kann? oftmals ist mein script außerdem in irgendeiner schleife. deshalb kann ich es auch nicht immer durch Case $msg = $GUI_EVENT_CLOSE $pause = True Exit beenden. kann mir da auch wer nen tip geben? ich wäre euch sehr sehr dankbar, wenn ihr mir bei meinen autoit-problemen helfen könntet xD vielen dank...
[PROBLEM] Script pausieren/schließen
10/03/2010 - AutoIt - 9 Replies
Hey User, ich habe ein kleines Script geschrieben: #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GuiconstantsEx.au3> #include <Misc.au3> #Region ### START Koda GUI section ### Form=C:\Users\Alex\GUI\Form1.kxf $Form1 = GUICreate("Made by 18alex03", 228, 81, 208, 125)
D2NT Pausieren lassen mit Mac Tastatur
07/16/2010 - Diablo 2 - 7 Replies
Hi, wie kann ich den D2NT Bot pausieren lassen, wenn ich eine MacBook Tastatur benutzte. Die Pause Taste gibts nämlich nicht. Ich spiele Diablo über Bootcamp. Vielleicht kann man auch die Tastenbelegung des Bots ändern..?!? gruß
Pausieren
07/15/2010 - AutoIt - 18 Replies
wie kann ich einen spambot usw. pausieren, wenn ich einen button drück? was für ne funktion brauch ich da? THX im vorraus MFG xEr0r :mofo:



All times are GMT +2. The time now is 21:51.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.