www.mikrocontroller.net

Forum: PC-Programmierung Timingprobleme: Zyklischer Thread für Statemachine mit VC++ MFC


Autor: Alexander I. (daedalus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich muß mit VC++ MFC eine Statemachine nachbauen, die ein Protokoll über 
RS232 abhandelt. Zwischen zwei Embedded Systemen stellt das absolut kein 
Problem dar, da ruft ein Timer z.B. alle 1ms eine Funktion auf, die dann 
einen Zustand iteriert und so Stück für Stück die States abarbeitet.

Tja, mit Windows XP hab ich da ganz schnell bemerkt, dass es nicht mal 
annähernd ein RTOS ist. Um einigermaßen von der grafischen 
Bedienoberfläche abgekoppelt zu sein, habe ich die zeitkritischen 
Aufgaben in Workerthreads gepackt, z.B. die RS232-Kommunikation.

Jetzt zum Problem:
Ich habe einen Thread, der die Statemachine abbildet und bei jedem 
Durchlauf einen Zyklus (Iteration) durchführt. Da es mehrere Threads 
sind, muß ich zwischendurch alle mal bedienen, wobei von der Priorität 
her gilt RS232 größer Statemachine größer Sonstige Amtshandlungen. Das 
hat dazu geführt, dass zwischen jeder Iteration rund 20ms Ruhe herrscht. 
Da die Datenraten nicht sonderlich hoch sind, stellt das kein großes 
Problem dar. Ein großer Problem ist es aber, dass die Statemachine auch 
Timeouts hat, also z.B. ein Paket verschickt und sagen wir 25ms auf eine 
Antwort wartet, danach wird das Paket nochmal gesendet. Auf einem 
Embedded System stellt das kein Problem dar, da werden dann einfach die 
Aufrufe gezählt (z.B. 25 Iterationen bei 1ms-Raster).

Aber, wie bekomme ich sowas einigermaßen (5ms Toleranz) auf dem PC hin?
Sofern am PC sonst keine großen Anwendungen laufen, funktioniert das 
auch mittelprächtig, aber schon wenn z.B. Outlook mal wieder Mails 
archiviert, werden aus dem 20ms-Timeout schnell mal 40ms oder mehr und 
so lässt sich das nicht ordentlich abbilden.

Nun meine Frage:
- Was habt ihr für Vorschläge, mit denen man sagen kann "mach exakt 20ms 
+-5ms etwas anderes (z.B. RS232-Thread), aber danach kümmerst du dich 
auf jeden Fall um den Statemachine-Thread".
- Welche genauen Timerkonstrukte gibt es außer dem Multimediatimer in 
winmm.lib?

Ich hoffe auf ein paar Tips, Begriffe für die Googlesuche und Hinweise 
:)

Vielen Dank im Voraus

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube ein timing im userspace mit 10ms ist überhaupt nicht möglich. 
Wenn du so genau das timing einhalten musst dann wirst du wohl einen 
Treiber schreiben müssen.

Auserdem ein RTOS sagt nichts über die geschwindigkeit aus. Als RTOS 
kann auch ein system zählen was spätestesn nach 1Stunde auf ein Event 
reagiert.

Autor: Superberti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine wichtigsten Funktionen dürften dafür

timeBeginPeriod
timeEndPeriod

sein. Damit setzt Du die Minimalauflösung der Timer in Deiner Anwendung.
Mit timeBeginPeriod(1) liegt die dann bei einer Millisekunde und man 
merkt deutlich die höhere Genauigkeit, vor allem bei Sleep().
Falls Deine Threads sauber programmiert sind und keine busy waits 
beinhalten kannst Du noch die Priorität Deines wichtigsten Threads auf 
Echtzeit setzen.
Damit garantiert Dir zwar noch immer keiner, dass Dein Timing jederzeit 
funktioniert, meinen Erfahrungen nach bekommt man aber damit durchaus 
Timings im kleinen Millisekundenbereich hin.

Gruß,

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.