Forum: Mikrocontroller und Digitale Elektronik Pufferstrategie für AVR-Oszilloskop


von Walter Tarpan (Gast)


Lesenswert?

Hallo zusammen,
für ein Projekt mit einem AVR und einem Grafik-LCD will ich eine 
Oszilloskopanzeige implementieren. Das Ganze ist kein Selbstzweck, 
sondern nur eine Anzeigeoption für einen dynamischen Regelvorgang, der 
schon auf dem AVR implementiert ist.
Ich habe also Werte, die äquidistant in einem Interrupt erzeugt werden, 
und von denen die letzten N (z.B. N=128) Werte in einer 
nicht-zeitkonstaten Hauptschleife dargestellt werden. Während der 
Anzeige in der Hauptschleife werden im Interrupt sicherlich mehrere neue 
Werte erzeugt.

Momentan suche ich noch nach der geeigneten Pufferstrategie: Im 
Interrupt muß ein Puffer A gefüllt werden, in der Hauptschleife muß ein 
anderer Puffer B abgearbeitet werden, der zeitlich konstant ist. Wenn 
dieser Puffer B mit weniger als N Werten gefüllt ist, müssen der auch 
noch mit Werten aus einem vorherigen Durchgang von Puffer A oder älteren 
Werten aus Puffer B aufgefüllt werden. Also bräuchte ich wohl eine 
Dreifachpufferstrategie?

Es müßte sich ja eigentlich um ein Standardproblem mit Standardlösungen 
handeln: Ich will immer N letzte Werte unverändert anzeigen - wenn in 
der Zwischenzeit mehr als N Werte erzeugt werden können die ältesten 
verworfen werden, eine Abarbeitung darf dagegen nicht die alten Werte 
entfernen. Ist Dreifachpufferung die richtige Strategie oder habe ich 
etwas einfacheres übersehen?

Viele Grüße
W.T.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

denk mal über einen Ringpuffer nach

Das ist eine Pointerlösung auf ein array
Ein Pointer zeigt den aktuellen gültigen Bereich zum auslesen und ein 
Pointer zeigt auf den zu schreibenden Bereich. Wenn der Pointer am Ende 
angekommen ist wird er auf den Anfang gesetzt.

von Nicolas S. (Gast)


Lesenswert?

René D. schrieb:
> denk mal über einen Ringpuffer nach

Mit einem einfachen Ringpuffer wird das nicht funktionieren - 
schließlich habe ich nichts, was sicherstellt, daß sich der Inhalt des 
Puffers während der Darstellung nicht ändert.

von Nicolas S. (Gast)


Lesenswert?

Es sei denn der Ringpuffer ist so groß, daß sichergestellt ist, daß 
immer an einer ganz anderen Stelle geschrieben wie gelesen wird. Aber ob 
das auf einem AVR eine gute Idee ist?

von Walter Tarpan (Gast)


Lesenswert?

Es ist keine gute Idee. Der Interrupt, der die Werte bereitstellt, hat 
eine Periode von 50µs. Die Anzeige hat eine Periode von 20ms. Der Puffer 
müßte dann mehr als 100000 Bytes lang sein, damit er sicher nicht 
während der Darstellung durchlaufen wird. Für 128 Bytes 
Darstellungslänge.

Aber diese Beispielrechnung hat mir zumindest die Augen geöffnet, daß 
der Fall, daß der Puffer nicht ausreichend gefüllt ist gar nicht 
vorkommen kann- eine Doppelpufferstrategie mit 2x128 Bytes reicht also.

Viele Grüße
W.T.

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.