我正在开发一个在uCOS-III下使用的C库。中央处理器是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来解决我原来的问题…
有没有人能给我一个建议,我该怎么做?
非常感谢,迈克尔
发布于 2016-09-07 00:45:48
1)不要链接到malloc/free的标准库版本。相反,创建您自己的malloc/free实现,作为OSMemGet/OSMemPut的包装器。
2)使用OSMemCreate可以创建多个内存分区。创建包含块大小的小型、中型和大型分区,这些分区针对您的应用程序进行调整,以减少浪费。
如果您希望malloc从您的各种内存分区中获得适当大小的块,那么您必须发明一些魔术,以便free将该块返回到适当的内存分区。(也许malloc分配了一个额外的字,将指针存储在第一个字中的内存分区,然后返回存储指针的字之后的地址。那么free就知道从前面的字中获取内存分区指针。)
使用malloc/free的另一种方法是重写该代码以使用静态分配的变量,或者直接调用OSMemGet/OSMemPut。
https://stackoverflow.com/questions/39351839
复制相似问题