www.mikrocontroller.net

Forum: PC-Programmierung Hilfe zu wait - Funktion


Autor: X_Rider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich möchte auf meinem Embedded-PC, auf dem ein 
Echtzeitbetriebssystem läuft, eine zusätzliche wait - Funktion 
realisieren.
void Wait(int MikroSec)
{
 int i=0,j=0; 
 for(i=0; i<(MikroSec * LOOPS_PER_MIKROSEC); i++)
  {
  j++;
  }
}

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

Autor: Robert S. (razer) Benutzerseite
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ den Schleifenzähler volatile definieren.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: X_Rider (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: X_Rider (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
void Wait(int MikroSec)
{
 volatile int i=0,j=0; 
 for(i=0; i<(MikroSec * LOOPS_PER_MIKROSEC); i++)
  {
  j++;
  }
}

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kornfisch (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die API Funktion 'CreateWaitableTimer' könnte dafür ok sein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.