Effizientes Schreiben und Lesen

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
finalcu
Posts: 26
Joined: Fri Nov 13, 2009 8:53 am

Effizientes Schreiben und Lesen

Post by finalcu »

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
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: Effizientes Schreiben und Lesen

Post by friend-of-rq »

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
finalcu
Posts: 26
Joined: Fri Nov 13, 2009 8:53 am

Re: Effizientes Schreiben und Lesen

Post by finalcu »

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)?
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: Effizientes Schreiben und Lesen

Post by friend-of-rq »

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
finalcu
Posts: 26
Joined: Fri Nov 13, 2009 8:53 am

Re: Effizientes Schreiben und Lesen

Post by finalcu »

Ups, das habe ich falsch verstanden. Ich dachte Pipes sind die einzelnen Ports... Danke fuer den Hinweis.
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: Effizientes Schreiben und Lesen

Post by friend-of-rq »

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
Post Reply