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


von Uwe B. (boerge) Benutzerseite


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

von Karl H. (kbuchegg)


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?

von Uwe B. (boerge) Benutzerseite


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

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.