【问题标题】:It seems like malloc is asking for too much memory似乎 malloc 要求的内存过多
【发布时间】:2012-12-03 22:39:30
【问题描述】:

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

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

if(requested > 512)
    requested = 512;

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

虽然系统看起来坚如磐石,但我相当肯定它会在我最不期待的时候卷土重来并困扰我。

【问题讨论】:

  • malloc() 的实现从何而来?
  • 来自一个在汇编器中实现的库,它是 YAGARTO 工具链的一部分。下一步将是破解它的源代码。
  • 对于桌面/服务器操作系统似乎可能有意义,但对于微控制器来说似乎很奇怪。 (事实上​​,在具有 8K RAM 的系统中,malloc() 本身似乎有点奇怪,但我很老派。)

标签: gcc malloc sbrk


【解决方案1】:

通过 cmets 中提供的关于不使用 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,因此我们将不胜感激。

【讨论】:

  • 这是一篇旧帖子,我对您的平台了解不多,但是像 alloca 这样的选择可以吗?它在堆栈上进行动态分配,并在函数返回时释放它。不可移植,但如果可用,可能值得研究。
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2019-05-28
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多