我正在为 ARM Cortex-M3(NXP 的 LCP17xx)创建代码。到目前为止,我一直在使用静态内存,一切运行良好。我试图添加动态内存支持,但是一旦我调用 malloc,系统就会卡住。
我正在用 gcc 编译 arm 裸机,并使用 newlib。版本:gcc-arm-none-eabi-4_6-2012q1
为了添加对 malloc 的支持,我实现了一个简单的 _sbrk 函数并修改了我的链接器脚本以为堆腾出一些空间(我已经阅读了许多关于这部分的不同教程,但没有一篇涵盖我接下来遇到的问题)。
在一些 LED 的帮助下,我可以确定代码一直运行到它调用的那一点malloc
,然后它就不会继续了。它甚至达不到我的_sbrk
功能。sizeof
此外,如果我malloc
稍后在代码中包含对 的调用,它将卡在对 的调用中。
malloc
那么,当调用代码时卡住而没有到达_sbrk
或返回时,我会做错什么?
在盯着包含调用和不包含调用时生成的内存映射一段时间后malloc
,我怀疑它与malloc
.
这是定义 ram 内存的 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。
现在比较不同的地图。在代码中不使用 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 = .