Увеличить размер кучи для zoul - PullRequest
0 голосов
/ 21 декабря 2018

Мне нужно использовать библиотеку в моем проекте Zoul, которая широко использует механизм malloc для выделения динамической памяти.

Проблема в том, что когда эта библиотека вызывает malloc, она возвращает NULL, так как в памяти недостаточнокуча.

Я попробовал эту простую функцию, чтобы посмотреть, сколько у меня памяти в начале программы:

size_t heap_size(){
    uint8_t* p = NULL;
    size_t size = 0;

    while((p = malloc(sizeof(uint8_t))) != NULL)
        size++;

    return size;
}

, что дает мне кучу всего 92 байта.

На выходе устройства видно, что оно имеет SRAM 32 КиБ.Есть ли способ увеличить часть, предназначенную для кучи?

1 Ответ

0 голосов
/ 21 декабря 2018

Такого пути нет.Если вы посмотрите на скрипт компоновщика ЦПУ Zoul (CC2538), вы увидите следующие соответствующие определения:

.bss :
{
    _bss = .;
    *(.bss*)
    *(COMMON)
    _ebss = .;
} > FRSRAM

...

_heap = .;
_eheap = ORIGIN(FRSRAM) + LENGTH(FRSRAM);

Итак, куча идет после сегмента .bss и потенциальнопродолжается до конца памяти.Лучшее, что вы можете сделать, - это использовать некоторые из методов сокращения использования памяти Contiki , чтобы уменьшить размер сегментов .data и .bss и таким образом получить больше места для кучи.

Более того, malloc() не используется операционной системой Contiki и не рекомендуется для пользовательских приложений.Рекомендуется переписать код без динамического выделения памяти или искать другое оборудование, особенно предпочтительно с MPU.

Есть веская причина для того, чтобы избегать malloc и друзей.Области кучи и стека разделяют одно и то же пространство памяти, и когда одна растет вниз, другая растет вверх (они «встречаются посередине»).Когда они начинают перекрываться, начинают происходить плохие вещи.Злоупотребление как можно меньшим количеством памяти - это повод для неприятностей - позже стек может вырасти и повредить память, выделенную из памяти.

...