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
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.
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.
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.
Klingt nach ner Prüfung... Und wenn du das nicht selber kannst, dann verdienst du die schlechte Note auch!
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
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.
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.
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
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
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.
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; |
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?
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
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 ???? :-)
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... ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.