Takt und Geschwindigkeit

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
Franz Peter Zantis
Posts: 96
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Takt und Geschwindigkeit

Post by Franz Peter Zantis »

Bei Tests ist zufällig aufgefallen, dass für die Übersendung von 2 Byte per SPI etwa 2 ms benötigt werden.
Diese Zeit ist unabhängig von der Taktfrequenz des SPI-Bus! Folgender Code wurde dafür verwendet:

Dim a As Long
Dim b As Long
Dim c As Double
QueryPerformanceCounter(a)

spidata(0) = &H9
spidata(1) = &H2 'number of bytes to transfer
spidata(2) = 0 'flags
spidata(3) = lhbytelowbyte(1)
spidata(4) = lhbytelowbyte(0)
intret = IowKitWrite(iohandle, 1, spidata(0), 64)

QueryPerformanceCounter(b)
c = (b - a) * hirestimerresolution
Debug.Print(CStr(c))

Beim QueryPerformanceCounter handelt es sich um einen schnellen Counter. Die Auflösung betrug auf dem System auf dem der Test stattfand 0,000000291249 s. Es wurde mit SPI-Taktfrequenzen von 100kHz, 1MHz und 12MHz getestet. In allen drei Fällen betrug die benötigte Zeit für das Versenden der zwei Byte knapp 2 ms.
Das ist komisch!?

Guido Körber
Site Admin
Posts: 2738
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Takt und Geschwindigkeit

Post by Guido Körber »

Nein, nicht ansatzweise komisch.

Der IOW56 kann die Daten nicht so langsam senden, dass zwei Bytes über 1 ms benötigen. Das verwendete USB Protokoll beschränkt den Datendurchsatz auf 1 Report pro 1 ms. Wenn man wie im Beispiel keine überlappenden Transfers macht kommen also bis zu 2 ms Latenz raus.

Das ist also das erwartete Verhalten.

Franz Peter Zantis
Posts: 96
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: Takt und Geschwindigkeit

Post by Franz Peter Zantis »

Was muss ich also ändern um schneller zu übertragen?
Wie kann ich die USB-Durchsatz erhöhen bzw. die Beschränkung aufheben?
Überlappende Transfers würde für mich heißen: während der Datenübertragung n wird bereits die Adresse für den Datensatz n+1 übertragen.
Aber hier stehen alle Daten in einem Array von dem nur die Anfangsadresse übergeben wird.

Guido Körber
Site Admin
Posts: 2738
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Takt und Geschwindigkeit

Post by Guido Körber »

Mehr Daten in einer Transaktion senden geht nicht? Nur zwei Bytes von 61 möglichen pro Report sind halt wenig.

Überlappend bedeutet Senden und Empfangen in Threads laufen zu lassen, dann ist die Latenz zwar immer noch 2 ms aber der Durchsatz liegt dann bei 1 Paket pro 1 ms.

Den USB Durchsatz können Sie nicht erhöhen, das Protokoll hat nun mal feste Vorgaben. Eine davon ist, dass USB blockorientiert arbeitet und nicht mit einem Stream. Entsprechend muss man die Strategie zur Datenübertragung anpassen, sonst erreicht man keinen Durchsatz. Das ist aber generell bei allen blockorientierten Kommunikationen so, auch 10 G Ethernet kann man zu einer lahmen Schnecke machen indem man nur wenig Daten in ein Paket packt.

Franz Peter Zantis
Posts: 96
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: Takt und Geschwindigkeit

Post by Franz Peter Zantis »

Im vorliegenden Fall werden Daten zyklisch an einen 12-Bit-DAU gesendet. Deshalb werden immer nur zwei Byte übertragen (12 Bit + 4 Steuerbits). Zwischen den Übertragungen wird jeweils der neue zu übertragende Wert (0....4095) berechnet.

Guido Körber
Site Admin
Posts: 2738
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Takt und Geschwindigkeit

Post by Guido Körber »

Dann gibt es nur die Möglichkeit mit überlappenden Transfers auf den maximalen Durchsatz von 1 Paket pro ms zu kommen, mehr Optimierung ist nicht möglich.

Franz Peter Zantis
Posts: 96
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: Takt und Geschwindigkeit

Post by Franz Peter Zantis »

Da würde ich mich über ein Beispiel freuen. Ich vermute: es werden zwei identische Threads angelegt die beide jeweils zwei Byte per SPI senden. Diese beiden Threads werden dann per Timer im Abstand von 1ms gestartet. - Richtig?

User avatar
Christoph Jung
Posts: 618
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Takt und Geschwindigkeit

Post by Christoph Jung »

Windows ist was timing angeht eine Schlampe.
Wenn man z.B. ein Sleep(1) aufruft, dann kann das alles zwischen 1ms und ca 18ms sein. Je nach Systemlast und anderer Dienste, die
sich mit höherer Priorität in die MessageQeue reindrängeln.


Man muss die Threads mit der Höchsten Priorität starten und dann ist die Chance recht hoch auf die Datenraten zu kommen.
Mit Threads arbeiten ist etwas trickreich, aber nicht sehr kompiziert. Leider bin ich gerade überfrage wie das in Basic abläuft. Das müsste ich mir
nächste Woche einmal anschauen. Im Netz gibt es viele Beiträge zum Thema "WorkThread" die sich mit Threads befassen.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter

Franz Peter Zantis
Posts: 96
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: Takt und Geschwindigkeit

Post by Franz Peter Zantis »

Wie man grundsätzlich Funktionalität mit VB in Threads "auslagert" ist mir bekannt. Es geht vor allem um das Grundsätzliche. Welche Funktionalität kann ich beim IO-Warrior56 als Thread auslagern? Und wie gewährleiste ich den korrekten zeitlichen Ablauf?
Ich kann auch C-Code lesen und diesen meistens erfolgreich in VB-Code übersetzen.

User avatar
Christoph Jung
Posts: 618
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Takt und Geschwindigkeit

Post by Christoph Jung »

Ich habe leider kein Beispiel parat, welches einen Thread den IO-Warrior ausliest/schreibt.

In die Threads sollten nur die IowKitWrite() und IowKitRead() Funktionen rein. Wenn ein Thread IowKitOpenDevice() aufruft ist für alle anderen
die DLL gesperrt. Das mit dem korrekten zeitlichen Ablauf ist glaube ich etwas tricky. Man könnte einen Multimediatimer in den Threads laufen lassen.
Der geht bis auf eine Milisekunde runter. Man könnte auch mit dem PerformanceCounter die Ticks zählen und dann die Wirite/Read Befehler anfeuern.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter

Post Reply