在Micri和#x3BC中分配和免费;mμ;C/OS-III实时操作系统

在Micri和#x3BC中分配和免费;mμ;C/OS-III实时操作系统,c,memory-management,rtos,micrium,ucos,C,Memory Management,Rtos,Micrium,Ucos,我们使用的是Micrium的μC/OS-III实时操作系统和瑞萨的RX62N 我们建立了一个系统,在这个系统中,我们必须动态分配和释放数据。我们发现函数malloc()和free()在RTO中工作不好。 然而,RTOS对此有一个自定义功能;Mem\u HeapAlloc()函数。 此函数用于分配RTOS“生成”堆的一些内存。问题是它没有空闲函数,可能是因为所有内容都进入了堆池 在RTOS中,也可以创建池。这个池的问题是,所有包含块的大小都必须相同。由于我们正在分配和释放不同的大小,这对我们来说不

我们使用的是Micrium的μC/OS-III实时操作系统和瑞萨的RX62N

我们建立了一个系统,在这个系统中,我们必须动态分配和释放数据。我们发现函数malloc()free()在RTO中工作不好。 然而,RTOS对此有一个自定义功能;Mem\u HeapAlloc()函数。 此函数用于分配RTOS“生成”堆的一些内存。问题是它没有空闲函数,可能是因为所有内容都进入了堆池

在RTOS中,也可以创建池。这个池的问题是,所有包含块的大小都必须相同。由于我们正在分配和释放不同的大小,这对我们来说不是一个好的解决方案

我们找到了一个描述内存RTOS功能的文档 第四章介绍了这些功能

有人知道我们如何解决这个问题吗

我们都准备好了一些解决方案

  • 使所有块大小与最大分配相同。 我们有很多开销,因为最小和最大的分配差异很大
  • 不要做免费的工作。 这不是解决方案,将出现内存泄漏
希望有人能帮助我们。如果有什么不清楚的,请问我

提前感谢

  • 您可以按块大小的倍数分配对象。
您仍然会有一些内部碎片,因此无法充分利用可用空间

使用内存池仍有以下优点

  • 内存池允许以恒定的执行时间(无碎片)分配内存。一个池中数千个对象的内存释放只是一个操作,如果使用malloc为每个对象分配内存,则不是逐个操作

  • 内存池可以按层次树结构分组,这适用于循环和递归等特殊编程结构

  • 固定大小的块内存池不需要为每个分配存储分配元数据,描述分配块大小等特征。特别是对于较小的分配,这可以节省大量空间


我们正在为结构分配空间,因此必须继续进行分配。我想,将结构分配到多个对象中是堆管理器的责任。我们并不是真正使用堆管理器,空间只是由RTOS函数提供的,这些函数不保留任何管理。