mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Suche schlanke malloc/free Implementierung


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Kennt jemand eine (Free oder GPL'd)?
Danke!

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fuer was brauchst Du es denn? Oder fragen wir anders: Fuer welche 
Plattform?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es soll auf einem ARM7 laufen (LPC 2368).
Ich möchte den Code aumbauen, weil ich mehrere Heaps erzeugen möchte. 
Deshalb brauche ich's im Quelltext. Schlank und schnell soll es außerdem 
sein.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm mit ARM kenn ich mich leider nicht aus. Gibt es denn dafuer keine 
freien Entwicklungstools? Ich meine es ist unwahrscheinlich dass jemand 
nur diese spezifischen Funktionen implementiert hat, da sie Teil einer 
Standardbibliothek sind. Aber prinzipiell haelt Dich doch keiner davon 
ab, eigene Implementierungen zu benutzen, sofern Du genug Kenntnisse 
ueber die Plattform hast.

Autor: Philip S. (phs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

 ich habe mal an einem Projekt (Firmware für Server) mitgearbeitet, wo 
eine eigene Speicherverwaltung nötig war. Den Code kann ich Dir leider 
nicht schicken, aber ein paar Gedanken. Keine Ahnung, wie Deine Umgebung 
aussieht und was Deine Vorstellung von "schnell" ist, aber vielleicht 
hilft's Dir ja trotzdem.

 "Unser" malloc() damals war recht einfach aufgebaut. Man hat einfach 
ein statisches Array irgendwo im Quelltext definiert, z.B. in malloc.c. 
In besagtem Projekt waren 2 MByte völlig ausreichend. Ausserdem gab's 
noch eine Chunk-Struktur als Datentyp. Eine Instanz davon hat jeweils 
einen allokierten Speicher-Chunk beschrieben. In der Chunk-Struktur 
waren nur ein paar Kleinigkeiten gespeichert, ich glaube ausser der 
Größe eines Chunks stand da nicht viel drin.

 Nehmen wir an, das Array liegt an Adresse 0x1000. Wenn nun jemand 
malloc(0x10) aufgerufen hat, dann wurde das Array linear (man hätte das 
natürlich auch optimieren können, aber das war nicht nötig) nach dem 
ersten freien Chunk durchsucht. Nehmen wir an, ein Chunk sei an 0x1030 
frei. Dann wurde an 0x1030 die Chunk-Struktur angelegt, in der die Größe 
des Chunks gespeichert wurde. Nehmen wir an, die Chunk-Struktur sei 8 
Byte groß, dann hat der Aufrufer die Adresse 0x1038 zurück geliefert 
bekommen.

 Man muss dann natürlich noch ein paar Kleinigkeiten beachten wie z.B. 
dass allokierte und wieder freigegebene Chunks von späteren Aufrufern 
auch wieder verwendet werden können. In der besagten Implementierung hat 
man sich allergings gar keine Sorgen um Fragmentierung des Speichers 
gemacht, das war völlig unnötig.

 Aber lange Rede, kurzer Sinn: Je nachdem, wie Deine Vorstellung von 
"schnell" und "einfach" ist, kann es sein, dass Du eine Heap-Verwaltung 
als einfache doppelt verkettete Liste ganz schnell selbst implementieren 
kannst.

 Wenn Deine Anforderungen allerdings etwas umfangreicher sind, dann 
schau einfach beim freien Betriebssystem Deiner Wahl (z.B. Linux, da 
musst Du vermutlich bei der glibc suchen) nach, wie malloc dort 
implementiert ist.

Autor: Peter (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hallo Michael und Phillip.
Vielen Dank für eure Antworten.

Ja, im Prinzip könnte ich schon einen eigene Heapverwaltung 
programmieren. Dass solche Heaps auf linked Lists (single oder double) 
basieren, war mir vorher auch klar. Mit dem Selbstprogrammieren ist es 
aber so'ne Sache. Nicht, daß ich kein C kann, aber die Algorithmen die 
z.B. Blöcke eines Heaps bei 'free' wieder zusammenführen etc. sind 
vielleicht nicht ganz trivial und selbstgeschriebener Code muß ausgiebig 
getestet werden. Deshalb bevorzuge ich lieber etwas Fertiges.

Soweit ich weiß, machen die Linux und FreBSD Heapverwaltung es so, daß 
sie mit sbrk() einen neuen Block vom OS anfordern, der dem Heap 
einverleibt wird. Ein solches Verfahren fällt bei mir aus, da ich 
mehrere parallele Heaps betreiben möchte, die alle ihren separaten, 
festen Speicher managen und voneinander nichts wissen dürfen. Grund: 
Wenn ein Heap erschöpft ist, dürfen andere Komponenten nicht darunter 
leiden.

Ich suche daher primär nach einem einfachen Heap-Code für 
schwachbrüstige 16-bit Systeme, wie z.B. C166 oder HCS12. Von solchen 
Codes erhoffe ich mir, daß sie nicht zu 'over-engineered' sind und durch 
meine Umbauarbeiten nicht zu sehr an Speed verlieren.

Ich benutze übrigens IAR für ARM und da scheint der Heap-Code (wie die 
ganze libc) nicht im Quelltext dabei zu sein (zumindest konnte ich 
Blindfisch ihn nicht finden).

--> Peter

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.