PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Delays unterhalb des Millisekundenbereichs?


Vedek Bareil
2005-06-14, 16:17:57
Hallo,

ich habe folgendes Problem (VC++ unter Win2000/XP):
ich arbeite an einem Programm, in dem es auf sehr kurzzeitige Delays ankommt, also darauf, daß mit der Ausführung des weiteren Programmcodes eine definierte Zeitspanne gewartet wird. Und diese Zeitspanne muß sehr kurz sein, im Bereich von einigen 10 bis 100 Mikrosekunden. Die Funktion Sleep() kann ich also nicht benutzen, da die mit Millisekunden arbeitet und daher zu grob ist. Gibt es irgendeine andere Funktion mit feinerer Auflösung?

Demirug
2005-06-14, 17:13:17
Nein.

Das was du da machen willst hört sich irgendwie an als würde es in einen Treiber gehören.

muhkuh_rs
2005-06-14, 18:00:36
QueryPerformanceCounter kann im Microsekundenbereich Zeiten abfragen und wohl auch noch darunter, nur dass der Aufruf der Funktion dann wohl das begrenzende Element ist. Allerdings musst Du dann pollen.

mrdigital
2005-06-14, 20:08:45
Wenn du wirklich auf ein so knappes Timing angewiesen bist, ist Windows leider kein guter Unterbau, da dir niemand unter Windows diese Zeiten auch garantieren kann (es kann schon klappen ;)) Andere Betriebssysteme sind da evtl. besser geeignet. Wenn es dir um Messungen geht, dann kannst du mit einer geeigneten Messkarte, die eigene Timer besitzt, evtl. auch unter Windows zum Ziel kommen.

ilPatrino
2005-06-15, 00:49:01
was willst du machen? wenns wirklich um genaues timing, vo allem im µs-bereich, geht, kommst du wohl an einem echtzeitsystem nicht vorbei...

Vedek Bareil
2005-06-15, 13:25:25
Also: über das was ich mache kann ich nicht allzu viel sagen, weil es Firmengeheimnis ist. So viel sollte ich aber sagen können: ich habe mehrere externe Geräte an Comports hängen (der Rechner ist mit ner Multiserial-Karte ausgestattet). Eines davon ist ein Meßgerät, dessen Messungen mit den Aktivitäten von einem der anderen synchronisiert werden sollten.
Weitgehend gelöst habe ich das Problem jetzt mit Hilfe des Triggers des Meßgerätes: die zu messende Größe ändert sich bei den Aktivitäten, und da kann man den Trigger drauf einstellen. Es war allerdings ein relativ hoher Aufwand vonnöten um die richtigen Triggersettings herauszufinden.

Gast
2005-06-15, 13:29:57
Wie gesagt. Für Systemseitige Aufgaben wäre dann ein System wie QNX besser geeignet. Das braucht nämlich nur 0.55 µsec auf einem PIII, um auf ein Ereignis zu reagieren.

http://www.operating-system.org/betriebssystem/_german/bs-qnx.htm

tatarus
2005-06-19, 01:34:36
Über einen COM Port kannst du sowieso nicht im µs Bereich arbeiten. Die Übertragung von Ereignissen dauert ja oft schon länger. Wenn die Multiserial Karte eine PCI Karte ist, dann liegt da dein nächstes Timing Problem. Der PCI Bus arbeitet mit 33 bzw. 66MHz. Nicht alle Takte sind Datentakte und andere PCI Geräte, wie die Host Bridge (die kann den Bus übrigens auch locken, dann geht erstmal gar nichts mehr) belasten den Bus zusätzlich, was die Sache auch noch verlangsamt. Es kann zwar sein, dass ein solches System kurzzeitig funktioniert. Dauerhafte harte Zeitdeadlines von 10 bis 100µs wirst du aber nicht halten können. Das Problem mit den Windows Tasks wurde ja schon erwähnt.

Wenn es nur um Triggersynchronisation geht, dann würde ich bei solchen Deadlines einen Microcontroller oder einen rekonfigurierbaren Prozessor benutzen. Damit kann man dann einfach die gesammelten Daten über den COM Port an den PC weiterleiten und das Timing ist vorhersehbarer. Ein anderer Weg wäre USB anstatt den COM Port zu nutzen.

Wenn du mehr darüber lesen möchtest, wie man kurze Zeitintervalle in OOL bekommt, dann schau mal im Internet unter Actor Oriented Design nach. Die Uni Berkeley hat da echt gute Paper zu.