Hi, Kennt jemand eine (Free oder GPL'd)? Danke!
Fuer was brauchst Du es denn? Oder fragen wir anders: Fuer welche Plattform?
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.