Forum: PC-Programmierung Echtzeitanwendung unter XP


von Der Elektrische Reiter (Gast)


Lesenswert?

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?

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von Der Elektrische Reiter (Gast)


Lesenswert?

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

von Tobi (Gast)


Lesenswert?

"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

von Rufus T. Firefly (Gast)


Lesenswert?

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)

von Blackbird (Gast)


Lesenswert?

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

von Dierk (Gast)


Lesenswert?

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)

von JojoS (Gast)


Lesenswert?

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 ?

von Der Elektrische Reiter (Gast)


Lesenswert?

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