Forum: Compiler & IDEs Buffer mit variabler Framelänge so möglich?


von Fabian (Gast)


Lesenswert?

Hallo,

ich möchte einen Buffer für einen Datenempfang basteln, der 
unterschiedliche Framelänge hat.

Aussehen tut das ganze momentan von der Definition so:

volatile static struct frameElement
{
  uint8_t  dataByte;
  frameElement* nextFrameByte;
};

volatile static struct bufferElement
{
  frameElement frame;
  bufferElement* nextFrame;
};

bufferElement receiveBuffer = {{0,NULL},NULL};

Das 'Problem' hierbei ist, dass ich zwar Bufferelement in eine feste 
Größe pressen kann und somit kein Speicher mehr freigeben muss, meine 
frameElemente sind aber bewusst unterschiedlich lang, d.h. ich müsste 
diese Speicher dann immer wieder freigeben. Ist die realisierung auf 
einem arm ähnlichen Controller hier so sinnvoll? Funktioniert die 
Freigabe mit free() ? Oder sollte ich das ganze lieber mit Arrays und 
einer festen maximalen Framelänge lösen?

Vielen Dank für eure Hilfe im Vorraus.

von Sven (Gast)


Lesenswert?

Also ich mache so was ähnliches mit malloc() und free() und bei mir 
klappt's ganz gut. Ist dann wie eine verkettete Liste, wenn ich mich 
nicht täusche.

von Karl H. (kbuchegg)


Lesenswert?

Fabian schrieb:

> Das 'Problem' hierbei ist,

Das Problem ist, dass du für jedes Nutzbyte ein paar Bytes (4?) für 
einen Pointer verbrauchst.

> Größe pressen kann und somit kein Speicher mehr freigeben muss, meine
> frameElemente sind aber bewusst unterschiedlich lang, d.h. ich müsste
> diese Speicher dann immer wieder freigeben.

Ja. So ist das wenn man die Speicherfläche an die tatsächliche 
Datengröße anpassen will

> Ist die realisierung auf
> einem arm ähnlichen Controller hier so sinnvoll?

Auch auf einem arm ist das so nicht sinnvoll.
Man könnte höchstens in ein frameElement mehr als nur ein einziges Byte 
reinpacken, damit der Speicherverschnitt nicht so hoch ist.

Aber auch das ist im Grunde mit Kanonen auf Spatzen geschossen. Wenn du 
sowieso dynamisch allokierst, dann sammle erst einmal alle Daten in 
einem anderen Buffer, allokiere eine entsprechend große SPeicherfläche, 
dort kopierst du die Daten hin und ein Pointer auf diese Speicherfläche 
kommt in das bufferElement hinein.


> Oder sollte ich das ganze lieber mit Arrays und
> einer festen maximalen Framelänge lösen?

Im Vergleich zu deinem jetzigen Ansatz: auf jeden Fall

von Fabian (Gast)


Lesenswert?

Ok, vielen Dank Herr Buchegger, ich werde es vorerst mit einem Array 
lösen.

von Karl H. (kbuchegg)


Lesenswert?

Fabian schrieb:
> Ok, vielen Dank Herr Buchegger,

Ich werds ausrichten. Kann aber eine Weile dauern. Mein Vater ist zur 
Zeit in Nepal.
Ich bin einfach nur Karl Heinz

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.