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
|