mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Ringbuffer in Worten


Autor: Gast Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: tom (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...).

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.