Forum: Mikrocontroller und Digitale Elektronik Programmierung für Ringpuffer


von sandra m. (Firma: studentin) (sandra_m)


Lesenswert?

Hallo ihr Lieben!

Ich habe ein ganz großes Problem. Brauche bis Mittag ganz dringend eure 
Hilfe!

Mir bearbeiten eine Aufgabe, die einen Ringpuffer mit 20 Zeichen 
(LCD-Display) realisiert.
Ein Ringpuffer ist eine Speicherstruktur auf die mit zwei Pointern 
(Adressen) zugegriffen wird. Für diesen Versuch verwenden Sie bitte R10 
als Schreibpointer und R11 als Lesepointer. Der Schreibpointer zeigt auf 
die Stelle an der ein neues Element eingefügt
werden soll, während der Lesepointer auf das Element zeigt, das der 
Speicherstruktur entnommen werden kann.
Mit entsprechend zu erstellenden Funktionen können Daten im Ringpuffer 
abgelegt bzw. von dort entnommen werden.
Nachdem die Größe des Ringpuffers (Speicherbereichs) auf einen festen 
Wert begrenzt ist, muss bei drohendem Überlauf reagiert werden. Im 
Versuch ist dürfen entschriebene Daten nicht vor dem Auslesen 
überschrieben werden, d.h. es werden keine neuen Daten in den Puffer 
eingetragen.
Der Fall, dass mehr Daten entnommen werden sollen, als gültige verfügbar 
sind, ist ebenfalls auszuschließen.
Man kann sich durchaus auch andere Implementierungen eines Ringpuffers 
vorstellen (z.B. Überschreiben der ältesten Daten, falls der Puffer voll 
ist, oder gar dynamische Speicherplatzreservierung). Im Versuch 
beschränken wir uns auf die oben genannte Variante.


Mögliche Unterprogramme für die Umsetzung
add_new_element:
• fügt Element in Ringpuffer ein, sofern Platz ist
• Aktualisiert den Status
fetch_element:
• Entnimmt Element aus Ringpuffer, sofern was drin ist
• Aktualisiert den Status
show_status:
• Gibt den aktuellen Füllstand lesbar aus (HEX, LED, LCD, …)
clear_ringbuffer:
• Löscht Inhalt des Ringpuffers, z.B. zum Testen
• Setzt die Pointer zurück

Überlegen Sie sich eine Anwendung für den Ringpuffer und realisieren Sie 
ein einfaches Beispiel, das alle obigen funktionen anschaubar nutzt.

Kann mir bitte einer helfen? Ich verzweifle schon!

Vielen Dank schon mal!

Sandra

von dunno.. (Gast)


Lesenswert?

das ist doch hier nicht hausaufgabenhilfe.de... :/

auf dieser seite kriegst du in der regel höchstens ne konkrete frage zum 
verständnis oder zur realisierung beantwortet.

und da du scheinbar studierst, solltest du locker in der lage sein dir 
die infos zu holen.

mfg
dunno, auch student.

von Vlad T. (vlad_tepesch)


Lesenswert?

sandra meier schrieb:
> Kann mir bitte einer helfen? Ich verzweifle schon!

klar können wir helfen.
Das heißt aber nicht, dass wir deine Hausaufgaben machen.
Ohne eigene Lösungsansätze würde es aber genau darauf hinauslaufen.

Entweder du präsenierst hier, was du schon gemacht hast und stellst 
konkrete Fragen, oder du wirst hier nicht viel positiven Zuspruch 
erhalten.

sandra meier schrieb:
> Brauche bis Mittag ganz dringend eure Hilfe!

Tja, da hätte man eher anfangen sollen, oder?

edit:
nebenbei bemerkt steht die Lösung ja schon fast in der Aufgabenstellung.

von Martin H. (marrtn)


Lesenswert?

Vielleicht steh' ich ja auf dem Schlauch, aber ich kann mir gerade nicht 
vorstellen, einen Ringpuffer und ein LCD sinnvoll unter einen Hut zu 
bringen, aber naja...

Wo liegt denn das Problem?
Den Ringpuffer zu programmieren, oder ihn zu verwenden?
Welche Programmiersprache, welche Plattform?


Die Implementierung des Ringpuffers steht ja eigentlich schon da:

sandra meier schrieb:
> add_new_element:
> • fügt Element in Ringpuffer ein, sofern Platz ist
> • Aktualisiert den Status
> fetch_element:
> • Entnimmt Element aus Ringpuffer, sofern was drin ist
> • Aktualisiert den Status
> show_status:
> • Gibt den aktuellen Füllstand lesbar aus (HEX, LED, LCD, …)
> clear_ringbuffer:
> • Löscht Inhalt des Ringpuffers, z.B. zum Testen
> • Setzt die Pointer zurück

Jede Zeile Beschreibung lässt sich relativ einfach in ein paar wenige 
Anweisungen (in welcher Sprache auch immer) umsetzen.

von Michael (Gast)


Lesenswert?

Klingt nach ner Prüfung...
Und wenn du das nicht selber kannst, dann verdienst du die schlechte 
Note auch!

von Peter D. (peda)


Lesenswert?

sandra meier schrieb:
> Für diesen Versuch verwenden Sie bitte R10
> als Schreibpointer und R11 als Lesepointer.

Sehr schön, dann können wir ja richtig rumraten:

Da Register unter C keinen Sinn machen, solls vermutlich in Assembler 
sein.
Dazu müßte man allerdings erstmal den CPU-Typ wissen.
Ein AVR kanns nicht sein, da sind R10,R11 keine Pointer.
Ein 8051 kanns auch nicht sein, der hat nur R0..R7.
Ein ...
Ein ...
Ein ...

Und dann müssen wir bloß noch rumraten, ob es für das LCD ne Lib gibt, 
z.B. für die formatierte Zahlenausgabe und wie deren Funktionen alle 
heißen und wie sie aufgerufen werden.


Peter

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

sandra meier schrieb:
> Ich habe ein ganz großes Problem. Brauche bis Mittag ganz dringend eure
> Hilfe!

Warum sollte hier irgendeiner Deine Hausaufgaben erledigen oder beim 
Erschleichen einer Prüfungsleistung behilflich sein?

Wenn Du nicht in der Lage bist, die ausgesprochen ausführliche 
Aufgabenstellung selbst zu analysieren und zumindest die größten Teile 
eigenständig umzusetzen, hast Du das falsche Studienfach gewählt.

Wie schon von anderen Forenteilnehmern geschrieben, fehlen auch jegliche 
Angaben zu den Rahmenbedingungen wie z.B. Controller, 
Programmiersprache, und und und... Selbst wenn Dir jemand helfen wollte, 
fehlten ihm also viel zu viele Informationen.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Da Register unter C keinen Sinn machen, solls vermutlich in Assembler
> sein.

Oh, ich kenne einen Entwickler, der sich C mit Hilfe von 
Präprozessor-Makros zu einer Mischung aus FORTRAN und Assembler 
zurechtgebogen hat. Zwar verwendet er auch Hochsprachenkonstrukte wie 
for, while oder switch/case, nutzt sie aber nicht aus, weil er überall 
Label setzt und mit goto in die Schleifen hinein- und auch wieder 
herausspringt.

> Ein AVR kanns nicht sein, da sind R10,R11 keine Pointer.

Ein 68000 ist es auch nicht, denn das heißen die Adressregister Axx.

> Ein 8051 kanns auch nicht sein, der hat nur R0..R7.

Ein Z80 ist es auch ebenso wenig wie ein 6502. Ein x86? Nein, auch 
nicht.

Eigentlich kann es nur ein Prozessor aus der BEIN-Familie sein.

von oldmax (Gast)


Lesenswert?

Hi
> Ein AVR kanns nicht sein, da sind R10,R11 keine Pointer.
Wieso nicht ?
Man nehme einen Buffer als Variable und holt sich in das XH:XL-Register 
die Adresse. R11 und R12 setzt man als Offset ein.....
na ja, und da die Hausaufgabenabgabe scheinbar vorbei ist.... auch mal 
ein bischen Assembler
1
Write_in_Buf:                     ; schreiben in Ringpuffer
2
         CLR     R0
3
    LDI  XL,LOW(Buffer)
4
  LDI  XH,HIGH(Buffer)
5
         Add      XL, R10
6
         ADC      R0
7
         LDS      R17, <Wert>
8
         ST       X, R17
9
         INC      R10
10
         CPI      R10, <Grenzwert>
11
         BRLO     End_Write
12
         CLR      R10
13
End_Write:
14
RET
und die andere Seite....
1
Read_From_Buf:                     ; schreiben in Ringpuffer
2
         CLR     R0
3
    LDI  XL,LOW(Buffer)
4
  LDI  XH,HIGH(Buffer)
5
         Add      XL, R11
6
         ADC      R0
7
         LD       R17, X
8
         STS      <Wert>, R17
9
         INC      R11
10
         CPI      R11, <Grenzwert>
11
         BRLO     End_Read
12
         CLR      R10
13
End_Read:
14
RET
 Nun bleibt noch die Königsfrage: Wie erkennt man neue Daten im 
Ringpuffer ?
Gruß oldmax

von ???? (Gast)


Lesenswert?

oldmax schrieb:
>          ADC      R0
Fehlt da nicht ein Argument?

von oldmax (Gast)


Lesenswert?

Hi
>oldmax schrieb:
>>          ADC      R0
>Fehlt da nicht ein Argument?
Wer wird denn da gleich sooo pingelig sein ?
Klar, manchmal ist die Hand schneller als der Kopf oder umgekehrt.. aber 
das ist auch nicht der einzige Fehler.... egal, richtig ist
1
ADC      XH, R0
so, das ist schon mal geklärt....
Gruß oldmax

von Udo S. (urschmitt)


Lesenswert?

Ist schon spannend, dass die Guttenbergs in diesem Forum sich jetzt 
immer häufiger weibliche Aliasnamen geben seit hier mal einer gepostet 
hat daß Frauen hier eher geholfen wird.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

sandra meier schrieb:
> Für diesen Versuch verwenden Sie bitte R10
> als Schreibpointer und R11 als Lesepointer.
In C ginge das so:   ;-)
1
  char * R10;
2
  char * R11;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

In C ginge das wegen der sehr ungünstig gelegten Puffergröße (besser 
wäre eine Zweierpotenz wie 16, oder 32) z.B. so:
1
  char ring[20];
2
  int R10; // WR
3
  int R11; // RD
4
5
#define clear_ringbuffer() R11=R10;
6
7
  int add_new_element (char element) 
8
  {
9
     if (show_status()<19) {
10
        ring[R10]=element;
11
        R10++;
12
        if(R10==20) then R10=0;
13
        return 20-show_status(); // verbleibenden Speicherplatz zurückmelden
14
     }  
15
     else return -1;             // Fehler: kein Platz im Puffer
16
  }
17
18
  int fetch_element (char *data) 
19
  {
20
     *data = ring[R11];
21
     if (show_status()>0) {
22
        R11++;
23
        if(R11==20) then R11=0;
24
        return 1;                // Lesen OK
25
     }
26
     else return -1;             // Fehler: keine Daten im Puffer
27
  }
28
29
  int show_status(void) {
30
    if (R10>=R11) return R10-R11; 
31
    else          return 20+R10-R11;
32
  }
Ohne Gewähr. Um die verbliebenen Fehler zu finden, kannst du den 
Debugger verwenden...  ;-)
Wenn du eine andere Programmiersprache verwendest, dann musst du das nur 
von C dorthin übersetzen. Die Idee bleibt die selbe.

Noch eine abschliessende Frage: hat dir das jetzt geholfen?

von Oliver (Gast)


Lesenswert?

Ein Ringpuffer ist ja nun etwas, was es seit gefühlten 4 Milliarden 
Jahren gibt (also seit Anbeginn der IT-Zeitrechnung). Entsprechend 
vielfältig sind die fertigen (!!!) Codebeispiele, die eine beliebige 
Suchmaschine findet. Man muß es nur wollen...

Oliver

von Udo S. (urschmitt)


Lesenswert?

Oliver schrieb:
> Entsprechend
> vielfältig sind die fertigen (!!!) Codebeispiele, die eine beliebige
> Suchmaschine findet. Man muß es nur wollen...
und in der Lage sein die Lösung zu verstehen und auf seinen Prozessor 
und seine Programmiersprache anzupassen.
Aber in der Frage ist doch schon alles so vorgekaut, dass man fast nicht 
mehr denken muss. Wenn mans da nicht kann, dann kann man es auch nicht 
mit Beispielcode aus dem Netz. Zumindest nicht wenn es nicht exakt der 
Prozessor und identische Funktionen sind.
Falls das Uni Niveau sein soll, dann ist der TO aber ein absoluter 
Programmierverweigerer der Assemblerprogrammierung in einem Nebenfach 
machen muss.
Nachtrag: Vieleicht BWL ???? :-)

von Hannes L. (hannes)


Lesenswert?

Udo Schmitt schrieb:
> Ist schon spannend, dass die Guttenbergs in diesem Forum sich jetzt
> immer häufiger weibliche Aliasnamen geben seit hier mal einer gepostet
> hat daß Frauen hier eher geholfen wird.

Richtig! Und wenn man mit etwas Humor darauf hinweist, dann wird der 
Beitrag von einem übereifrigen humorlosen Moderator gelöscht:

> Beitrag #2545287 wurde von einem Moderator gelöscht.

Das macht aber nix, es reduziert lediglich meine Hilfsbereitschaft...

...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hannes Lux schrieb:
> von einem übereifrigen humorlosen Moderator gelöscht:
Könnte ja auch eine Moderatorin sein... ;-)
Denn lustigerweise bekommt man ja nicht mal mit, wer da den Beitrag 
gelöscht hat. Sonst könnte man unverbindlich nachfragen: Warum?

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.