Auf einem Mikrocontroller ist es viel sinnvoller sich einen Ringbuffer zu bauen als eine verkettete Liste. Dessen speicher kann man statisch allokieren. Problematisch wird es nur wenn man zwischen drin Daten einfügen will.
Auf einem Mikrocontroller ist es viel sinnvoller sich einen Ringbuffer zu bauen als eine verkettete Liste. Dessen speicher kann man statisch allokieren. Problematisch wird es nur wenn man zwischen drin Daten einfügen will.
Heap-Defragmentierung über Funktionen: Keine Ahnung was damit gemeint ist, ich vermute das geht Hand in Hand mit alloca und der Nutzung des Stacks.
Grundsätzlich: Wenn alle Speicheranforderungen bis zum Ende einer Funktion wieder vollständig freigegeben wurden, bekommst du kein Problem mit der Fragmentierung des Speichers - Weil es keine "überlebenden" Speicherblöcke gibt die den Adressraum fragmentieren können.
Für solche "kurzlebigen" Speicherobjekte kannst du dann aber auch den Stack verwenden (die beiden Varianten unterschieden sich dann nicht) - Speicher vom Stack wird mit alloca() angefordert. Vorteil: Bei verlassen der Funktion wird er automatisch freigegeben. Vorteil für alloca(): Die Funktion ist deutlich schneller/performanter als malloc/free.
Nochmal zur Defragmentierung: Das wird ohne größere Klimmzüge nicht funktionieren. Dazu würdest du eine zusätzliche Ebene zusätzlicher Indirektion benötigen die es dir erlaubt, Speicherbereiche im Hintergrund zu verschieben ohne die Verweise darauf ungültig zu machen. Direkte Pointer können das nicht leisten, du müsstest also mit Referenzen arbeiten.
mfG
Markus
Tiny ASURO Library: Thread und sf.net Seite
Tiny ASURO Library: Thread und sf.net Seite
Gut, danke für die Erklärung und das für mich googeln.
LG
Spacy Bar
@shedepe Ich habe mir soeben ein Beispiel eines Ringbuffers angesehen, aber ihn nicht wirklich verstanden. Könntest du vielleicht ein gut kommentiertes Beispiel posten?
Das habe ich nicht vor, nur notfalls bereits gespeicherte Daten löschen, ohne die gesamte Liste/den gesamten Ringbuffer zu leeren.Problematisch wird es nur wenn man zwischen drin Daten einfügen will.
LG
Spacy Bar
Geändert von Spacy Bar (07.07.2014 um 17:49 Uhr)
Schau mal hier:
https://www.mikrocontroller.net/articles/FIFO
http://rn-wissen.de/wiki/index.php/FIFO_mit_avr-gcc
Prinzip ist wie eine queu (Also First in First out).
Lesezeichen