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.
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.