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?
Das Prinzip ist auf dieser Seite beschrieben http://de.wikipedia.org/wiki/First_In_%E2%80%93_First_Out
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.
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.
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?
>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...).
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.
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.
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.