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


von Alexander I. (daedalus)


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

von Peter (Gast)


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.

von Superberti (Gast)


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ß,

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.