Hallo! Ich möchte auf einem PC eine Messwerterfassung durchführen. Dazu steckt in einem PCI-Slot eine Messkarte. Durch Sie werden Analogwerte aus einem Inkrementalgeber digitalisiert und bereitgestellt. Es ist notwendig alle 0,5 bis 1 ms einen Messwet auszulesen. Dies entspricht eine "Sample-Rate" von 1-2kHz. In einer DLL möchte ich die Messwerte aus der Karte auslesen und in einem Ringpuffer Zwischnspeichern, bis Sie durch ein Frontend-Prgamm abgeholt werden. Mir genügt eine Zeitausschnitt von ca. 10 Sekunden. Da je Messwert 8 byte Platz benötigt werden ist mein Puffer ca. 160kByte groß. Der Aufruf des Kartentreibers, um einen Wesswert auszulesen dauert auf einen Prozessor mit 2Ghz ca. 30us. Der Auslesezeitpunkt muß nicht genau feststehen. Es müssen nur so im Schnitt 1000 bis 2000 Messwerte je sekunde zusammenkommen. Möcht mir jemand einen Tipp geben, wie ich unter WindowsXP das gebacken kriege?
Das dürfte nur mit einem Devicetreiber gehen, da die Granularität des XP-eigenen Schedulers bestenfalls bei 1 msec liegt (üblicherweise sogar bei 10 msec). Mit einer normalen User-mode-DLL hast Du jedenfalls keinerlei Chancen, die Messwerte im gewünschten Zeitraster abzuholen. Statt eines Devicetreibers (den zu schreiben sehr viel Arbeit und Fachwissen erfordet) kann auch ein sogenanntes Realtime-Toolkit helfen, wie es von verschiedenen Anbietern erhältlich ist. Mir fällt da spontan www.kithara.de ein.
Danke für den Tipp! Kithara macht einen guten Eindruck (zumindest im Internet). Das Demo werd' ich mir mal downloaden und testen. Hast' du mit diesen Systemerweiterungen schon mal gearbeitet? Mir ist heute im Laufe des Tages noch ein weiteres denkbares Szenario eingefallen: Installation von VM-Ware auf dem PC. Installation von zwei Windows-Instanzen. In einer läuft die Mess-Task. Die Delays werden als sture Loops programmiert (EInfaches verheizen von CPU-Power). in der Anderen Instanz läuft der restliche Programm-Kram. Dabei bleibt noch das Problem dass sich die beiden Instanzen miteinander unterhalten müssen. (Z.B. Müssen die Messwerte irgendwie weiterverarbeitet werden.) Was haltet Ihr davon? Wie ist das mit den Devicetreibern. Ist es von da aus möglich die Treiber meiner Karte einzubinden? cu
"Installation von VM-Ware auf dem PC. Installation von zwei Windows-Instanzen." Noch schlechter. VM-Ware wird schon nur "selten" aufgerufen, dein Programm unter vmware wird nochmal durch den scheduler gejagt und nochmal seltener aufgerufen. Ausserdem wäre auch unter vmware ja noch windows und wie willst du windows dort sagen, dass es nur noch dein programm ausführen soll? Mit der Ideekannst du deine garantierten Messwerte kaum einhalten
Zwar kann man unter VMWare auch irgendwelche Devicetreiber einbinden, man kanns aber auch gleich sein lassen, da diese nicht mit der Hardware des Wirtssystems kommunizieren können. Desweiteren treffen die von Tobi gemachten Anmerkungen zu; das Echtzeitverhalten von VMWare dürfte durch vollständige Abwesenheit glänzen ... Ein anderer Ansatz wäre die Verwendung einer "intelligenten" AD-Karte mit eigenem Prozessor, die dazu gebracht werden kann, autark im vorgegebenen Raster Messungen durchzuführen und die Messwerte in einen karteneigenen Zwischenspeicher zu schreiben. Mit einem zyklisch ausgelösten Interrupt kann der PC dazu gebracht werden, die Messwerte aus diesem Zwischenspeicher abzuholen ... Ansonsten: Nein, mit Kithara habe ich selbst noch nicht gearbeitet. Für vergleichbare Anforderungen habe ich auf spezieller Hardware komplett auf den Windows-Überbau verzichtet und verwende ein "richtiges" Echtzeitbetriebssytem (das in meinem Falle auch noch ROMfähig ist und mit sehr wenig Speicher auskommt, obwohl es auf normaler PC-Hardware läuft)
Man kann unter Windows bis zu 1 ms Auflösung kommen: mit dem Multimedia-Timer. MMRESULT timeBeginPeriod(UINT uPeriod); MMRESULT timeEndPeriod(UINT uPeriod); Mit MMRESULT timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc); die gegenwärtige Auflösung holen und auf 1 ms setzen und Timer starten (timeBeginPeriod). In einer callback Funktion kommen dann die Timer-Events im 1-ms-Takt an (mit timeSetEvent(...) starten). Das alles in einem eigenen Thread erstellen, der noch mit GetCurrentProcessId (); OpenProcess (...); SetPriorityClass (...); auf HIGH_PRIORITY_CLASS (nicht REALTIME_PRIORITY_CLASS) gesetzt wird. Blackbird
Hi, das mit dem Multimedia-Timer funktioniert unter XP ganz gut, unter älteren Betriebssystemen ziemlich leidlich... ABer selbst unter XP ist die 1 ms nicht garantiert, es ist nur garantiert daß im Mittel jede 1ms abgelesen wird - bei Festplattenzugriffen und ähnlichen kann es zu 10 ms langen "Pausen" kommen, die MMTTimerEvents laufen auf und werden anschließend schnell "abgearbeitet" - d.h. nach der Pause hast du eine Art "Burst" an MMTimerevents ganz schnell hintereinander, um wieder auf die 1 ms mittlere Zeit zu kommen (falls du 1 ms als Zeitintervall benutzt - noch kleiner geht nicht)
In der Aufgabenstellungen war von exakter Erfassung die Rede, nicht von Eingabe-Verarbeiten-Ausgeben im ms Takt. In dem Fall würde auch eine Hardwareunterstützung der AD Wandler Karte helfen. Die meisten guten AD Wandlerkarten haben normalerweise einen Pufferspeicher und Taktgenerator on Board und man kann dann einen festen Takt für das Samplen einstellen und die Daten Paketweise abholen. Würde das Helfen ?
Danke für Eure Mithilfe. Ich habe mich für die Methode mit dem Multimedia-Timer entschieden. Funktioniert gut. Damit werde ich jetzt weitere Erfahrung sammeln, und wenn Notwendig doch ein Echtzeitding a la Kiatra einsetzten. Das Muss aber erst die Zeit weisen. @JojoS: Du hast' Recht: Rein formal gesehen habe ich keine Verarbeitung erwähnt. Ergo wird auch keine stattfinden. Praktisch ist das aber nicht so. Ich habe den Verabreitungsteil nicht erwähnt, da ich der Meinung bin, das dies hier irrelevant ist. Sorry. cu
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.