c - Micriμm μC/OS-III RTOS 中的分配和释放

标签 c memory-management rtos micrium ucos

我们使用 Micrium 的 μC/OS-III RTOS 和 Renesas 的 RX62N。

我们构建了一个必须动态分配和释放数据的系统。我们发现函数 ma​​lloc()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/

相关文章:

c++ - 内存映射文件 - 如何在其他进程中插入一条数据

java - 为什么 RTOS 只用 c 编码?

embedded - 将 Windows 软件移植到嵌入式/实时操作系统

c - 使用 realloc() 初始化内存

c - 短程序在 C 中挂起

java - 任何人都可以建议 eclipse 工具来分析 java 内存使用情况

c - 如何在 RTOS 内处理 WFI

c - GCC header 搜索路径已弃用

c - 如何在 C 中使用 curl 并解析 JSON 响应

c++ - 使用 malloc 分配比现有内存更多的内存