Forum: PC-Programmierung Hilfe zu wait - Funktion


von X_Rider (Gast)


Lesenswert?

Hallo, ich möchte auf meinem Embedded-PC, auf dem ein 
Echtzeitbetriebssystem läuft, eine zusätzliche wait - Funktion 
realisieren.
1
void Wait(int MikroSec)
2
{
3
 int i=0,j=0; 
4
 for(i=0; i<(MikroSec * LOOPS_PER_MIKROSEC); i++)
5
  {
6
  j++;
7
  }
8
}

Das Problem ist hier, dass diese Funktion wegoptimiert wird.
Egal was ich dieser Funktion übergebe, es entsteht kein Warten.
Wie könnte ich dies in C realisieren, so dass die wait - Funktion nicht 
wegoptimiert wird? Das Echtzeitbetriebssystem benutzt unter anderem die 
windows.h und time.h

von Robert S. (razer) Benutzerseite


Lesenswert?

Gibt es Inline Assembler in deinem Compiler?
Dann könnntest du einen nop Befehl einfügen. Der wird nicht 
wegoptimiert.

von Rolf Magnus (Gast)


Lesenswert?

Alternativ den Schleifenzähler volatile definieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn Du ein Echtzeitbetriebssystem verwendest (welches?) dann wird 
dieses sicherlich auch eine eigene Wait-Funktion mit sich bringen, die 
statt Zeit sinnlos zu verbraten, diese anderen Prozessen/Threads 
zugutekommen lässt.
Auf Win32-artigen Betriebssstemen ist dies meistens die Funktion 
"Sleep".

Also: Welches Echtzeitbetriebssystem isses denn?

von X_Rider (Gast)


Lesenswert?

Als Betriebssoftware wird die ETS - TNT Embedded ToolSuite von PharLap 
eingesetzt. Diese ist ein 32 bit Real-Time Operating System (RTOS), das 
sich durch Unterstützung eines Teils der WIN32 API leicht in Windows 
Systeme integrieren lässt.

von X_Rider (Gast)


Lesenswert?

FÜr Testzwecke habe ich jetzt mal "volatile" benutzt. Siehe da, ich 
bekomme die entsprechende Verzögerung. Wenn ich eine Variable mit 
volatile deklariere, kostet dies jetzt zusätzlich Zeit?
1
void Wait(int MikroSec)
2
{
3
 volatile int i=0,j=0; 
4
 for(i=0; i<(MikroSec * LOOPS_PER_MIKROSEC); i++)
5
  {
6
  j++;
7
  }
8
}

von Christian R. (supachris)


Lesenswert?

Das "volatile" sagt dem Compiler nur, dass du genau weißt, was du mit 
der Variable machst, und er die als echte Variable im RAM ablegt und 
nicht in irgendeinem Arbeitsregister des Prozessors.

von Rolf Magnus (Gast)


Lesenswert?

>Wenn ich eine Variable mit volatile deklariere, kostet dies jetzt
> zusätzlich Zeit?

Ja. Aber wenn du eine genau vorgegebene Menge an Zeit pro 
Schleifendurchlauf haben willst, führt sowieso nichts an Assembler 
vorbei.

> und er die als echte Variable im RAM ablegt und
> nicht in irgendeinem Arbeitsregister des Prozessors.

Nicht nur das. Es sagt vor allem auch, daß der Zugriff auch tatsächlich 
erfolgen soll und nicht wegoptimiert werden darf.

von Kornfisch (Gast)


Lesenswert?

Es ist eine unglaublich schlechte idee, unter einem 
Echtzeitbetriebssytem Zeit verbraten zu wollen. Weshalb nicht eine 
Systemfunktion nehmen ?

von Rolf Magnus (Gast)


Lesenswert?

> Es ist eine unglaublich schlechte idee, unter einem
> Echtzeitbetriebssytem Zeit verbraten zu wollen.

Nicht unbedingt. Manchmal dauert es zu lange, den Prozessor abzugeben 
und zu warten, bis man wieder drankommt. Außerdem verbraten zwei 
Taskwechsel auch Rechenzeit. Für sehr kurze Wartezeiten ist deshalb so 
eine Schleife manchmal besser.

von Christian W. (Gast)


Lesenswert?

Ja - das stimmt. Aber ein gutes Echtzeitbetriebsystem weiß das auch - 
und bietet dann eine wait() methode an die anhand der Wartezeit 
entscheidet wie gewartet werden soll. (Ob sich ein Taskwechsel lohnt 
oder nicht)

- nachgucken OB es sowas gibt schadet bestimmt nicht.

von JojoS (Gast)


Lesenswert?

die API Funktion 'CreateWaitableTimer' könnte dafür ok sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.