Hallo Leute, ich sitze hier gerade vor einer Aufgabe und habe wohl ein ganz grundliegendes Verständnisproblem. Ich soll ein Ringbuffer in C programmieren, der bekommt 8Bit übergeben und soll diese Speichern. Andere Programme können die Werte auslesen und verändern den Zeiger selber. Wenn ein Wert in den Buffer geschrieben wurde, wird eine 1 zurückgegenen, wenn er voll ist eine 0. Alles ganz einfach soweit. Aber jetzt habe ich ein paar Adressen vorgegeben bekommen, mit denen ich nicht viel anfangen kann. Buffer 0005:0000H bis 0005:00FFH ENDE 0006:0000H und 0006:0001H Spitze 0006:0002H und 0006:0003H Wie muss ich mir das Vorstellen sind Ende und Spitze einfach Adressen von Zeigern die auf die Stellen im Buffer zeigen? Wenn ja wie setze ich das um, also wie kann ich vorgeben an welcher Speicherstelle ein Zeiger gespeichert wird mit MK_FP sage ich ja nur wo der Zeiger hinzeigen soll? Gruß und DANKE schonmal
Mark schrieb: > Buffer 0005:0000H bis 0005:00FFH > ENDE 0006:0000H und 0006:0001H > Spitze 0006:0002H und 0006:0003H Wenn das C sein soll, habe ich auch ein Verständnisproblem.
Klaus Wachtler schrieb: > Mark schrieb: >> Buffer 0005:0000H bis 0005:00FFH >> ENDE 0006:0000H und 0006:0001H >> Spitze 0006:0002H und 0006:0003H > > Wenn das C sein soll, habe ich auch ein Verständnisproblem. nein das ist aus der Augabenstellung
let me google that for you: http://de.wikipedia.org/wiki/Warteschlange_(Datenstruktur)#Ringpuffer damit ist doch alles klar?
Du musst nen Pointer auf die Start- und Endaddresse des Buffer setzen. Dann nimmst du einen Schreibpointer den du zum Starten auf die Startsdr. setzt und nach dem Schreiben inkrementierst. Solange der Schreibpointer kleiner als die Endadr. ist, gibt die Schreibroutine 0 zurück, sonst 1. Beachte aber, dass du vorher noch den Speicherbereich den du für den Buffer nutzt bekannt machen musst, damit der Kompiler weiss, dass er genutzt wird und ihn für dich reserviert. Deklaration:
1 | void &ptrStart, &ptrEnd, &ptrRead, &ptrWrite; |
2 | ptrStart = 327.680; |
3 | ptrEnde = ptrStart + 0xFF; |
4 | ptrWrite = ptrStart; |
Schreiben:
1 | *ptrWrite = Datensatz; |
2 | ptrWrite++; |
3 | if(ptrWrite < ptrEnde) |
4 | {
|
5 | return 0; |
6 | }
|
7 | else
|
8 | {
|
9 | return 1; |
10 | }
|
Den Rest musste selber machen....
Mark schrieb: > Klaus Wachtler schrieb: >> Mark schrieb: >>> Buffer 0005:0000H bis 0005:00FFH >>> ENDE 0006:0000H und 0006:0001H >>> Spitze 0006:0002H und 0006:0003H >> >> Wenn das C sein soll, habe ich auch ein Verständnisproblem. > > nein das ist aus der Augabenstellung Und was interessiert es mich, wo der Compiler die Variablen im Speicher ablegt? Buffer ist ein 256 Bytes grosses Array ENDE ist eine 2 Byte Variable (wahrscheinlich ein int) Spitze ist ebenfalls eine 2 Byte Variable. Wo der Compiler die in den Speicher legt, an welchen absoluten Adressen, ist mir doch herzlich egal. Es sei denn natürlich, dass die Adresslage vorgegeben ist, weil die von einem anderen externen Modul eben so festgelegt wurden. Dann muss ich den Compiler dazu bringen, die Variablen genau auf diese Adressen zu bringen. Aber davon hast du ja nichts geschrieben.
Hallo, hier mal ein Beispiel, für einen Fifo für mehrere Puffer. Die Datei fifo.ch, enthält fifo.h und fifo.c. _
Uwe S. schrieb: > hier mal ein Beispiel, für einen Fifo für mehrere Puffer. dir ist aber schon klar, daß ein FIFO was anderes ist wie ein Ringpuffer??
Danke schonmal für all eure Antworten Karl Heinz Buchegger schrieb: > Buffer ist ein 256 Bytes grosses Array > ENDE ist eine 2 Byte Variable (wahrscheinlich ein int) > Spitze ist ebenfalls eine 2 Byte Variable. > > Wo der Compiler die in den Speicher legt, an welchen absoluten Adressen, > ist mir doch herzlich egal. > > Es sei denn natürlich, dass die Adresslage vorgegeben ist, weil die von > einem anderen externen Modul eben so festgelegt wurden. Dann muss ich > den Compiler dazu bringen, die Variablen genau auf diese Adressen zu > bringen. Aber davon hast du ja nichts geschrieben. Wie gesagt. Das Prinzip Ringbuffer habe ich verstanden . Es geht genau um das was du im letztem Absatz schreibst. Die Adresslage ist vorgegeben! Genau damit habe ich meine Probleme. Wie sage ich dem Compiler, dass die Adresse meines Pointers 0006:0001 sein soll? Habe selber gemerkt, dass meine Fragestellung nicht unbedingt eindeutig ist sorry
>Wie sage ich dem Compiler, dass die Adresse meines Pointers 0006:0001 sein >soll?
Nun, selbst wenn Du nicht oder nicht genau verstanden hast, wie das
geht, solltest Du zumindest wissen, das dazu irgendwas manipuliert
werden muss und was das genau ist. Wir können uns auch denken was das
ist. Aber dazu gibt es mehrere Methoden, deren Anwendbarkeit von dem
konkreten Compiler und Linker abhängt die verwendet werden sollen.
Was genau hat Dich denken lassen das diese Information für Dich (und
damit für uns) irrelevant ist? ;-)
Wegstaben Verbuchsler schrieb: > FIFO First In First Out das macht die Routine. Du meinst bestimmt LIFO, die sich als Stack darstellen lassen. Man hat dann Funktionen dieser Art: Push, Pop und Top.
Hier mal ist eine Interpretation deiner Aufgabe.
1 | static fifo_buffer_t * my_fifo = (fifo_buffer_t*)(0x00050000); |
Im im Anhang mein geänderter Code zu der o.g. Fragestellung. Edit der Anhang hat noch einen Fehler im Abschnitt.
1 | .. my_fifo = (fifo_buffer_t*)(0x00050000); |
Uwe S. schrieb: > Du meinst bestimmt LIFO, guten Morgen liebe Sorgen ... ja, ich war gedanklich beim Stack (lifo). Naja, ist ja sprachlich nicht allzuweit vom fifo entfernt, und heute ist Vatertag....
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.