0

我有一个使用 yagarto GCC 编译器的 STM32F0 应用程序。我已经实现了_sbrk newlib_stubs.c。我遇到的问题是我在调用 _sbrk 并要求 4K 内存时调用 malloc(256) 依次调用 malloc。我的系统总共只有 8K,所以显然这是个问题。我已经监视了对 _sbrk 的调用,它似乎在分配较少的内存之前进行了一些调用。

现在我正在通过捂住鼻子避免恶臭并做类似的事情来解决这个问题:

if(requested > 512)
    requested = 512;

在我重新定位堆之前在 _sbrk 中。

尽管该系统看起来坚如磐石,但我相当肯定它会在我最不期待的时候再次出现并困扰我。

4

1 回答 1

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,所以任何反馈都将不胜感激。

于 2012-12-04T14:44:47.523 回答