FreeRTOS-内存管理-完结篇

FreeRTOS-内存管理

  • 无论是创建任务、队列、信号量还是其他的东西,都需要为其分配一定空间,前面我们都是运用动态内存申请的方法来申请空间,并且我们所使用的的动态内存申请函数都是FreeRTOS自己提供的,而不是使用C标准库中的malloc()和free()这两个函数,主要是因为以下原因:
  1. 内存动态管理效率低
  2. 线程不安全
  3. 不确定性高,每次执行时间不同
  4. 导致内存碎片
  5. 使链接器配置变得复杂
  • 所以FreeRTOS为我们提供了5种内存管理方法,这5中内存管理方法各有不同 ,分别存放在heap_1、heap_2、heap_3、heap_4、heap_5。在我看来,这五种方法更像是版本迭代,越往后功能越强,但功能强带来的问题就是效率变得比较低。在看这几种方法前我么先来看一下什么是内存碎片。

内存碎片

  • 所谓内存碎片,就是在动态申请和释放过程中,内存变得碎片化。下图表示了内存碎片的生成过程。
    在这里插入图片描述
  • 从上面可见,(1)是没有使用过的内存,但是随着内存的多次申请和释放,(4)中产生了很多空间较小的内存,而剩下的大块内存很少,那些空间小的内存就是聂村碎片。

五中内存管理方法对比

  • 这里仅就五种内存管理方法上做一个简单对比,不会对源码深入分析。

heap_1

  • heap1适用于那些一旦创建好就再也不会删除的任务,heap_1实际上仅提供了内存申请函数,而没有提供内存释放函数,所以内存一旦申请完成就不允许释放了
  • 这样只能申请,不能释放,从而根本上就不会导致内存碎片的问题
  • 相对来说,heap_1代码实现和内存分配过程都比较简单,所以效率较高,很适合不需要动态内存分配的应用

heap_2

  • heap_2相比于heap_1来说,提供了内存释放函数,但是它没有对内存碎片进行处理,所以如果一个应用经常性的申请和释放内存,那么将会导致内存碎片。
  • heap_2适合于应用动态创建和删除任务,并且每次需要分配的堆栈大小都一样,那么这样就不会导致内存碎片。这种情况下非常适合heap_2

heap_3

  • heap_3则是对C标准库中的malloc()和free()函数做了一个简单封装,并对这两个函数做了线程保护,所以相对来说heap_3具有一定的不确定性,并且会增加代码量,效率不高,内存碎片的问题也没有解决

heap_4

  • heap_4功能就比较强大了,它可以用在哪些需要重复创建和删除任务、队列、信号量等应用中,并且heap_4能够处理内存碎片,它会自动将内存碎片合并成一个大的可用内存。但是这样的机制会导致heap_4具有不确定性,但是效率也要比malloc()和free()高

heap_5

  • heap_5和heap_4内存碎片处理是相同的,但是heap_5在heap_4的基础上实现了允许内存跨越多个不连续的内存段,这样使用heap_5的话不但片内RAM的内存可以作为内存堆,片外SRAM也可以作为内存堆来使用。

至此,FreeRTOS应用系列文章终于写完了,前后断断续续学习了将近20天,这一路收获颇多。FreeRTOS作为我第一款深入接触的操作系统,不由得让我感叹操作系统背后的源码构架的如此精妙,但由于学业原因,没有详细的去读里面的所有源码,只能就此结束了。不知道以后是否还会有机会把源码的学习再分享出来。但愿有机会吧,能将核心源码全部分析一边,甚至自己动手写出来一个内核。完。

猜你喜欢

转载自blog.csdn.net/dhejsb/article/details/120228511