Forum: Mikrocontroller und Digitale Elektronik Unterschied zw. Ringspeicher und FiFo


von Wasserprinz (Gast)


Lesenswert?

was ist Unterschied zwischen Ringspeicher und Fifo?

von Samuel C. (dragonsam)


Lesenswert?

Ein Ringspeicher ist ein spezieller FIFO.

von npn (Gast)


Lesenswert?

Wasserprinz schrieb:
> was ist Unterschied zwischen Ringspeicher und Fifo?

Weißt du, was FIFO heißt? "First In - First Out"
Daran kannst du dir schon die Wirkungsweise erklären.
Der FIFO ist linear. Bestimmte Anzahl Speicherplätze. Wird von einer 
Seite gefüllt und von der anderen gelesen.
Ringspeicher ist eben ein Ring. Kein Anfang und kein Ende. Es gibt einen 
Schreibzeiger und einen Lesezeiger.

von Pedant (Gast)


Lesenswert?

Wasserprinz schrieb:
> was ist Unterschied zwischen Ringspeicher und Fifo?

Der Begriff "FIFO" ist exakt definiert: Was zuerst reinkommt, kommt 
zuerst raus. Nicht mehr und nicht weniger.

Der Begriff "Ringspeicher" wird unterschiedlich genutzt:

a.) Als Synonym zu Fifo.

b.) Als ein Detail einer konkreten FIFO-Implementation oder anderer 
Funktionalität.

c.) Als zyklischer Speicher, bei dem alte Einträge durch neue ersetzt 
werden.

Beim "Ringspeicher" muss man immer aufpassen, was der Autor meint bzw. 
den Kontext mit einbeziehen.

von c-hater (Gast)


Lesenswert?

Wasserprinz schrieb:

> was ist Unterschied zwischen Ringspeicher und Fifo?

Das ist wie die Frage nach dem Unterschied zwischen einer Straße und 
einer Autobahn.

Klar, auch die Autobahn ist eine Straße. Sie ist darüber hinaus so 
ziemlich die beste denkbare Inkarnation einer Straße.

Ganz ähnlich ist das mit FIFO vs. Ringspeicher. Ein Ringspeicher ist so 
ziemlich die effizienteste Implementierung für einen FIFO. Das ist schon 
alles.

von Ich (Gast)


Lesenswert?

Die Frage ist: Was passiert, wenn FIFO oder Ringspeicher voll sind?
Ringspeicher: Erster Wert wird überschrieben
FIFO: Letzter wert wird verworfen

von Wasserprinz (Gast)


Lesenswert?

Was ist denn besser - ein Fifo oder ein Rinkspeicher?

von Pedant² hoch 2 (Gast)


Lesenswert?

Wasserprinz schrieb:
> Was ist denn besser - ein Fifo oder ein Rinkspeicher?

Ein Ringpuffer.
http://de.wikipedia.org/wiki/Ringpuffer#Implementierung_als_Ringpuffer

von Wasserprinz (Gast)


Lesenswert?

Aber was ist, wenn beide Zeiger aufeiander liegen?

von ?!? (Gast)


Lesenswert?

Wasserprinz schrieb:
> Aber was ist, wenn beide Zeiger aufeiander liegen?

Dann gilt er als leer.

von Christian K. (the_kirsch)


Lesenswert?

so implementiere ich immer einen FIFO als Ringspeicher:
1
#define FIFO_SIZE 8
2
3
struct {
4
  uint8 r;
5
  uint8 w;
6
  myDataType d[FIFO_SIZE];
7
} fifo = { 0, 0, { } };
8
9
10
int isEmpty(void) {
11
  return fifo.r == fifo.w;
12
}
13
14
int isFull(void) {
15
  return (fifo.w + 1) % FIFO_SIZE == fifo.r;
16
}
17
18
void put(myDataType d) {
19
  fifo.d[fifo.w] = d;
20
  fifo.w = (fifo.w + 1) % FIFO_SIZE;
21
}
22
23
myDataType get(void) {
24
  myDataType d = fifo.d[fifo.r];
25
  fifo.r = (fifo.r + 1) % FIFO_SIZE;
26
  return d;
27
}
Bei einer FIFO-Größe von n = 2 hoch x ist es am efferentesten, da die 
Modulu-Operation durch eine Bit-Maskierung ersetzt werden kann.

Maximal kann man n - 1 Einträge speichern. Würde man ihn ganz voll 
machen, gäbe es keinen unterschied zwischen voll und leer Bedingung.

: Bearbeitet durch User
von !!?!! (Gast)


Lesenswert?

Wasserprinz schrieb:
> Aber was ist, wenn beide Zeiger aufeiander liegen?

Dann gibts ein paar Monate später ein paar Zeigerkinder,

von Oldie (Gast)


Lesenswert?

Was ist besser?
Die Antwort ist eine neue Frage: Was ist dir wichtiger?

Werden beim FiFo die neu dazugekommenen Werte nicht rechtzeitig
abgeholt, werden diese neuen Werte irgendwann den gesamten
Speicherraum vollschreiben und dann ALLE möglichen (!) Tabellen
und Variablen im Speicher verändern.
Das Programm macht dann nur noch Blödsinn und schmiert
irgendwann ab.

Wird der Rigspeicher nicht rechtzeitig ausgelesen, fehlen
ein paar Werte in der Abfolge der dazugekommenen Werte.
Das Programm macht Fehler, weil die Daten aus dem Ringspeicher
Lücken haben, läuft aber sonst stabil.

von Joe F. (easylife)


Lesenswert?

Oldie schrieb:
> Werden beim FiFo die neu dazugekommenen Werte nicht rechtzeitig
> abgeholt, werden diese neuen Werte irgendwann den gesamten
> Speicherraum vollschreiben und dann ALLE möglichen (!) Tabellen
> und Variablen im Speicher verändern.
> Das Programm macht dann nur noch Blödsinn und schmiert
> irgendwann ab.

Passiert nur bei Leuten, die nicht programmieren können.
Andere implementieren ein FIFO full Signal, und sorgen dafür, dass ein 
FIFO nicht voller als voll werden kann.

von Erich (Gast)


Lesenswert?

@Oldie
Deine Erklärung benennt Probleme einer falschen oder unvollständigen 
SW-Implementierung eines FIFO.
Es gibt Fifo-Rams aber auch als HW-Bauteile.

Und dort ist es so, wie bereits beschrieben wurde:
Ist der Speicher voll, so ist jeder weitere Schreibzyklus unschädlich, 
wird aber nicht ausgeführt, d.h. der einzuschreibende Datenwert geht 
verloren. Hierbei wird NICHTS bestehendes im Speicher überschrieben.
SW-Implementierungen sollten das auch so machen, wenn sie sich "Fifo" 
nennen.

Hier Link auf Tabelle mit vielen Fifo-Rams
http://www.mouser.de/Semiconductors/Memory/FIFO/_/N-488uv

Und hier konkret beispielhaft ein Bauteil mit 1 k x 9 Bit , das "7202" , 
ein eher einfaches und langsames Bauteil, aber eben mit überschaubarem 
Datenblatt:
http://www.idt.com/document/dst/720072017202-datasheet

Gruss

von Erich (Gast)


Lesenswert?

Ok, mein Text kam zu spät.
Hat aber dafür die Links.

von Georg (Gast)


Lesenswert?

Erich schrieb:
> Es gibt Fifo-Rams aber auch als HW-Bauteile

Fifo ist ja auch eine rein funktionelle Beschreibung. Die Warteschlange 
am Flughafenschalter ist auch ein FIFO, zumindest wenn sich alle 
benehmen können. In Software ist ein Ringspeicher eine gute 
Implementierungsmöglichkeit (im Flughafen eher nicht), man kann es aber 
auch beliebig anders lösen, solange die FIFO-Eigenschaft gegeben ist.

Was in einem Hardware-FIFO drinsteckt, weis man meistens nicht, aber ich 
schätze kein Ringspeicher.

Georg

von Joe F. (easylife)


Lesenswert?

Georg schrieb:
> Was in einem Hardware-FIFO drinsteckt, weis man meistens nicht, aber ich
> schätze kein Ringspeicher.

Selbstverständlich doch.
Wie denn sonst? Speicher bei jedem Zugriff komplett umkopieren?

http://electrosofts.com/verilog/fifo.html

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Joe F. schrieb:
> Selbstverständlich doch.
> Wie denn sonst? Speicher bei jedem Zugriff komplett umkopieren?

Und selbstverständlich doch.

Es gibt durchaus in Hardware implementierte FIFOs auf Basis von 
Schieberegistern, z.B. bei Speicheroszilloskopen und insbesondere 
natürlich bei Kommunikationsschnittstellen.

von Carsten R. (kaffeetante)


Lesenswert?

Joe F. schrieb:
> Wie denn sonst? Speicher bei jedem Zugriff komplett umkopieren?

Was in diesem Fall eine einfache Shiftoperation wäre.

Da ist die Frage was einfacher zu bauen ist und was man braucht bzw 
will. Die Anforderungen entscheiden wesentlich was man nimmt. Das 
wiederum entscheidet wesentlich was produziert wird.

Eine einheitliche Bauform mehrfach auf dem DIE anzuornen und simpel in 
Reihe zu schalten ist einfacher als die Speicherzellen durch einen 
Schreib- und einen Lesezeiger zu Adresieren und dann, in Relation zur 
Shiftoperation gesehen, entsprechend komplex darauf zuzugreifen. Der 
Ring hat also nicht nur Vorteile.

Was besser oder einfacher ist, hängt unter anderem von der Verwendung 
ab. Ferner lohnt sich bei sehr kleinen FiFos der zusätzliche Aufwand für 
den Ringspeicher eher weniger.

von Georg (Gast)


Angehängte Dateien:

Lesenswert?

Joe F. schrieb:
> Selbstverständlich doch.
> Wie denn sonst? Speicher bei jedem Zugriff komplett umkopieren?

Wie man nur immer so sicher sein kann, dass die eigene Meinung die 
einzig richtige ist. Siehe Bild, da rippeln die Daten durch.

Georg

von Carsten R. (kaffeetante)


Lesenswert?

Was ein sehr schönes Beispiel für einen kleinen FiFo ist. Bei dieser 
Größenordnung überlegt man sich zwei mal ob man den größeren Aufwand für 
den Ring betreibt. Das kann man machen, aber ohne weiteren Druck / 
Bedarf ist es oft nicht nötig.

von Bastler (Gast)


Lesenswert?

FIFO <> Schieberegister!
Auch wenn das Ding nicht 1 sondern 8(9) Bit breit ist: wenn ich einen 
Wert schreibe, dann will ich den auch gleich wieder lesen können und 
nicht warten, bis die Schlange voll ist.

von Carsten R. (kaffeetante)


Lesenswert?

Das ist ein besonderer FiFo der eines Lesezeigers oder einer Alternative 
Bedarf um diese Aufgabe zu erfüllen (siehe weitere Anforderungen). Ein 
Schiebergister ist auch ein FiFo, aber eine andere Implementierung mit 
anderen Zusatzeigenschaften als der Ringpuffer.

Oft will man zwar das was Du da schreibst, es ist aber nicht immer die 
Grundanforderung. Wenn Texas Instruments, dessen Datenblatt habe ich 
halt zuerst vom 74S722 erwischt, das Ding FiFo nennt, so werden die das 
wohl nicht völlig aus der Luft gegriffen haben. ;-)

Das Ding heißt FiFo. First in First out. Es heißt nicht First in at once 
out on demand.

Und auch das könnte man anders als einen Ringspeicher realisieren, 
beispielsweise als ein Shiftspeicher mit Lesezeiger, welcher dem ersten 
Datum folgt und ohne Schreibzeiger.

Oft baut man in der konkreten Realisierung einer Lösung weitere 
Eigenschaften in die Lösung mit ein. Diese werden dadurch aber nicht 
Bestandteil der Problemstellung. Daher sollte an das auch nicht als 
selbstverständlich mit einbeziehen. Ein konkreter FiFo hat konkrete 
Eigenschaften je nach Realisierung.

Die Klasse der FiFos hat ihren Namen aber von der Aufgabenstellug und 
allgemeinen Anforderung. Wird nur die FiFo-Eigenschaft gefordert ist die 
Bandbreite der Lösungsmöglichkeiten weiter als nur dieser eine Weg.

: Bearbeitet durch User
von Bastler (Gast)


Lesenswert?

Genau FIFO, nicht First n times In, then First Out. Natürlich ist ein 
(seriell in/seriell out) Schieberegister auch ein FIFO, aber eben ein 
sehr spezielles.
FIFO's benutzt man um Geschwingigkeitsunterschiede zwischen 
verschiedenen Baugruppen auszugleichen. Wenn die eine Seite 
kontinuierlich 1Mb/s aufnehmen kann, aber die andere Seite Bursts von 
10Mb/s liefert. Wichtig ist nur, daß die Dauerrate unter 1Mb/s bleibt 
und ein Burst immer in den FIFO paßt. Und sobald was drinsteht muß es 
auch rauszulesen sein.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Bastler schrieb:
> FIFO's benutzt man um Geschwingigkeitsunterschiede zwischen
> verschiedenen Baugruppen auszugleichen.

Dies ist eine Anwendungsmöglichkeit. Es handelt sich aber nicht um die 
Definition des FIFOs.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Bastler schrieb:
> FIFO <> Schieberegister!

Niemand hat behauptet, dass es sich um ein- und dasselbe handelt. Es ist 
jedoch möglich, bestimmte Formen von FIFOs mit Hilfe entsprechender 
Schieberegister zu implementieren.

> Auch wenn das Ding nicht 1 sondern 8(9) Bit breit ist: wenn ich einen
> Wert schreibe, dann will ich den auch gleich wieder lesen können und
> nicht warten, bis die Schlange voll ist.

Es ist völlig irrelevant, was DU willst. Der Rest der Welt wird sich 
mit Sicherheit nicht Deinen Wünschen anpassen.

Die Definition von FIFO besagt ausschließlich, dass die zuerst 
geschriebenen Daten gelesen werden. Weitere Aussagen folgen nicht 
unmittelbar aus der Definition. Insbesondere folgt auch nicht 
unmittelbar aus der Definition, dass das Schreiben und Lesen überlappend 
stattfinden dürfen.

Dass natürlich für konkrete Anwendungsfälle noch weitere Anforderungen 
an den FIFO gestellt werden müssen, ist hingegen offensichtlich, z.B. 
simultanes Lesen und Schreiben. Und es gibt auch FIFO-Implementationen, 
die dies auch erfüllen.

von Carsten R. (kaffeetante)


Lesenswert?

Bastler schrieb:
> Genau FIFO, nicht First n times In, then First Out. Natürlich ist ein
> (seriell in/seriell out) Schieberegister auch ein FIFO, aber eben ein
> sehr spezielles.

Richtig. Dieses FiFo arbeitet so und ist damit ein spezielles FiFo. Das 
Gleiche gilt für deine spezielle Anforderung. Diesen beiden und dem 
Ringpuffer ist die generelle FiFo-Eigenschaft gemein. Also sind das 
alles FiFos, aber für unterschiedliche Aufgaben konstruiert und damit 
auch nicht immer gleichsam gut geeignet. Es ist nur die FiFo-Eigenschaft 
durch den Begriff gefordert.

Weitere Eigenschaften können hinzukommen, müssen aber nicht.!

Du beschreibst die Anwendung in der ein Datenstrom mit einer mittleren 
Datenrate X und schnellen Bursts auf ein anderes "Medium" mit einer für 
X  ausreichend hohen mittleren Daterate übertragen werden soll, welches 
aber nicht notwendig die Bursts ausreichend schnell verarbeiten kann.

Das ist eine mögliche Problemstellung.

Weitere Beispiele:

PIN-Eingabe am Handy oder Bankautomaten etc.
Befehlseingabe in der Shell

Beides wäre mit einem Shift-FiFo Lösbar. Allerding bietet dieses keine 
Korrekturmöglichkeit. Die Eingabe müßte komplett neu erfolgen. Läßt man 
dies außer Acht, so lautet hier die Kernanforderung:

Sammle die Eingabedaten und liefere sie (dann) in richtiger Reihenfolge 
ab.

Darin ist kein Verbot einer Latenz, eines zeitlichen Versatzes, 
enthalten. Manchmal ist der zeitliche Versatz sogar gefordert um das 
Gegenteil von deiner Anforderung zu erreichen. Daten werden langsam 
gesammelt und dann in einem Rutsch abgeholt.

Zu Modemzeiten hat an den Empfangspuffer oft manuell konfiguriert. Da 
wurde nicht jedes Byte einzelnd abgeholt. Dann gab es noch den 
Block-Mode bei Festplatten. Daten wurden (langsam) von der Scheibe 
gelesen und dann in einen Burst weitergeschckt, um den Bus nur kurz zu 
belegen und die Anzahl der Transfers gering zu halten.

Es gibt mit Sicherheit auch noch andere, bessere Beispiele für den 
Shift-FiFo. Ich hab nur gerade keines im Kopf parat.

: Bearbeitet durch User
von Oldie (Gast)


Lesenswert?

Hier sind ja Super-Schlaumeier unterwegs, die FiFos nur als
Vorschul-kompatible Implementation in Form eines Ringspeichers o.ä.
kennen.

Bei Stack-Overflow (ein originärer FiFo-Effekt) wird dann wohl
nach Mama gerufen!

Hier wurde nach den Vor- und Nachteilen von FiFo und Ringspeicher
(Nichts anderes angegeben: Also die Ur-Implementation!)
gefragt - nicht nach gezähmten Varianten, die sie nicht mehr
unterscheidbar machen!

von Pedant² hoch 2 (Gast)


Lesenswert?

Oldie schrieb:
> Bei Stack-Overflow (ein originärer FiFo-Effekt) wird dann wohl
> nach Mama gerufen!

Was meinst du damit? Ich hoffe nicht das, was da steht.

von Rudolph (Gast)


Lesenswert?

Stack ist LiFo, oder? :-)

Und dann gibt es noch FiNo. :-)

von Carsten R. (kaffeetante)


Lesenswert?

Und dann gibt es noch Fimo. :P

von Werner (Gast)


Lesenswert?

Georg schrieb:
> Was in einem Hardware-FIFO drinsteckt, weis man meistens nicht, aber ich
> schätze kein Ringspeicher.

Jeder RAM kann zusammen mit einem Adresszähler als Ringspeicher der 
Länge 2^n verwendet werden, wobei n die Anzahl der verwendeten 
Adressbits ist.

von Carsten R. (kaffeetante)


Lesenswert?

Ich glaube nicht, daß er das mit Hardware-FiFo meinte, sondern eher 
einen einzelnen IC oder einen in einem größeren IC integrierten FiFo

von Bastler (Gast)


Lesenswert?

Hätte ich mir doch blos nicht diese Schieberegisterschaltung angeschaut!

von Carsten R. (kaffeetante)


Lesenswert?

Ist doch alles ok.

Dadurch wurde das Thema vertieft und man weiß nun, daß es viele 
unterschiedliche FiFo-Implementierungen gibt, zu denen auch Ringspeicher 
und Schieberegister gehören.

von Georg (Gast)


Angehängte Dateien:

Lesenswert?

Bastler schrieb:
> Hätte ich mir doch blos nicht diese Schieberegisterschaltung angeschaut!

Offensichtlich hat niemand diese Schaltung verstanden - meinst du das?

Es ist eben kein normales Schieberegister: hat man ein Wort reingeladen, 
so wird Output Ready und man kann mit dem Auslesetakt das erste 
reingeladene Wort bereits auslesen, und nicht wie bei einem 
Schieberegister erst nach 16 Takten. Also ist es genau das, was der TO 
unter FIFO versteht (was nichts dran ändert, dass ein einfaches 
Schieberegister auch ein FIFO im weiteren Sinn ist).

Siehe beigefügtes Timing Diagramm. Zugegebenerweise handelt es sich 
nicht um eine besonders einfache Schaltung.

Georg

von Bastler (Gast)


Lesenswert?

Ich sehe da was anderes. Das ist ein Schieberegister mit getrenntem "In" 
und "Out" Takt. Erst wenn alle 16 drin stehen, kommt auch was raus. So 
sagt das zumindest das Diagramm. Aber was soll's. Ist eh uninteressant. 
Wer verbaut schon noch so was.

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.