2013-06-27 5 views
5

Wenn ich diesen Code mit SDCC 3.1.0 kompilieren, und führen Sie es auf einem Amstrad CPC 464 (unter Emulation, mit WinCPC 0.9.26 läuft auf Wein):SDCC und malloc() - Zuweisung viel weniger Speicher als verfügbar ist

void _test_malloc() 
{ 
    long idx = 0; 
    while (1) 
    { 
     if (malloc(5)) 
    { 
     printf("%ld\r\n", ++idx); 
    } 
     else 
    { 
     printf("done"); 
     break; 
    } 
    } 
} 

... es klopft konsequent bei 92 malloc() s. Ich mache das 460 Bytes, was mich zu ein paar Fragen führt:

  • Was macht malloc() auf diesem System? Ich hoffte auf eine Größenordnung mehr Speicher sogar auf einem 64kB System

  • Das Verhalten ist auf 64kB Systemen und 128kB Systemen konsistent; Muss ich irgendeine Art von Magie ausüben, um auf den zusätzlichen Speicher zugreifen zu können, wie zum Beispiel die manuelle Bankumschaltung?

  • +0

    Warum die 5-Byte-Inkremente? Was passiert, wenn Sie größere Stücke zuweisen (nur neugierig sein)? Andere Frage: Wie viel Speicherplatz darfst du nehmen? –

    Antwort

    4

    Die Antwort ist, dass die Größe des Heapspeichers auf Z80-Systemen fest auf 1kB codiert ist. Maarten Brock answered dies auf der SDCC-User-Mailingliste:

    Hallo Duncan,

    Sie haben den Haufen selbst zu erstellen, wenn der Standard-1kB nicht genug ist. Kopieren Sie heap.s in Ihr Projektverzeichnis und ändern Sie es, um Ihre bevorzugte Größe zu erstellen. Dann versammle es und verlinke mit deinem Projekt.

    Im Gegensatz zum MCS51-Heap, der in _heap.c definiert ist, ist dies nicht dokumentiert für Z80 im Handbuch. Fühlen Sie sich frei, eine Dokumentation Aktualisierung oder Zusammenführung von _heap.c und heap.s im Tracker-System zu verlangen.

    Maarten

    5

    In der Tat, wie Duncan Bayne sagt, ist es ein sehr schmaler Heap-Speicher in dem Standard-Speicher-Manager, die SDCC für Z80 implementiert.

    Bevor Sie jedoch versuchen, den SDCC-Heap zu ändern, sollten Sie überlegen, ob Sie tatsächlich dynamischen Speicher auf einem Amstrad-CPC benötigen. Im Allgemeinen ist es nicht sinnvoll, dynamischen Speicher zu verwenden, wenn Sie eine eigenständige Anwendung ausführen, der die gesamte Hardware gehört. Sie können testen und wissen, wie viel Speicher Sie haben, und Sie können direkt in den Speicher schreiben, wo immer Sie wollten. Es gibt keinen Speicherschutz und keine anderen Anwendungen, die im Hintergrund ausgeführt werden.

    Daher ist es viel vorzuziehen, dass Sie Ihre eigene Speicherabbildung (wo Ihre Daten sein sollen und wie viel Speicherplatz zu verwenden ist) entwerfen und dann direkt den Speicher verwalten. Darüber hinaus ist die Codeoptimierung in diesem System sehr wichtig, und die manuelle Speicherverwaltung ist für die Optimierung extrem relevant.

    Wenn Ihr Code direkt im Amstrad-CPC läuft (d. H. Kein modernes Betriebssystem wie Symbos verwendet), müssen Sie die Bankumschaltung manuell vornehmen, um auf den Arbeitsspeicher zugreifen zu können. Die Z80-CPU hat einen 16-Bit-Bus, der nur 64 KB Speicher ohne Bankumschaltung adressieren kann.

    +0

    Der Nachteil der statischen Speicherzuweisung ist, dass Sie effektiv gezwungen sind, für die Worst-Case-Limits für alle Puffer zu zahlen, selbst wenn Ihre Anwendung sie nicht alle gleichzeitig füllen wird. Zugegeben, bei solchen Systemen sind die Kosten ebenfalls sehr hoch, aber sicherlich würde ich die dynamische Zuteilung nicht aus der Hand geben (obwohl das generische 'malloc' sicherlich draußen ist).) – doynax

    +0

    In der Tat, wenn Sie daran denken, das ist nicht gerade ein Nachteil. Wenn Sie möchten, dass Ihre Anwendung X-Daten verwaltet, müssen Sie diesen Speicher verfügbar haben oder nicht können. Wenn Sie dies dynamisch tun, müssen Sie diesen Speicherplatz auch für den Heap reservieren. – ronaldo

    +0

    (Fortsetzung ...) Aus meiner Sicht ist es im Allgemeinen interessanter, Ihren eigenen Speicherpool zu entwerfen, um Ihre eigenen unterschiedlichen Zwecke zu bedienen und direkt zu verwalten. Worst-Case-Grenzen müssen immer berücksichtigt werden, insbesondere bei begrenzten Ressourcen. Wie auch immer, mein allgemeiner Rat ist, Ansätze im Vorfeld zu berücksichtigen und nicht auf Standardwerte zurückzugreifen. Der Rest ist nur meine persönliche Sichtweise. – ronaldo

    Verwandte Themen