mikrocontroller.net

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


Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fabian (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.