1

我正在开发一个在 uCOS-III 下使用的 C 库。CPU 是 ARM Cortex M4 SAM4C。在库中,我想使用第三方产品 X,其特定名称与此处无关。X 的源代码是完全可用的并且可以毫无问题地编译。

在 X 内部,使用 calloc() 和 free() 执行了大量内存分配。问题是,由于内存碎片,不建议嵌入式系统直接使用 malloc。uCOS-III 的文档明确建议不要使用 malloc - 而是应使用 OSMemCreate/OSMemGet/OSMemPut 从静态分配的内存块中分配和释放内存块。

问题一:

绕过malloc的“标准实现”的一般建议是什么?我更喜欢一种 malloc,我可以在其中访问固定的内存池(例如,专用于特殊任务)

问题2:

应该如何正确使用 OSMemCreate()?我首先要初始化一个具有一定块大小的内存分区。请求的内存量在 4 字节和大约 800 字节之间。我可以根据要求获得块,但大小固定。如果 block-size=4 我不能分配 16 字节,因为块在内存中不连续。如果 block-size=800 并且我只需要 4 个字节,那么大部分块都没有使用,我很快就会用完块。

所以我不知道,如何通过使用 OSMemCreate 来解决我原来的问题......

任何人都可以给我一个建议,我该如何继续?

非常感谢,迈克尔

4

1 回答 1

2

1) 不要与 malloc/free 的标准库版本链接。而是创建自己的 malloc/free 实现,作为 OSMemGet/OSMemPut 的包装器。

2) 您可以使用 OSMemCreate 创建多个内存分区。创建包含针对您的应用程序调整的块大小的小型、中型和大型分区,以减少浪费。

如果您希望 malloc 从您的各种内存分区中获取适当大小的块,那么您必须发明一些魔法,以便 free 将块返回到适当的内存分区。(可能 malloc 分配了一个额外的字,将指向内存分区的指针存储在第一个字中,然后返回存储指针的字之后的地址。然后 free 知道从前面的字中获取内存分区指针。)

使用 malloc/free 的替代方法是重写该代码以使用静态分配的变量或直接调用 OSMemGet/OSMemPut。

于 2016-09-06T16:45:48.327 回答