Forum: PC-Programmierung Ringbuffer in C Speicheradressierung


von Mark (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Mark (Gast)


Lesenswert?

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

von dunno.. (Gast)


Lesenswert?

let me google that for you:

http://de.wikipedia.org/wiki/Warteschlange_(Datenstruktur)#Ringpuffer

damit ist doch alles klar?

von Bananen Joe (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Uwe (de0508)


Angehängte Dateien:

Lesenswert?

Hallo,

hier mal ein Beispiel, für einen Fifo für mehrere Puffer.

Die Datei fifo.ch, enthält fifo.h und fifo.c.

_

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

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??

von Mark (Gast)


Lesenswert?

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

von Noname (Gast)


Lesenswert?

>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? ;-)

von Uwe (de0508)


Lesenswert?

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.

von Uwe (de0508)


Angehängte Dateien:

Lesenswert?

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);

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

du darfst das - nomen est omen!

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.