Я создаю код для ARM Cortex-M3 (NXP LCP17xx). Я до сих пор использую статическую память, и все работает хорошо. Я попытался добавить поддержку динамической памяти, но после вызова malloc система застревает.
Я компилирую с gcc для обнаженного металла и используя newlib. Версия: gcc-arm-none-eabi-4_6-2012q1
Чтобы добавить поддержку malloc, я реализовал простую функцию _sbrk и модифицировал свой компоновщик script, чтобы сделать некоторое пространство для кучи (я прочитал много разных руководств об этой части, но ни одна из них не касается проблемы, с которой я столкнулся в следующий раз).
С помощью некоторых светодиодов я могу быть уверен, что код работает до тех пор, пока он не назовет malloc
, тогда он не будет продолжен. Он даже не достигает моей функции _sbrk
. Кроме того, он застрянет в вызове sizeof
, если я включу в код код malloc
позже.
Итак, что я могу делать неправильно, что при вызове malloc
код застревает без достижения _sbrk
или возврата?
После долгое время смотря на карту памяти, сгенерированную при вызове malloc
, и когда это не так, я подозреваю, что это связано с структурами, которые используются malloc
.
Это часть ld script, которая определяет память RAM:
.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 затем устанавливается в таблице векторов прерываний.
И теперь сравнение разных карт. Без использования 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 = .