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


von Peter (Gast)


Lesenswert?

Hi,
Kennt jemand eine (Free oder GPL'd)?
Danke!

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Fuer was brauchst Du es denn? Oder fragen wir anders: Fuer welche 
Plattform?

von Peter (Gast)


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.

von Michael G. (linuxgeek) Benutzerseite


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.

von Philip S. (phs)


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.

von Peter (Gast)


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

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.