我们使用 Micrium 的 μC/OS-III RTOS 和 Renesas 的 RX62N。
我们构建了一个必须动态分配和释放数据的系统。我们发现函数 malloc() 和 free() 不能很好地与 RTOS 配合使用。 然而,RTOS 为此提供了一个自定义函数; Mem_HeapAlloc() 函数。 该函数分配 RTOS 的一些内存“堆”。问题是它没有 free 函数,可能是因为所有东西都进入了堆池。
在 RTOS 中也可以创建一个池。该池的问题是所有包含的 block 需要具有相同的大小。由于我们分配和释放不同的大小,这对我们来说不是一个好的解决方案。
我们找到了一个描述内存 RTOS 功能的文档 HERE 第4章介绍了其功能。
有人知道我们如何解决这个问题吗?
我们已经有了一些解决方案
- 使所有 block 大小与最大分配相同。 由于最小和最大分配差异很大,因此我们有很多开销。
- 不要免费。 这是没有办法解决的,会出现内存泄漏。
希望有人能帮助我们。有不懂的可以问我
提前致谢
最佳答案
您可以按 block 大小的倍数分配对象。
您仍然会有一些内部碎片,因此您将无法充分利用可用空间。
使用内存池仍然具有以下优势
内存池允许以恒定的执行时间(无碎片)进行内存分配。池中数千个对象的内存释放只是一次操作,而不是使用malloc为每个对象分配内存时一个一个的操作。
内存池可以按层次树结构分组,适用于循环和递归等特殊编程结构。
固定大小的 block 内存池不需要存储每次分配的分配元数据,描述分配 block 的大小等特征。特别是对于小型分配,这可以节省大量空间。
关于c - Micriμm μC/OS-III RTOS 中的分配和释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10717409/