我正在开发一个在uCOS-III下使用的C库。 CPU是ARM Cortex M4 SAM4C。在库中,我想使用第三方产品X,其特殊名称与此无关。 X的源代码完全可用,编译没有问题。
在X内部,使用calloc()和free()执行大量内存分配。 问题是,由于内存碎片的原因,不建议对嵌入式系统使用malloc。 uCOS-III的文档明确建议不要使用malloc - 而是使用OSMemCreate / OSMemGet / OSMemPut来从静态分配的内存块中分配和释放内存块。
问题-1:
解决malloc“标准实现”的一般建议是什么?我更喜欢一种malloc,我可以访问一个固定的内存池(例如专门用于特殊任务)
问题-2:
如何正确使用OSMemCreate()?我首先初始化具有特定块大小的内存分区。请求的内存量介于4字节和大约800字节之间。我可以根据要求获得块,但具有固定大小。如果block-size = 4,则无法分配16个字节,因为块在内存中不连续。如果block-size = 800且我只需要4个字节,那么大部分块都没有使用,我很快就会用完块。
所以我不知道,如何通过使用OSMemCreate来解决我原来的问题...
有人可以告诉我如何继续吗?
非常感谢, 迈克尔
答案 0 :(得分:2)
1)不要与malloc / free的标准库版本链接。而是创建自己的malloc / free实现,作为OSMemGet / OSMemPut的包装器。
2)您可以使用OSMemCreate创建多个内存分区。创建小型,中型和大型分区,这些分区具有针对您的应用进行调整的块大小,以减少浪费。
如果你想让malloc从各种内存分区中获取一个适当大小的块,那么你必须发明一些魔法,以便free将块返回到相应的内存分区。 (也许malloc分配一个额外的字,将指针存储到第一个字中的内存分区,然后返回存储指针的字之后的地址。然后free知道从前一个字中获取内存分区指针。)< / p>
使用malloc / free的另一种方法是重写该代码以使用静态分配的变量或直接调用OSMemGet / OSMemPut。