Hallo Zusammen.
ich habe folgende Anwendung: ein Thread liest in einer Endlosschlaufe die Ports mehrer IOW's und zwischendurch (nicht periodisch) schreibt er auf gewisse IOW's. Dazu rufe ich die IowKitReadNonBlocking() Funktion für jeden IOW nacheinander in der Endlosschleife auf. Danach prüfe ich ob es etwas zu schreiben und gibt und führe die Aktion dementsprechend aus. Nun meine Frage: Ist das effizient? Gibt es eine bessere Möglichkeit das zu implementieren?
Desweiteren möchte ich die Gelegenheit nutzen um eine zweite Frage zu stellen. Wie schreibt man möglichst einfach und effizienz auf einzelne Ausgänge? Da ich nur einen vollen Report schreiben kann, muss ich zuerst alle Pins lesen (mit IowKitReadImmediate()) und danach die zu schreibenden Ausgänge in dem gelesenen Report ändern und schliesslich den veränderten Report zum IOW senden? Oder gibt es eine einfachere/effizientere Lösung?
Danke und Gruss,
finalcu
Effizientes Schreiben und Lesen
Moderator: Guido Körber
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact:
Re: Effizientes Schreiben und Lesen
Hallo finalcu,
Frage 1:
Du musst immer die DLL abfragen (pollen) ob es Daten gibt ... so wie Du es beschreibst ist es OK.
Um das ganze CPU schonend zu machen, würde ich nach jedem Durchlauf eine kleine Pause
paar ms einbauen und bei jedem IOW den jeweiligen Buffer immer komplett ausräumen.
Wenn Du IowKitReadNonBlocking() verwendest kannst Du
anhand der eingelesenen Report_ID immer erkennen ob der DatenSatz auch gültige Daten enthält:
Report_ID = 0 (ungültige Daten / Buffer z.B. leer)
Report_ID <> 0 (gültige Daten)
Frage 2:
Wenn Du so vorgehst, solltest Du wissen welche Ports(Pins) als Eingang verwendet werden sollen, die sollten dann immer mit (1) zurück geschrieben werden (or 1) .
Sonst überschreibst Du einen Eingang der gerade beim einlesen auf (0) ist mit einer (0).
Beim einlesen bekommst Du dann immer eine (0) egal was am Eingang anliegt.
Gruss Ralf
Frage 1:
Du musst immer die DLL abfragen (pollen) ob es Daten gibt ... so wie Du es beschreibst ist es OK.
Um das ganze CPU schonend zu machen, würde ich nach jedem Durchlauf eine kleine Pause
paar ms einbauen und bei jedem IOW den jeweiligen Buffer immer komplett ausräumen.
Wenn Du IowKitReadNonBlocking() verwendest kannst Du
anhand der eingelesenen Report_ID immer erkennen ob der DatenSatz auch gültige Daten enthält:
Report_ID = 0 (ungültige Daten / Buffer z.B. leer)
Report_ID <> 0 (gültige Daten)
Frage 2:
Wenn Du so vorgehst, solltest Du wissen welche Ports(Pins) als Eingang verwendet werden sollen, die sollten dann immer mit (1) zurück geschrieben werden (or 1) .
Sonst überschreibst Du einen Eingang der gerade beim einlesen auf (0) ist mit einer (0).
Beim einlesen bekommst Du dann immer eine (0) egal was am Eingang anliegt.
Gruss Ralf
Re: Effizientes Schreiben und Lesen
Ok, das macht Sinn. Danke fuer deine Antwort.
Eine Frage haette ich da noch: Sofern ich die API richtig verstehe, kann man beim Schreiben eine Pipe auswaehlen. Heisst das man schreibt nur 1 Byte auf eine der verfuegbaren Pipes (0,1,2 oder 3)?
Eine Frage haette ich da noch: Sofern ich die API richtig verstehe, kann man beim Schreiben eine Pipe auswaehlen. Heisst das man schreibt nur 1 Byte auf eine der verfuegbaren Pipes (0,1,2 oder 3)?
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact:
Re: Effizientes Schreiben und Lesen
Hallo finalcu,
Pipe = Kanal
Über Pipe (1) werden die Spezial-Funktionen angesprochen z.B. I2C,LCD ...
Über Pipe (0) können die Ports direkt geschrieben / gelesen werden.
Gruss Ralf
Pipe = Kanal
Über Pipe (1) werden die Spezial-Funktionen angesprochen z.B. I2C,LCD ...
Über Pipe (0) können die Ports direkt geschrieben / gelesen werden.
Gruss Ralf
Re: Effizientes Schreiben und Lesen
Ups, das habe ich falsch verstanden. Ich dachte Pipes sind die einzelnen Ports... Danke fuer den Hinweis.
-
- Posts: 389
- Joined: Sun Feb 13, 2005 1:22 pm
- Location: Gerblingerode / Duderstadt
- Contact:
Re: Effizientes Schreiben und Lesen
Hallo finalcu,
noch ein paar Tipps zum Umgang mit den Ports:
Wenn Du über Pipe(0) den Buffer mit IowKitReadNonBlocking()ausliest bekommst Du für jede Änderung an den Ports je einen Report, die Report-ID ist bei Pipe(0) immer 0.
Problematisch ist es nur wenn alle Ports den Wert 0 haben, dann ist dieser Zustand im Report nicht von einem Ungültigem (Buffer-leer) Report zu unterscheiden denn eine Überprüfung über die Report-ID geht bei Pipe(0) nicht.
Ungültiger-Report ( alle Ports =0), Gültiger-Report ( min 1 Port <> 0 ).
Man kann diesen Buffer auch mit IowKitRead() abfragen, nur gibt es dann das Problem das wenn es keine Änderung an den Ports gibt, der IowKitRead() wartet bis zum Timeout, was den Eindruck macht das das Programm hängt.
Möchtest Du den aktuellen Zustand der Ports haben musst Du über Pipe(1) eine Anfrage über
Report-ID(255) machen, die dann auch über Pipe(1) mir einem Report (Report-ID=255) beantwortet wird.
An sich ist es nicht schwer, man muss nur die Feinheiten beachten.
Gruss Ralf
noch ein paar Tipps zum Umgang mit den Ports:
Wenn Du über Pipe(0) den Buffer mit IowKitReadNonBlocking()ausliest bekommst Du für jede Änderung an den Ports je einen Report, die Report-ID ist bei Pipe(0) immer 0.
Problematisch ist es nur wenn alle Ports den Wert 0 haben, dann ist dieser Zustand im Report nicht von einem Ungültigem (Buffer-leer) Report zu unterscheiden denn eine Überprüfung über die Report-ID geht bei Pipe(0) nicht.
Ungültiger-Report ( alle Ports =0), Gültiger-Report ( min 1 Port <> 0 ).
Man kann diesen Buffer auch mit IowKitRead() abfragen, nur gibt es dann das Problem das wenn es keine Änderung an den Ports gibt, der IowKitRead() wartet bis zum Timeout, was den Eindruck macht das das Programm hängt.
Möchtest Du den aktuellen Zustand der Ports haben musst Du über Pipe(1) eine Anfrage über
Report-ID(255) machen, die dann auch über Pipe(1) mir einem Report (Report-ID=255) beantwortet wird.
An sich ist es nicht schwer, man muss nur die Feinheiten beachten.
Gruss Ralf