uCOS-III下的内存分配

Memory allocation under uCOS-III

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

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

问题一:

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

问题 2:

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

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

任何人都可以给我建议如何继续吗?

非常感谢, 迈克尔

1) 不要 link 使用 malloc/free 的标准库版本。而是创建自己的 malloc/free 实现,作为 OSMemGet/OSMemPut.

的包装器

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

如果您希望 malloc 从各种内存分区中获取适当大小的块,那么您必须发明一些魔法,以便 returns 将块释放到适当的内存分区。 (可能malloc多分配了一个word,第一个word存了指向内存分区的指针,然后returns这个word后面存放指针的地址。那么free就知道从前面得到内存分区指针词。)

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