Sie sind auf Seite 1von 5

Was ist ein Ringpuffer?

Ein Ringpuffer ist ein First In First Out (FIFO) Speicher. Er ist eine bestimmte Anzahl an Speicherstellen gro. Die Speicherstellen selbst knnen die unterschiedlichsten Datentypen haben (sowohl einfache, als auch zusammengesetzte). Es gibt 2 Pointer beim Ringpuffer. Einer zeigt auf die Stelle von der als nchstes gelesen werden soll, der andere auf die Stelle auf die als nchstes geschrieben werden soll.

Wie funktioniert ein Ringpuffer?

Ausgangssituation: Der Ringpuffer ist 6 Elemente gro. Durch die modulo-Operation wird der Ring geschlossen. Indexberechnung: (5+1) mod BUFLEN 0

Der Zeiger next_read zeigt auf die erste Stelle im Ringpuffer. Der Zeiger fr die Stelle von der als nchstes gelesen werden soll wird mithilfe des Wertes aus der Variable cnt berechnet.

Hier werden 4 Zeichen in den Puffer geschrieben. Der Counter erhht sich um 4 und next_read zeigt weiterhin auf dieselbe Stelle. Die nchste Position zum Einfgen wird mit (next_read+cnt)%BUFLEN berechnet.

Nun werden 3 Zeichen gelesen. Der Counter wird um 3 dekrementiert und next_read zeigt auf die Stelle, die als nchstes gelesen werden kann.

Es werden 3 Zeichen geschrieben. In Stelle 4 und 5 des Puffers wird geschrieben, somit ist man am Ende des Puffers angelangt und das 3te und letzte Zeichen wird auf Stelle 0 geschrieben, d.h. man beginnt wieder am Anfang des Puffers.

Es sollen wieder 3 Zeichen geschrieben werden. Dadurch, dass man nur 2 Speicherstellen beschreiben kann, muss ein Error ausgeben oder weitere Speicherstellen allokiert werden.

Nun wird wieder gelesen. 5 Zeichen werden aus dem Puffer geschrieben. Der Counter wird um 5 dekrementiert und next_read zeigt auf die Stelle, die als nchstes gelesen werden kann.

Das letzte Zeichen im Ringpuffer wird gelesen, somit ist der Counter=0 und die zwei Pointer zeigen wieder auf die gleiche Stelle(3).

Zugriff auf den Ringpuffer


Funktion Schreiben in Puffer Funktion Lesen von Puffer

bergabeparameter: quelle: Daten, die in den Ringpuffer geschrieben werden sollen. anzahl: Anzahl der Speicherstellen, die fr das beschreiben des Ringpuffers bentigt werden. return: none

bergabeparameter: ziel: Hier werden die gelesenen Daten gespeichert. Anzahl: Anzahl der Daten bzw. Speicherstellen, die man lesen mchte. return: none

Ringpuffer in Multitasking Systemen

Bei unserem Cing-Projekt(ab Phase 2) ist auch ein Ringpuffer in Verwendung. Es gibt zwei Tasks bzw. Threads. Einer ist fr die Erfassung der Daten und schreiben in den Ringpuffer zustndig und einer ist fr das Lesen der Daten vom Ringpuffer zustndig. Diese beiden Threads sind unabhngig voneinander. Das Problem jedoch hierbei ist, dass der Scheduler beide Threads auf einmal in die sog. critical region lsst und so sich gemeinsame Variablen, wie cnt und next_read willkrlich verndern knnen, was wir nicht wollen. Gelst wird das Problem mit einer sog. Semaphore(synchronized in JAVA und mutex in C)

Ringpuffer-Realisierung in C
Schreiben in den Puffer:

Lesen vom Puffer:

Ringpuffer-Realisierung in JAVA
Schreiben in den Puffer:

Lesen vom Puffer:

Quellen

Das könnte Ihnen auch gefallen