Я создаю код для 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 =.