Mit newlib ist malloc in einem ARM Cortex-M3
Ich bin das erstellen von code für einen ARM-Cortex-M3 (NXP LCP17xx). Ich habe mit statischen Speicher bis jetzt und alles gut funktioniert. Ich habe versucht, fügen Sie dynamische Speicher-Unterstützung, aber sobald ich call malloc, das system hängen bleibt.
Ich kompiliere mit dem gcc für arm bare metal, und mit newlib. Version: gcc-arm-none-eabi-4_6-2012q1
Hinzufügen malloc Unterstützung, ich implementiert eine einfache _sbrk Funktion und meine modifizierten linker-Skript, um Speicherplatz für den heap (die ich gelesen habe viele verschiedene tutorials über dieses Teil, aber keiner das problem, dass ich gestoßen nächste).
Mit der Hilfe von einigen leds, kann ich sicher sein, dass der code läuft bis zu dem Punkt, dass es Anrufe malloc
dann geht es nicht auf. Es ist nicht einmal mein _sbrk
Funktion. Auch, Sie stecken in einem Aufruf sizeof
wenn ich einen Anruf zu malloc
später im code auf.
So, was kann ich falsch gemacht, dass beim Aufruf malloc
den code stecken, ohne jemals _sbrk
oder Rückkehr?
Nachdem es für eine Weile, bis die memory map generiert, wenn die malloc
Anruf enthalten ist, und wenn es nicht ist, vermute ich, dass es um die Strukturen, die verwendet werden malloc
.
Dies ist der Teil des ld-Skript definiert, der im ram-Speicher:
.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 wird dann in der interrupt-Vektor-Tabelle.
Und jetzt einen Vergleich der verschiedenen Karten. Ohne Verwendung von malloc im code:
*(COMMON)
0x1000000c _ebss = .
0x10000010 . = ALIGN (0x8)
*fill* 0x1000000c 0x4 00
0x10000010 _end = .
0x10000010 . = ALIGN (0x4)
0x10000010 _end_bss = .
0x10000100 . = ALIGN (0x100)
0x10000100 _start_heap = .
Speicher Karte mithilfe von malloc im code:
*(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 = .
InformationsquelleAutor der Frage Marga Manterola | 2012-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, nach rund 10 Stunden damit verbracht, debugging, habe ich es endlich geschafft Arbeit. Das problem war in dem linker-Skript. Es war jedoch nicht in der bss-Sektion, die ich gepostet hatte, aber in der text-und data-Bereich. Hier ist das Skript, das funktioniert.
Hatte ich auch hinzufügen, dass einige der Initialisierung der Variablen zu meinem init-code:
Diese zwei Seiten waren sehr hilfreich, obwohl es noch dauerte mir viel zu verstehen, was Los war: http://fun-tech.se/stm32/linker/index.php und http://e2e.ti.com/support/microcontrollers/stellaris_arm_cortex-m3_microcontroller/f/473/t/44452.aspx?pi23648=1
Ich hoffe, dass dies nützlich sein könnte, jemand anderes die gleichen Probleme, die ich erlebte.
InformationsquelleAutor der Antwort Marga Manterola