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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.