我正在为 STM32F7 编写嵌入式软件,我的 libc 是 newlib-2.4.0.20160527。
我已经实现_sbrk()
如下:
extern intptr_t g_bss_end; /* value after the last byte in .bss */
extern intptr_t g_msp_lim; /* stack buffer starts at this address */
intptr_t _sbrk(ptrdiff_t heap_incr)
{
static intptr_t heap_end = 0;
intptr_t prev_heap_end;
intptr_t new_heap_end;
if(heap_end == 0) {
heap_end = (intptr_t)&g_bss_end;
}
prev_heap_end = heap_end;
new_heap_end = prev_heap_end + heap_incr;
if(new_heap_end >= g_msp_lim) {
errno = ENOMEM;
return -1;
}
heap_end = new_heap_end;
return prev_heap_end;
}
然后,当我执行以下操作时:
/* total capacity of my heap is 0x40000 */
void * mem = malloc(0x40000);
free(mem); mem = 0;
mem = malloc(0x40000);
一切正常(即 malloc 两次返回非零值)。
但是当我执行以下操作时(出于测试目的):
for(int32_t sz = 0x50000; sz >= 0; sz--) {
void * mem = malloc(sz);
if(mem != 0) {
__BKPT();
free(mem);
break;
}
}
每个malloc()
失败,甚至malloc(0)
(即,__BKPT()
从未达到)。所以,实际上堆上没有分配的内存(我没有得到任何内存,mem != 0
所以我什free()
至什么都做不到),也没有可用的内存。
我希望malloc()
每一次都失败sz > 0x40000
并为每一次成功sz <= 0x40000
(假设在每一次free()
之后都可以正常工作malloc()
)。
我错过了什么,或者这是 newlib 中的错误或预期行为?