私は 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 は非ゼロを 2 回返します)。
しかし、次のことを行うと(テスト目的で):
for(int32_t sz = 0x50000; sz >= 0; sz--) {
void * mem = malloc(sz);
if(mem != 0) {
__BKPT();
free(mem);
break;
}
}
すべてmalloc()
が失敗しますmalloc(0)
(つまり、__BKPT()
is never reached )。そのため、実際にはヒープに割り当てられたメモリはなく(何も取得できなかったmem != 0
ので、何もできませんfree()
)、使用可能なメモリもありません。
malloc()
私は毎回失敗し、毎回sz > 0x40000
成功することを期待していました(それぞれの後に正常に動作するとsz <= 0x40000
仮定します)。free()
malloc()
私は何かを見逃していましたか、それともこれは newlib のバグまたは意図された動作ですか?