Schneller Timer gesucht

Hallo Experten

ich schreibe in Visual C++ gerade ein Programm, in dem ich einen Timer benoetige, der etwas schneller ist als der normale Timer in Visual C++ (ich meine den, den man mit SetTimer und KillTimer bedient).
Mit dem alten Timer kann ich nur jede Millisekunde ein Event aufrufen. Zudem kommt der Timer wohl schon nicht mehr ganz mit, wenn ich schon eine Wartzeit von 5 ms ansetze.
Bei einem Rechner, der etwa 3 GHz hat, sollte es doch moeglich sein einen etwas schnelleren Timer zu bekommen, oder ?

Hat sich vielleicht jemand die Muehe gemacht und einen solchen Timer geschrieben, oder kann man soetwas irgendwo downloaden ?

Vielen Dank fuer jeden Vorschlag !

Martin

Mit dem alten Timer kann ich nur jede Millisekunde ein Event
aufrufen. Zudem kommt der Timer wohl schon nicht mehr ganz
mit, wenn ich schon eine Wartzeit von 5 ms ansetze.

Das ist normal, da das Betriebssystem eine recht grobe Zeitaufteilung hat (Prozessumschaltungen etc., IIRC im Normalfall ca. 10ms). Wenn du genauere Zeiten willst brauchst du ein Echtzeitsystem.

Du hast da enorm hohe Anforderungen, Windows und auch Linux verwenden beim Scheduling von Threads Zeitscheiben im Bereich von 10-20ms. Ich glaube kaum, dass es auf Basis dieser Betriebssysteme möglich ist, feinere Auflösungen umzusetzen. Bestenfalls kannst du versuchen einen Thread mit der Prio „Echtzeit“ aufzuziehen, der in einer Endlosschleife eine interne Uhr (gibt es sicherlich) abfragen und nach einer definierten Zeitspanne deinen Handler aufrufen.

Es darf aber nicht darüber hinweg täuschen, dass Windows und auch Linux, keine Echtzeitbetriebsysteme sind. Vereinfacht ausgedrückt kannst du mit deinen Timern zwar eine minimale Wartzeit definieren, du hast aber keinen Einfluss darauf, wann das Event ausgelöst wird. Du definierst also eine Zeitspanne von 100ms und kannst sicher sein, dass das Event nicht schon früher ausgelöst wird, tatsächich kann das Event aber erst nach 500ms oder einigen Sekunden ausgelöst werden.
Ein Echtzeitbetriebssystem garantiert dir eine Antwortzeit. Bei Windows und Co ist dass schon allein wegen des Swapping/virtual Memory gar nicht möglich.

Markus

Hallo

wofür brauchst Du das? Auf einem Multitaskingsystem kriegts Du einen derartigen
Timer nur über einen Hardwarezugriff. Also z.B. den Timer der das System ticken
lässt. Und den solltest Du besser nicht stoppen oder killen.
Dein Prozess hat auch nur einen eingeschränkten view auf den Timer. Damit macht
ein Zugriff eigenlich nur für präzise Zeitmessungen Sinn, die auch im
Systemmodus (z.B. Treiber, Interrupts, etc.) laufen. In diesem Fall kannst Du
Dir aber bestenfalls Timestamps (also Augenblickwerte des Timers) merken und
diese später auswerten.
Eine Alternative wäre ein eigener HW-Timer z.B. auf einer Zusatzkarte. Aber
auch hier hast Du schlechte Karten. Wie willst Du sicherstellen, dass zwischen
dem Event und dem Timerzugriff Dein Prozess nicht verdrängt wird? Also landest
Du wieder bei eigenen Kernelroutinen. Versuch es mal bei Firmen die diese
Zusatzkarten bauen (ADI, etc.). Bei Win liegen leider nicht alle Informationen
offen, so dass die Entwicklung von derartigen Treibern als eine Art
Geheimwissenschaft anzusehen ist.

Viel Spass.

Was ich damit machen moechte…
Hallo Joe

Danke fuer Deine/Eure Antworten. Ich wuerde Dir gerne auch noch Deine Frage beantworten.

wofür brauchst Du das?

Ich schreibe an einem Programm, dass eine spezielle AD-DA-Wandler-Karte (PCL812) anspricht. Ich will damit Spannungen einlesen und gleichzeitig auf einem Anderen Kanal setzen. Soweit ist das von der Karte unterstuetzt !
Auch kann ich der Karte sagen, dass sie mit 30MHz Spannungen einlesen soll. Das wird von der Karte gesteuert. Leider kann ich der Karte nicht sagen, dass sie mit 30MHz auch Spannungen ausgeben soll. Aber einzelne Spannungswerte kann ich per Befehl setzen. Nun hatte ich gehofft, dass ich ueber einen schnelleren Timer mit mehr als 1kHz diese Spannungen setzen kann. Der Windows-Timer macht schon bei ueber 100Hz (Delayzeit 10ms) schlapp.
Wenn ich einen Sinus ausgeben moechte, dann wuerde ich gerne etwa 1000 Punkte fuer eine Periode haben (das Signal der Karte wird Verstaerkt, so sprechen wir von einem Spannungsbereich von 0 bis 800 Volt, daher also mindestens 1000 Punkte !). Wenn ich also einen Ausgabetackt von 1kHz haette (wie gesagt, zur Zeit bin ich bei 100Hz), wuerde das einer Sinusperiode von 1Hz bedeuten. Das ist mir etwas langsam. Bis 5 Hz Sinus wuerde ich schon gerne kommen !

Eine andere Ueberlegung war die Soundkarte anzusprechen ! Mit ihr koennte ich wahrscheinlich auch eine Sinusschwingung erzeugen. Das Signal muesste nur entsprechend Verstaerkt werden. Ist nur die Frage, wenn ich das auf 800V ausgabe verstaerke, wie gross ist dann der Spannungs-Sprung zwischen den einzelnen Werten…
Naja mal sehen, wie ich das Problem loese !

Vielen Dank und viele Gruesse an alle, die bis hier gelesen haben :wink:

Martin

PS: Frohe Ostern :smile:

Hi,

Wenn ich einen Sinus ausgeben moechte, dann wuerde ich gerne
etwa 1000 Punkte fuer eine Periode haben (das Signal der Karte
wird Verstaerkt, so sprechen wir von einem Spannungsbereich
von 0 bis 800 Volt, daher also mindestens 1000 Punkte !). Wenn
ich also einen Ausgabetackt von 1kHz haette (wie gesagt, zur
Zeit bin ich bei 100Hz), wuerde das einer Sinusperiode von 1Hz
bedeuten. Das ist mir etwas langsam. Bis 5 Hz Sinus wuerde ich
schon gerne kommen !

Du brauchst für Dein Ausgangssignal keine 1000 Werte ausgeben. Wenn Du das Signal durch einen entsprechenden Tiefpass jagst, dann kannst Du wesentlich weniger dafür benutzen.

grüße, Micha

Hallo, zusammen!

Ja, ich denke, Du würdest tatsächlich ein Echtzeit-Betriebssystem benötigen.

Aber schau doch mal folgendes:

Meiner Meinung nach kannst Du der Karte mitteilen, was Du ausgeben willst. Also zum Beispiel Kurvenform, Frequenz, Amplitude. Der Prozessor auf der Karte wird diese Werte dann selbständig ausgeben; tatsächlich in Echtzeit. Schau dazu doch mal in die Dokumentation der Karte.

Viel Erfolg!
J.

Hallo J.

Meiner Meinung nach kannst Du der Karte mitteilen, was Du
ausgeben willst. Also zum Beispiel Kurvenform, Frequenz,
Amplitude. Der Prozessor auf der Karte wird diese Werte dann
selbständig ausgeben; tatsächlich in Echtzeit. Schau dazu doch
mal in die Dokumentation der Karte.

Die PCL812PG kann das nicht ! Hab ich schon geguckt :frowning:((

Dennoch Danke !

Gruss
Martin

Hallo Martin,

Meiner Meinung nach kannst Du der Karte mitteilen, was Du
ausgeben willst. Also zum Beispiel Kurvenform, Frequenz,
Amplitude. Der Prozessor auf der Karte wird diese Werte dann
selbständig ausgeben; tatsächlich in Echtzeit. Schau dazu doch
mal in die Dokumentation der Karte.

Die PCL812PG kann das nicht ! Hab ich schon geguckt :frowning:((

Eine weitere Möglichkeit ist vieleicht die DMA zu benutzen, falls die Daten 1:1 an den Ausgang weitergeleitet werden können.

MfG Peter(TOO)