Я настраиваю свою платформу Cortex-M4 для использования кучи памяти и сталкиваюсь с некоторыми проблемами.Я установил размер области кучи равным 512 байтам, и он выделяет только 9 байт.Затем я установил кучу равной 10 КБ, и она может выделить только 362 байта.Вот моя заглушка gcc:
int _sbrk(int a)
{
//align a to 4 bytes
if (a & 3)
{
a += (4 - (a & 0x3));
}
extern long __heap_start__;
extern long __heap_end__;
static char* heap_ptr = (char*)&__heap_start__;
if (heap_ptr + a < (char*)&__heap_end__)
{
int res = (int)heap_ptr;
heap_ptr += a;
return res;
}
else
{
return -1;
}
}
__heap_start__
и __heap_end__
верны, и их различие показывает правильный размер области.Я добавил отладку в функцию _sbrk
, чтобы посмотреть, какой аргумент a
передается при вызове этой функции, и значения этого аргумента аналогичны этим при каждом вызове соответственно:
2552
1708
4096
Что я могу сделать, чтобызаставить его использовать полную память кучи?А как рассчитывается _sbrk
аргумент?По сути, что здесь не так?
Сборка кода C ++ с использованием new (std::nothrow)
.
EDIT Если я использую malloc
(стиль C), он выделяет 524 байта инет _sbrk
вызова перед основным, в отличие от использования operator new
.
arm-none-eabi-g++.exe (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437]
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
EDIT2 Пример минимального завершения проверки
Вот мой код приложения и _sbrk
с печатью информации:
void foo()
{
while (true)
{
uint8_t * byte = new (std::nothrow) uint8_t;
if (byte)
{
DBB("Byte allocated");
cnt++;
}
else
{
DBB_ERROR("Allocated %d bytes", cnt);
}
}
}
int _sbrk(int a)
{
//align a to 4 bytes
if (a & 3)
{
a += (4 - (a & 0x3));
}
extern long __heap_start__;
extern long __heap_end__;
static char* heap_ptr = (char*)&__heap_start__;
DBB("%d 0x%08X", a, a);
DBB("0x%08X", heap_ptr);
DBB("0x%08X", &__heap_start__);
DBB("0x%08X", &__heap_end__);
if (heap_ptr + a < (char*)&__heap_end__)
{
int res = (int)heap_ptr;
heap_ptr += a;
DBB("OK 0x%08X 0x%08X", res, heap_ptr);
return res;
}
else
{
DBB("ERROR");
return -1;
}
}
И произведенная продукция: