Forum: Mikrocontroller und Digitale Elektronik Heap/Stack Definition


von Pascal H. (_pascal_)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche gerade malloc bei mir auf dem lpc1768 richtig zum laufen zu 
bekommen.

Damit das funktioniert muss ich ueber das linker script ja den heap 
Bereich definieren.

Wenn ich das richtig verstehe teilt sich der Heap und der sich 
aufbauende Stack den RAM Bereich.

Der RAM Bereich ist 32K gross bei mir.

Ich habe jetzt mehrere _sbrk Implementierungen gesehen.
Diese hier hat einen mit 0 initialisierten heap_pointer, schiebt diesen 
immer weiter und prueft ob es mit __get_MSP() ??? eine Kollision gibt.

Was bedeutet ein mit 0 initialisierter pointer? Steht der dann am 
ORIGIN(RAM)?

Und was macht der Stack? Baut der sich ab ORIGIN(RAM) + LENGTH(RAM) 
abwaerts auf, bzw. wer legt das in meinem Linker Script fest?
1
static void *heap_pointer = 0;
2
3
void *_sbrk(unsigned int incr) {
4
    void *mem;
5
6
    unsigned int next = ((((unsigned int)heap_pointer + incr) + 7) & ~7);
7
    if (next > __get_MSP()) {
8
        mem = 0;
9
    } else {
10
        mem = (void *)heap_pointer;
11
    }
12
    heap_pointer = (void *)next;
13
14
    return mem;
15
}

Ich wuerde das ganze gerne verstehen und nachvollziehen koennen. Leider 
blicke ich da nicht durch bei den Linker Scripten.

Bei dieser Stelle im Linker Script werden heap spezifische Sachen 
definiert. Das steht direkt nach der .bss Section. Bedeutet also dass 
"__end__" und "end" mit der END Position von .bss definiert wird?

Was bedeutet dann die naechste Zeile? "*(.heap*)"

Muss ich dann in meiner _sbrk diese definierten variablen verwenden?
1
    .heap :
2
    {
3
        __end__ = .;
4
        end = __end__;
5
        *(.heap*)
6
        __HeapLimit = .;
7
    } > RAM

: Bearbeitet durch User
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.