Ich erstelle Code für ein ARM Cortex-M3 (NXP LCP17xx). Ich habe bisher statischen Speicher verwendet und alles hat gut funktioniert. Ich habe versucht, dynamische Speicherunterstützung hinzuzufügen, aber sobald ich malloc anrufe, bleibt das System stecken.Verwenden von Newlib Malloc in einem ARM Cortex-M3
Ich kompiliere mit gcc für arm bare metal, und mit newlib. Version: gcc-arm-none-eabi-4_6-2012q1
Um malloc-Unterstützung hinzuzufügen, habe ich eine einfache _sbrk-Funktion implementiert und mein Linker-Skript geändert, um Platz für den Heap zu schaffen (ich habe viele verschiedene Tutorials dazu gelesen Teil, aber keiner deckt das Problem, das ich als nächstes antraf).
Mit Hilfe einiger LEDs kann ich sicher sein, dass der Code bis zu dem Punkt läuft, an dem er malloc
aufruft, dann geht es nicht weiter. Es erreicht nicht einmal meine _sbrk
Funktion. Außerdem wird es in einem Anruf zu sizeof
stecken bleiben, wenn ich einen Anruf zu malloc
später im Code einschließe.
Also, was kann ich falsch machen, dass beim Aufruf malloc
der Code stecken bleibt, ohne jemals erreicht _sbrk
oder zurück?
Nach dem starren für die Speicherkarte, die erstellt, wenn der malloc
Aufruf enthalten ist, und wenn es nicht ist, vermute ich, dass es zu den Strukturen verwandt wird, die von malloc
verwendet werden.
Dies ist der Teil des LD-Skript, das den RAM-Speicher definiert:
.bss :
{
_start_bss = .;
*(.bss)
*(COMMON)
_ebss = .;
. = ALIGN (8);
_end = .;
} >sram
. = ALIGN(4);
_end_bss = .;
. = ALIGN(256);
_start_heap = .;
PROVIDE(__cs3_heap_start = _start_heap)
_end_stack = 0x10008000;
_end_stack dann in der Unterbrechungsvektortabelle eingestellt ist.
Und jetzt ein Vergleich der verschiedenen Karten.
*(COMMON)
0x1000000c _ebss = .
0x10000010 . = ALIGN (0x8)
*fill* 0x1000000c 0x4 00
0x10000010 _end = .
0x10000010 . = ALIGN (0x4)
0x10000010 _end_bss = .
0x10000100 . = ALIGN (0x100)
0x10000100 _start_heap = .
Speicherkarte unter malloc im Code: malloc im Code ohne Verwendung
*(COMMON)
COMMON 0x10000848 0x4 ...arm-none-eabi/lib/armv7-m/libc.a(lib_a-reent.o)
0x10000848 errno
0x1000084c _ebss = .
0x10000850 . = ALIGN (0x8)
*fill* 0x1000084c 0x4 00
0x10000850 _end = .
.bss.__malloc_max_total_mem
0x10000850 0x4
.bss.__malloc_max_total_mem
0x10000850 0x4 ...arm-none-eabi/lib/armv7-m/libc.a(lib_a-mallocr.o)
0x10000850 __malloc_max_total_mem
(...) It goes on (...)
0x1000085c __malloc_current_mallinfo
0x10000884 . = ALIGN (0x4)
0x10000884 _end_bss = .
0x10000900 . = ALIGN (0x100)
0x10000900 _start_heap = .
Sind Sie sicher, dass Sie den Startup-Code richtig aufrufen, wodurch die Heap-Strukturen initialisiert werden? –
Ich mache offensichtlich etwas falsch, das Problem ist, dass ich nicht weiß, was ich falsch mache. Ich habe zusätzliche Informationen über die Speicherkarten hinzugefügt, die hoffentlich helfen werden, den Fehler zu finden. –
Ein sehr ähnliches Problem tritt auf, wenn sprintf verwendet wird. Es ist also nicht nur ein Malloc-Problem. Es hat mit dem ganzen newlib Zeug zu tun. Es muss wahrscheinlich eine Änderung im Verknüpfungsskript vorgenommen werden, obwohl ich nicht weiß was. –