www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu malloc()/free() und __heap_start


Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin gerade dabei in meinem AVR-Basic-Interpreter 
(http://www.mikrocontroller.net/articles/AVR_BASIC) die 
Verwendungsmöglichkeit von Arrays zu implementieren. Dabei bin ich auf 
eine kleine Merkwürdigkeit gestoßen, die ich mir nicht erklären kann:

Die Geschichte mit Arrays habe ich so implentiert, dass bei Auftreten 
eines DIM-Befehls (Basic) via malloc() ein entsprechender 
Speicherbereich geholt wird. Nach Beendigung des Basic-Programms wird 
dieser via free() wieder freigegen. Funktioniert auch, aber...

Zur Überprüfung des Speicherverbrauchs habe ich in meinen Testprogrammen 
ein paar Routinen eingebaut, die wie folgt funktionieren:

Beim Start des MC (nach Reset) wird der SRAM (von Heap-Start bis 
RAM-Ende) mit einem festgelegten Muster initialisiert. Später zur 
Laufzeit prüfe ich mit einer Funktion wieviel von dem Muster noch da 
ist:
unsigned short get_mem_unused (void)
{
   unsigned short unused = 0;
   unsigned char *p = &__heap_start;
   do
   {
      if (*p++ != MASK) break;
      unused++;
   } while (p <= (unsigned char*) RAMEND);
   return unused;
}

Nach der Verwendung von malloc()/free() ergibt diese Funktion 0 zurück. 
Das kann ich mir nicht erklären. Kann mir jemand sagen warum das so ist? 
Wenn malloc()/free() nicht verwendet werden, gibt obige Funktion 
erwartete Werte zurück...

Grüße & Danke Uwe

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uwe Berger schrieb:

> Nach der Verwendung von malloc()/free() ergibt diese Funktion 0 zurück.
> Das kann ich mir nicht erklären.

Der Heap wächst von unten nach oben (also nicht wie der Stack)
Deine Funktion prüft ebenfalls von unten nach oben und steigt beim 
ertsen NichtMASK - Byte aus.

> Wenn malloc()/free() nicht verwendet werden, gibt obige Funktion
> erwartete Werte zurück...

Dann wird auch kein Heap benutzt und niemand tatscht die Bytes im SRAM 
an. Aber malloc benötigt für sich selbst auch Verwaltungsinformation. 
Rate mal, wo die sein wird?

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MoinMoin,

Karl heinz Buchegger schrieb:
> Dann wird auch kein Heap benutzt und niemand tatscht die Bytes im SRAM
> an. Aber malloc benötigt für sich selbst auch Verwaltungsinformation.
> Rate mal, wo die sein wird?
>
na wenn du schon so fragst, im Heap....

OK, klingt plausibel, danke für die Erklärung!

Grüße Uwe

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.