Использование newlib& #39;s malloc в ARM Cortex -M3

Я создаю код для ARM Cortex -M3 (NXP LCP17xx ). До сих пор я использовал статическую память, и все работало хорошо. Я пытался добавить поддержку динамической памяти, но как только я вызываю malloc, система зависает.

Я компилирую с помощью gcc для голого металла и использую newlib. Версия :gcc -arm -нет -eabi -4 _6 -2012q1

Чтобы добавить поддержку malloc, я реализовал простую _функцию sbrk и изменил свой компоновщик скрипт, чтобы освободить место для кучи (Я читал много разных туториалов по этой части, но ни один из них не описывает проблему, с которой я столкнулся далее ).

С помощью некоторых светодиодов я могу быть уверен, что код работает до момента, когда он вызывает malloc, после чего он не продолжается. Это даже не достигает моей функции _sbrk. Кроме того, он застрянет в вызове sizeof, если я позже включу вызов mallocв код.

Итак, что я могу сделать неправильно, что при вызове mallocкод зависает, так и не достигнув _sbrkи не вернувшись?

Посмотрев некоторое время на карту памяти, сгенерированную, когда вызов mallocвключен и когда нет, я подозреваю, что это связано со структурами, которые используются malloc.

Это часть скрипта ld, определяющая стек оперативной памяти:

.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 _, который затем устанавливается в таблице векторов прерываний.

А теперь сравнение разных карт. Без использования malloc в коде:

 *(COMMON)
            0x1000000c                _ebss =.
            0x10000010               . = ALIGN (0x8)
 *fill*     0x1000000c        0x4 00
            0x10000010                _end =.
            0x10000010               . = ALIGN (0x4)
            0x10000010                _end_bss =.
            0x10000100               . = ALIGN (0x100)
            0x10000100                _start_heap =.

Карта памяти с использованием malloc в коде:

*(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 =.
16
задан Marga Manterola 6 May 2012 в 03:38
поделиться