Forum: Mikrocontroller und Digitale Elektronik UART Ringbuffer in Worten


von Gast Gast (Gast)


Lesenswert?

Hallo

Ich möchte zum ersten mal den UART eines AVR verwenden.
In der Lib von Peter Flury und hier im Forum fällt immer wieder der 
Begriff Ringbuffer. Leider reichen meine C-Kenntnisse (noch) nicht aus 
um zu verstehen was der Ringbuffer ist und wie er funktioniert.

Kann sich jemand die Mühe machen und mir das in Worten erklären?

von tom (Gast)


Lesenswert?

Das Prinzip ist auf dieser Seite beschrieben
http://de.wikipedia.org/wiki/First_In_%E2%80%93_First_Out

von Karl H. (kbuchegg)


Lesenswert?

Folgende Situation:

Du hast eine Morsestation. Du weist schon, das Zeugs mit
Punkt und Strich.

Wenn dich jemand anmorst, dann piepst es in deiner Station
und du kannst die Nachricht deines Gesprächspartners hören.

Soweit so gut.

Jetzt bist du aber nicht immer an der Station, du willst
aber keine Sendung verpassen. Was tust du?
Anstelle des Piepsens lässt du einen Stift auf einem Streifen
Papier mitschreiben. Wenn du dann wieder kommst, brauchst du
nur deinen Papierstreifen kontrollieren und siehst ob und was
deine Station empfangen hat.

Du hast dadurch einen Buffer gebaut. Der Buffer nimmt empfangene
Zeichen auf und speichert sie zwischen, bis jemand kommt den
das Zwischengespeicherte interessiert.

Schön und gut.

Nur brauchst du jetzt jede Menge Papier.
Da du weist, dass du nie mehr als sagen wir mal 2 Stunden
weg sein wirst und in diesen 2 Stunden nie mehr als sagen wir
mal 50 cm Papierstreifen zur Zwischenspeicherung notwendig
sein wird, nimmst du einen 1 Meter (*) langen Papierstreifen
und klebst ihn zu einem Ring zusammen. Du hast magisches
Papier: Jedesmal wenn es beschrieben wird, verschwindet das
vorher an dieser Stelle Geschriebene auf magische Art und Weise.
Wenn du also x mal an derselben Stelle schreibst, ist immer nur
das zuletzt Geschriebene zu lesen.
Dein Papierstreifen läuft nach wie vor durch die Station durch und
der Stift schreibt nach wie vor schön brav mit. Nur wenn der
Papierstreifen 'zu Ende ist' beginnt der Stift automatisch
wieder am Anfang des Papierstreifens zu schreiben, weil du
ja den Papierstreifen zu einem Ring zusammengeklebt hast.

Das ist ein Ringbuffer.

(*) 1 Meter deshalb, damit man auch etwas Reserve hat, falls
die Aussage 'nie mehr als 50 cm' dann doch nicht so ganz korrekt
war.

von Karl H. (kbuchegg)


Lesenswert?

tom wrote:
> Das Prinzip ist auf dieser Seite beschrieben
> http://de.wikipedia.org/wiki/First_In_%E2%80%93_First_Out

Das ist kein Ringbuffer. Das ist eine Queue, auf deutsch
Warteschlange.

von Gast Gast (Gast)


Lesenswert?

Danke für die hervorragene Erklärung.

In der Interrupt Service Routine vom UART Empfang fülle ich also den 
Ringbuffer und wenn ich mal Zeit habe benutze ich die Daten, richtig?

von STK500-Besitzer (Gast)


Lesenswert?

>In der Interrupt Service Routine vom UART Empfang fülle ich also den
>Ringbuffer und wenn ich mal Zeit habe benutze ich die Daten, richtig?

Richtig. Nur sollte die Zeit zwischen den Auslesevorgängen dabei so kurz 
sein, dass dein Puffer nicht überlaufen kann.
Die Serielle Übertragung ist aber i.d.R. (wesentlich) langsamer als der 
Rest des Programms (Berechnungen und Auswertungen...).

von Simon K. (simon) Benutzerseite


Lesenswert?

Karl heinz Buchegger wrote:
> tom wrote:
>> Das Prinzip ist auf dieser Seite beschrieben
>> http://de.wikipedia.org/wiki/First_In_%E2%80%93_First_Out
>
> Das ist kein Ringbuffer. Das ist eine Queue, auf deutsch
> Warteschlange.

Hm, Ich würde eigentlich viel eher sagen, dass ein Ringbuffer ein Buffer 
des types "FIFO" ist.

Angenommen man hat eine Eingabe-Funktion und eine Ausgabe-Funktion als 
Schnittstelle zu unserem FiFo, dann ist es doch völlig egal was 
dahintersteckt. Hauptsache das Erste was hereingeladen wurde ist auch 
das Erste was herausgeholt wird. Und ob der FiFo durch einen Ringbuffer 
realisiert wird oder durch eine Warteschlange(Queue) ist doch 
prinzipiell egal.

von STK500-Besitzer (Gast)


Lesenswert?

Ein FIFO ist irgendwann voll. Ein Ringpuffer überschreibt u.U. die alten 
Daten.
Ein Ringpuffer ist i.d.R. als FIFO aufgebaut, da dessen Gegenstück ein 
LIFO wäre, was ja ein Stack wäre, und für diese Anwenudung nicht 
geeignet wäre.
Der Ringpuffer ist also eine spezielle FIFO-Form.

von Falk B. (falk)


Lesenswert?

@ STK500-Besitzer (Gast)

>Ein FIFO ist irgendwann voll. Ein Ringpuffer überschreibt u.U. die alten
>Daten.

Nöö, dann wäre er ja kaputt (Soft- oder Hardware)

>Ein Ringpuffer ist i.d.R. als FIFO aufgebaut,

Genau anders herum! Ein FIFO ist meist eigentlich immer als 
Ringbuffer aufgebaut, weil man da eben einen normalen Speicher (SRAM 
etc.) mit zwei Pointern und bissel Logik verwenden kann, und ohne 
ständiges Umkopieren einen leistungsfähigen FIFO erhält. GANZ am Anfang 
haben die FIOs ihre Daten einem grossen Schieberegister gehalten.

MfG
Falk

von Simon K. (simon) Benutzerseite


Lesenswert?

Falk Brunner wrote:
> Genau anders herum! Ein FIFO ist meist eigentlich immer als
> Ringbuffer aufgebaut, weil man da eben einen normalen Speicher (SRAM
> etc.) mit zwei Pointern und bissel Logik verwenden kann, und ohne
> ständiges Umkopieren einen leistungsfähigen FIFO erhält. GANZ am Anfang
> haben die FIOs ihre Daten einem grossen Schieberegister gehalten.

Genau so meinte ich das.

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.