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
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:
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.
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.
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....