Forum: Mikrocontroller und Digitale Elektronik Gibt es externe Ringpuffer Bausteine?


von DerFräger (Gast)


Lesenswert?

Hallo Jungens,

ich hab da ein kleines Problem bei einem Projektchen.
Dort werden nämlich serielle Daten eingelesen und auf Inhalt untersucht.
Dummerweise ist der Sender manchmal sehr gesprächig, sodass es 
regelmäßig zu fehlerhaften Auswertungen kommt. Ringbuffer overflow.

Ich kann dem Mega644 aber nicht mehr allzuviel Bufferplatz rausleihern.


Weiß von Euch einer, ob es so etwas wie einen externen Puffer gibt?
So in der 10kb Größenordnung...



Danke schonmal für Eure Antworten.


DF

von Falk B. (falk)


Lesenswert?

@  DerFräger (Gast)

>Dort werden nämlich serielle Daten eingelesen und auf Inhalt untersucht.
>Dummerweise ist der Sender manchmal sehr gesprächig,

Wie gesprächig?

> sodass es
>regelmäßig zu fehlerhaften Auswertungen kommt. Ringbuffer overflow.

Shit happens.

>Ich kann dem Mega644 aber nicht mehr allzuviel Bufferplatz rausleihern.

Nimm einen AVR mit mehr SRAM.

>Weiß von Euch einer, ob es so etwas wie einen externen Puffer gibt?
>So in der 10kb Größenordnung...

Sicher, bei Cypress und IDT, aber die willst du nicht wirklich nutzen, 
der Aufwand zur Ansteuerung übersteigt in diesem Fall den Nutzen um 
Größenordungen. Nimm einen größeren Controller oder ändere dein 
Protokoll (Handshake, Flußsteuerung)

MFG
Falk

von Dennis (Gast)


Lesenswert?

Wenn der µC austauschbar ist, dann versuch es mal mit dem ATMEGA1284P. 
Der ist baugleich mit dem 644 und hat gleich 16kb SRAM anstatt 4kB.

von MCUA (Gast)


Lesenswert?

>Weiß von Euch einer, ob es so etwas wie einen externen Puffer gibt?
SRAM, MRAM, DRAM, SDRAM, FLASH, FIFO, DPRAM, CPLD, FPGA, (in uCs)

von Heinz (Gast)


Lesenswert?

Mit welcher Geschwindigkeit (Bytes/s) kommen die Zeichen.

von Datt (Gast)


Lesenswert?

Wenn Dein µc das Einlesen und anschließende Puffern der Daten nicht mehr 
schafft, dann nimm entweder einen größeren µC oder spendiere einfach 
einen zweiten µC speziell für diese Aufgabe. Bei ähnlichen Anforderungen 
habe ich auch schon einige Schaltungen mit zwei µCs laufen, was relativ 
einfach zu realisieren war.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

DerFräger schrieb:
> Dort werden nämlich serielle Daten eingelesen und auf Inhalt untersucht.
> ...Ringbuffer overflow.
Warum dauert die Untersuchung so lang?

von B. S. (bestucki)


Lesenswert?

Leite doch die Daten in ein SPI RAM weiter, wenn der interne Ringbuffer 
voll ist. Dann kannst du die Daten später in aller Ruhe auslesen und 
verarbeiten.

von Karl H. (kbuchegg)


Lesenswert?

Kommt eigentlich der gute alte Handshake immer mehr aus der Mode?
Der ist genau für solche Sachen gedacht "Halt momentan bitte mal die 
Klappe, ich bin beschäftigt und komm nicht nach".

von MCUA (Gast)


Lesenswert?

>Kommt eigentlich der gute alte Handshake immer mehr aus der Mode?
Aus der Mode kommt der nicht. Aber oft ist keine Zeit dafür.

von oszi40 (Gast)


Lesenswert?

DerFräger schrieb:
> Ringbuffer overflow.

1.Auch der größte Buffer läuft mal voll, wenn die Strategie nicht 
stimmt. Besteht keine Möglichkeit RECHTZEITIG zu prüfen, ob diese Daten 
überhaupt sinnvoll sind?

2.Sendet Deine Quelle zuviele Daten oder es werden auf der Leitung zu 
viele Störungen eingesammelt?

von MaWin (Gast)


Lesenswert?

Ich glaube du bist 40 Jahre zu spät dran:
MM5034
Heute macht man das einfach mit einem ausreichend grossen uC, oder, 
falls es rasend schnell sein muss, passend programmierten FPGA.

von Karl H. (kbuchegg)


Lesenswert?

MCUA schrieb:
>>Kommt eigentlich der gute alte Handshake immer mehr aus der Mode?
> Aus der Mode kommt der nicht. Aber oft ist keine Zeit dafür.

Bei einer Seriellen an der sowieso schon ein Ringbuffer drannhängt (der 
nur eben zu klein ist)?   Füllgrad über 80% -> CTS setzen, Füllgrad 
unter 20% -> CTS löschen. Das braucht doch keine Zeit.

von DerFräger (Gast)


Lesenswert?

Ui Ui Ui Ui!

Das ist ja eine Flut von Vorschlägen.
Vielen Dank erstmal.

Zwei finde ich besonders gut: ATMEGA1284P und ein zweiter Prozessor evt 
mit externem RAM.

@Karlheinz:
Das wäre zu schön, aber hier wird nur bei einem Protokoll zwischen zwei 
Seiten mitgehört. Ich kann nicht aktiv eingreifen.

@All:
Es kommen mehrere kb ASCII Daten mit 9600bd rein, die auch die zu 
suchenden Daten enthalten.
Die Abfrage ist bereits schon ziemlich gut optimiert mit einer State 
Machine.
Die Uart Lib ist die von P.Fleury - also auch verlässlich.

MM5034 - niedlich aber unpraktisch, weil parallel und ohne Intelligenz.


Oder vielleicht doch den gesamten Puffer in ein externes SPI RAM 
auslagern?

Das dumme ist das Hardware Design ist bereits angeschlossen. Die 
Änderungen sollten daher leicht zu realisieren sein.

Die SPI wäre noch frei für ein Piggyback Board ...


Auf jeden Fall danke für die Eingebungen - muss mal sinnieren.

von Höffi (Gast)


Lesenswert?

> Daten mit 9600bd rein

Das ist ja schnarchlangsam.

Such doch WÄHREND die Daten reinkommen.

von Micha (Gast)


Lesenswert?

Höffi schrieb:
> Such doch WÄHREND die Daten reinkommen.

Nur als Anregung: Bau eine State-Machine!
Wenn die Begriffe bekann sind relativ trivial, ansonsten siehe 
Knuth-Morrison-Pratt.

von DerFräger (Gast)


Lesenswert?

Es läuft bereits eine State Machine, die die eingehenden Daten 
untersucht.
Nur halt während des normalen Programmablaufs und nicht in der UART 
Interrupt Routine. Das wollte ich vermeiden, denn es gibt zwei weitere 
Uarts zu bedienen.

Bei 6,95 für den AtMega1284P ist die Entscheidung für den ersten Test 
schonmal gefallen :-)

Plug&Play :-)

von Purzel H. (hacky)


Lesenswert?

Ich denke eher die Suchmaschine ist Schrott. Das wird sich ja zeigen, 
wenn die Loesung nichts taugt. Denn ein SPI RAM anzusteuert ist nicht 
gratis. Waehrend dem ihr das externe Ram adressiert haett ich meine 
Suche schon durch denk ich.
Die Suche ist eine Binaersuche in einem Baum ? Falls nicht ... ist sie 
zu langsam.
Wie lang sind den die Eintraege, die durchsucht werden muessen ?

von n.n. (Gast)


Lesenswert?

hm.. es wurde der 16550A nicht erwähnt:
http://en.wikipedia.org/wiki/16550_UART

von Heinz (Gast)


Lesenswert?

Pico Oschi schrieb:
> Waehrend dem ihr das externe Ram adressiert haett ich meine
> Suche schon durch denk ich.

Du darfst nicht vergessen, dass wir nur Dummbattel sind. Du hingegen 
bist ein Universalgenie, das sogar Probleme lösen kann, dies es gar 
nicht kennt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

DerFräger schrieb:
> Es läuft bereits eine State Machine
In Zahlen 1. Schulterklopf, schulterklopf...  ;-)

Nur mal so ein Einwurf aus der Hardwareecke (FPGA):
Eine (in Zahlen: 1) FSM ist keine (in Zahlen: 0) FSM.
Erst ab 4 verschachtelten FSM wird das Design interessant. Wobei ich der 
Ehrlichkeit halber zugeben muss, das schon ein Zähler eine FSM ist... 
;-)

> Die Abfrage ist bereits schon ziemlich gut optimiert mit einer State
> Machine.
Was hast du da so Wichtiges zu untersuchen, dass das 10 Sekunden lang 
dauern könnte? Ich berechne mir diese Zeit überschlägig aus den Angaben
> So in der 10kb Größenordnung...
und
> Daten mit 9600bd rein
weil 10000 * 1ms = 10s, und weil du angeblich keine Zeit hast, das 
online beim Empfang zu machen...

Wo wird da die ganze Rechenleistung verbraten?

Denn immerhin kann der uC mit 8MHz in dieser Zeit ca. 80Millionen 
Operationen ausführen, von denen die allerwenigsten zur Pufferverwaltung 
benötigt werden.... :-o

von Falk B. (falk)


Lesenswert?

Der Lothar wieder, der alte Ketzer ;-)

von Willi (Gast)


Lesenswert?

DerFräger schrieb:
> Nur halt während des normalen Programmablaufs und nicht in der UART
> Interrupt Routine. Das wollte ich vermeiden, denn es gibt zwei weitere
> Uarts zu bedienen.

Na und?
Dein Controller läuft doch hoffentlich mit 16-20MHz, dann hat er genug 
(Echt-)Zeit. Natürlich mußt Du vor der 'Suche' den globalen Interrupt 
wieder freigeben.

von Höffi (Gast)


Lesenswert?

Poste mal Dein Programm dann wirst Du  ... ääääh ich meine Dein Programm 
hier sicher fachgerecht auseinandergenommen :->

von Heinz (Gast)


Lesenswert?

> Denn immerhin kann der uC mit 8MHz in dieser Zeit ca. 80Millionen
> Operationen ausführen ...

Das glaube ich nicht.

von Heinz (Gast)


Lesenswert?

Heinz schrieb:
>> Denn immerhin kann der uC mit 8MHz in dieser Zeit ca. 80Millionen
>> Operationen ausführen ...
>
> Das glaube ich nicht.

EDIT: Habe mich verlesen :)

von Falk B. (falk)


Lesenswert?

@Heinz (Gast)

>> Denn immerhin kann der uC mit 8MHz in dieser Zeit ca. 80Millionen
>> Operationen ausführen ...

Das glaube ich nicht.

Ich schon. 80e6 mal NOP ;-)

von Purzel H. (hacky)


Lesenswert?

Die Suche macht man natuerlich in Echtzeit, dh waehrend die Bytes 
kommen, nicht nachher. Bei 9600Baud kommen ca 1000 byte pro sekunde. Bei 
8MHz clock macht das demnach 8000 Befehle, die pro byte zur Suche zur 
Verfuegungs stehen. Das sollte reichen fuer einen Binaerbaum und noch 
etwas drauf.

von Udo S. (urschmitt)


Lesenswert?

Pico Oschi schrieb:
> Das sollte reichen fuer einen Binaerbaum und noch
> etwas drauf.

Hmm, zeig mir mal wie du einen Binärbaum für Streamdaten machst. Und 
zwar auf einem µC mit wenig RAM.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Udo Schmitt schrieb:
> zeig mir mal wie du einen Binärbaum für Streamdaten machst.
Ja, wenn man nur wüsste, was da eigentlich mit diesen Daten gemacht 
werden soll bzw. gemacht wird. Man muss ja nicht immer gleich vom 
Schlimmsten ausgehen....  ;-)

von Udo S. (urschmitt)


Lesenswert?

Lothar Miller schrieb:
> Ja, wenn man nur wüsste, was da eigentlich mit diesen Daten gemacht
> werden soll bzw. gemacht wird. Man muss ja nicht immer gleich vom
> Schlimmsten ausgehen....  ;-)

Hallo Lothar,
Hat der TO doch gesagt:

DerFräger schrieb:
> @Karlheinz:
> Das wäre zu schön, aber hier wird nur bei einem Protokoll zwischen zwei
> Seiten mitgehört. Ich kann nicht aktiv eingreifen.

Das heisst er parst einen kontinuierlichen Datenstrom mit.
Allerdings sollte es mit einem geeignetem Algorithmus trotzdem möglich 
sein auf ein Dutzend Schlüsselworte in Echtzeit zu prüfen. Er hat ja 
5000 - 7000 Takte pro neuem Zeichen.
Aber binäre Suche oder gar binärer Baum sehe ich da irgendwie nicht als 
Lösung, lass mich aber gerne hier belehren.
Gruß, Udo

von oszi40 (Gast)


Lesenswert?

>Aber binäre Suche oder gar binärer Baum sehe ich da irgendwie nicht als
>Lösung, lass mich aber gerne hier belehren.

WENN man z.B. Säcke von überflüssigen Nullen schon mal aussieben könnte, 
würde das die Datenmenge wesentlich reduzieren. Da ich aber Deine Daten 
nicht kenne, halte ich mich mit überflüssigen Ratschlägen jetzt zurück.

von Udo S. (urschmitt)


Lesenswert?

oszi40 schrieb:
> Da ich aber Deine Daten
> nicht kenne, halte ich mich mit überflüssigen Ratschlägen jetzt zurück.

Sind nicht meine Daten, sondern die vom TO, aber der hat dazu nichts 
rausgerückt.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Es gibt immer noch Dual-ported-RAM
http://www.cypress.com/?id=82
die haben Warnausgänge für "fast voll" oder "fast leer" und 
Hardware-Handshake über sogenannte Semaphore, die werden von der einen 
Seite gesetzt und der anderen rückgesetzt.

von max (Gast)


Lesenswert?

Grundsätzlich jedoch durfte sich der Erkennung als simple FSM 
herausstellen, bei der jeder Eingang eine Transition auslöst. Dabei sind 
3 Aufgaben zu lösen. Die Auswahl der Transition, das Setzen des neuen 
Zustands und die Überprüfung ob ein Akzeptanzzustand erreicht wurde.

Also eine Suche, ein Vergleich und eine Zuweisung. Das sollte in den zu 
Verfügung stehenden Takten erledigt werden können.

Der Aufwendige Punkt ist die Suche der Transition. Es kommt nun darauf 
an, in welcher Form dies geschieht. Wie schnell kann die richtige 
Transition gefunden werden? Suchalgorithmus? Fixe if-else oder 
geschachtelte switch codierung ersetzen?

Eine RegEx Suche auf 9.6kBit sollte keine Probleme bereiten. Da sollte 
eher massive Langeweile auftreten.

von Peter D. (peda)


Lesenswert?

Ich finde das Parsen im Interrupt viel zu kompliziert. Man muß sich ja 
nen Haufen merken bis zum nächsten Zeichen. Und damit geht wieder ein 
Haufen CPU-Zeit verloren, die Variablen zu sichern und wieder zu laden.

Ich puffere nur im Interrupt und das Main parst. Man kann höchstens noch 
das Protokoll soweit analysieren, daß der Interrupt weiß, wann ein Paket 
zuende ist und dann ein Flag setzen.
Wenn es z.B. ein Textprotokoll ist, prüft der Interrupt das Byte auf 
0x0A oder 0x0D, ersetzt es durch 0x00 und setzt das Flag.


Peter

von Purzel H. (hacky)


Lesenswert?

So ein Binaerbaum kann recht effizient implementiert werden. Pro daten 
byte 2 pointer zu 16 bit. Natuerlich ohne dynamisches Memorymanagement. 
Dann muesste man noch wissen ob der Suchbaum konstant oder dynamisch 
ist.

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.