Я создаю код для ARM Cortex-M3 (LCP17xx от NXP). Я до сих пор использую статическую память, и все работает хорошо. Я попытался добавить поддержку динамической памяти, но как только я позвоню malloc, система застрянет.Использование malloc newlib в ARM Cortex-M3
Я компилирую с gcc для руки голый металл и используя newlib. Версия: gcc-arm-none-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_stack затем устанавливается в таблице векторов прерываний.
И теперь сравнение разных карт. Без использования таНоса в коде:
*(COMMON)
0x1000000c _ebss = .
0x10000010 . = ALIGN (0x8)
*fill* 0x1000000c 0x4 00
0x10000010 _end = .
0x10000010 . = ALIGN (0x4)
0x10000010 _end_bss = .
0x10000100 . = ALIGN (0x100)
0x10000100 _start_heap = .
карты памяти с помощью таНоса в коде:
*(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 = .
Вы уверены, что правильно используете код запуска, который будет инициализировать структуры кучи? –
Я, очевидно, что-то делаю неправильно, проблема в том, что я не знаю, ЧТО я делаю неправильно. Я добавил дополнительную информацию о картах памяти, надеюсь, поможет найти ошибку. –
Очень похожая проблема возникает при использовании sprintf. Так что это не просто проблема с malloc. Это связано с целым материалом newlib. Вероятно, вам нужно изменить сценарий связывания, хотя я не могу понять, что. –