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 mallocdann geht es nicht auf. Es ist nicht einmal mein _sbrk Funktion. Auch, Sie stecken in einem Aufruf sizeofwenn 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

Schreibe einen Kommentar