Похоже, что Malloc требует слишком много памяти

У меня есть приложение STM32F0, использующее компилятор yagarto GCC. Я реализовал _sbrk newlib_stubs.c. Проблема, с которой я сталкиваюсь, заключается в том, что я вызываю malloc(256) в свою очередь malloc при вызове _sbrk и запросе 4K памяти. В моей системе всего 8K, так что, очевидно, это проблема. Я отслеживал вызовы _sbrk, и, кажется, до этого он делал несколько вызовов, выделяя меньшие объемы памяти.

Прямо сейчас я обхожу это, держа мой нос, чтобы избежать зловония и делая что-то вроде:

if(requested > 512)
    requested = 512;

в _sbrk, прежде чем я переместить кучу.

Хотя система кажется надежной, я вполне уверен, что она вернется и будет преследовать меня, когда я меньше всего этого ожидаю.

1 ответ

Решение

С тонкими намеками, предоставленными в комментариях о неиспользовании malloc, я просто создал что-то, чтобы распределить свою собственную память. Мне никогда не нужно выпускать это, чтобы сделать это простым. Единственное, что меня поразило около часа, - это поддерживать 32-битное выравнивание.

Вот моя реализация pm_ выступает за бедняков.

#define HEAPSIZE 0x800 //2K

    uint16_t __heapPtr = 0;
    uint8_t __customHeap[HEAPSIZE];
    void *pm_malloc(uint16_t size){
        while(__heapPtr % 4 != 0)
            __heapPtr++;

        void *block = &__customHeap[__heapPtr];
        if(size + __heapPtr > HEAPSIZE)
            return 0;

        __heapPtr += size;
        return block;
    }

Последние 15 лет моя жизнь была на C#, Java и Objective-C, поэтому любая обратная связь приветствуется.

Другие вопросы по тегам