Ringbuffer in C Speicheradressierung

Gast #2679209
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
Gast #2679227
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....
#2679243
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.
Gast #2679263
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
Gast #2679267
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? ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren