Frage zu malloc()/free() und __heap_start

OP Persönliche Seite #2033565
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:
1
unsigned short get_mem_unused (void)
2
{
3
   unsigned short unused = 0;
4
   unsigned char *p = &__heap_start;
5
   do
6
   {
7
      if (*p++ != MASK) break;
8
      unused++;
9
   } while (p <= (unsigned char*) RAMEND);
10
   return unused;
11
}

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
#2033598
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren