Forum: Mikrocontroller und Digitale Elektronik Serielle Datenübertragung - Flaschenhals


von Stefan (Gast)


Lesenswert?

Hallo,

ich habe eine GUI programmiert die von meinem Controller Daten entgegen 
nimmt.
Die Geschwindigkeit ist jedoch ernüchternd.

mein Protokoll sieht so aus:
µC ->Datenpaket-> PC
µC <-Bestätigung<- PC

also µC codiert die Daten für das Paket, schickt sie, der PC empfängt 
sie, nimmt das Paket auseinander, dekodiert die Daten, schreibt sie in 
einen Puffer und schickt dann die Bestätigung, Controller empfängt diese 
und fängt dann an die nächsten Daten zu codieren...usw

meine Datenpakete sehen so aus:
|Startbyte|Typebyte|Anzahlbyte|   ---Datenbytes---|Stopbyte|  = max 64Byte (von 
mir festgelegt)

meine Bestätigungen sind so:
|Startbyte|Typebyte|Anzahlbyte (=0)|Stopbyte|  = 4Byte

jedes Datenpaket oder Bestätigung löst ein Event auf der Gegenseite aus 
wodurch eine Statemaschine angeschmissen wird


Es wurden 1000 Pakete je 64Byte übertragen. Betrachtet wurde nur die 
Daten (60Byte pro Paket) nicht der Overhead, also 1000*60Byte = 
60000Byte
Ich habe vollgende Messungen gemacht:

µC MHZ | Baudrate | Dauer (Sek) | Theorie (Sek) | Byte/Sekunde |

3,68         9600       95           50               631
3,68        19200       65           25               923
3,68       230400      37,7           2              1590
3,68       460800      37,7           1              1590

12         250000      24,5           2              2449
12         500000      23,4           1              2564

16         500000       22            1              2727
16        1000000       22            0.5            2727
16        2000000       22            0.25           2727

Also alles vieeeel zu langsam
Ich hab schon ein paar Ideen woran es liegt, aber was sagt ihr dazu?

von Purzel H. (hacky)


Lesenswert?

Ja.
1. Es scheint delays zu geben. Der controller kann die naechsten bytes 
doch bereits codieren waehrend die alten noch am senden sind, waehrend 
auf eine bestaetigung gewartet wird.
2. Der PC ist auch eher lahm. Miss da mal den delay zwischen den 
packeten.
Auch der PC kann sich vorbereiten, sodass dessen delay minimiert wird.
3. Erhoeh die Blockgroesse. dann gibt es fuer ein festes Volumen weniger 
packete, weniger delays.
4. Man koennte mit ausstehenden Quittierungen arbeiten. Dafuer wuerde 
man mehrere Buffer benoetigen, sowie numerierte Packete. Dann kann der 
controller bereits das naechste packet senden, befor er die quittierung 
hat.

Ich hab mal eine Simulation diesbezueglich geschrieben. Hab sie aber 
grad nicht praesent.

von Experte (Gast)


Lesenswert?

Latenz!

von Peter D. (peda)


Lesenswert?

Da es mit dem MC-Takt korreliert, ist wohl die Verarbeitung auf dem MC 
der Flaschenhals.


Peter

von Stefan (Gast)


Lesenswert?

A...aha Soooo. schrieb:
> 2. Der PC ist auch eher lahm. Miss da mal den delay zwischen den
> packeten.
> Auch der PC kann sich vorbereiten, sodass dessen delay minimiert wird.

hm das verstehe ich nicht ganz, kannst du das genauer erklären?

als erstes werde ich:
A...aha Soooo. schrieb:
> 1. Es scheint delays zu geben. Der controller kann die naechsten bytes
> doch bereits codieren waehrend die alten noch am senden sind, waehrend
> auf eine bestaetigung gewartet wird.
umsetzen, scheint am wenigsten aufwand zu sein

als 2. die Paketgröße erhöhen, scheint auch nicht soo viel aufwand zu 
sein

bin mal gespannt was das schon bringt

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.