前言:
现在兄弟们对“首次适应算法代码”可能比较看重,小伙伴们都想要剖析一些“首次适应算法代码”的相关知识。那么小编也在网络上网罗了一些有关“首次适应算法代码””的相关内容,希望小伙伴们能喜欢,看官们快快来学习一下吧!介绍FreeRTOS的内存管理。
在移植FreeRTOS时,我们复制了heap文件夹中的文件,这些文件是内存管理文件。然而,为什么我们在工程中只使用了heap4点c?接下来,我们将介绍为什么需要内存管理。
在FreeRTOS中,创建任务有两种方式:动态创建和静态创建。
在动态创建中,我们只需要提供任务堆栈大小和句柄指针,不需要提供堆栈空间和任务控制块。这是因为FreeRTOS会自动为我们动态分配这些资源,而自动动态分配的空间就是内存管理。内存管理可以实现内存使用时分配,不使用时释放。这样可以简化程序设计。
此外,在使用队列、信号量等时也需要进行内存分配。使用内存的动态管理功能,可以省去自己提前规划各类对象和分配内存的工作,从而简化程序设计。内存分配的方法就在这些heap文件中。heap1到5这几个文件是不同的内存分配方法,它们的区别可以通过这张表查看。
动态创建任务时,FreeRTOS会合并相邻空闲内存,从而避免产生内存碎片。这样可以动态分配内存,并避免内存碎片的问题。
在heap4的基础上,我们还可以管理多个内存区域。
我们先来看看heap1。eap1只实现了malloc功能,没有实现free功能,因此它只能分配内存,不能释放内存。它的实现原理是先定义一个大数组,然后将合适的空间静态分配给每个任务。如果某个任务或队列信号量等删除了,那么这个空间也无法释放,因此它适用于只创建不删除的系统中。
接下来,我们再看看heap2。eap_2也是在数组上分配内存,但它使用了最佳匹配算法来分配内存,并且支持了free功能。最佳匹配算法是指,如果要创建一个任务,它需要17字节空间。堆这里有这几块空闲内存,算法可以找出最小的、能满足17字节的内存,也就是20字节这块空闲内存。
然后,算法会将这20字节内存中的17字节分配给任务,剩下的3字节仍然是空闲内存,可以被申请。如果一直没有小于等于3字节的内存申请,那么这个3字节空闲内存就一直不会被申请,从而形成内存碎片,这就是heap2产生内存碎片的原因。
我们再来看一下heap3。heap3是直接调用标准C库的malloc和free函数,由于其实现过于复杂,占用空间较大,不适合用于资源紧缺的嵌入式系统,因此我们通常不使用它。对于Heap_1、Heap_2和Heap_4,它们使用大数组来分配内存,并使用首次适应算法进行分配。该算法会将相邻的空闲内存合并为一个更大的空闲内存,有助于减少内存碎片问题。Heap_4使用首次适应算法来分配内存,它会找到第一个符合大小的空闲内存块,而不会像Heap_2那样找到最小符合的内存块。它将20字节分为12字节和8字节,将12字节分配给我们申请的8字节仍然是空闲内存,可以被申请。当我们经过多次申请和释放后,内存可能会变成这样:如果内存不能合并,此时再申请一个15字节的任务空间,就不能申请成功。此时的12字节空闲内存就会成为内存碎片。Heap4会将相邻空闲的内存合并到一起,这样再申请一个15字节的任务空间,就能申请成功,也减少了内存碎片。相比之下,Heap_2不会合并相邻的空闲内存,因此会导致严重的“碎片化”问题。我们通常使用Heap4,而不使用Heap2。最后,我们来看一下Heap_5。Heap-5分配内存和释放内存的算法与Heap_4相同。相比之下,Heap_5可以管理多块、分隔开的内存。在嵌入式系统中,内存的地址可能不连续,这种情况下就可以使用Heap_5。总的来说,我们通常使用Heap4,如果需要管理多块内存,就可以使用Heap5,其他情况下使用较少。今天的视频就到这里了,欢迎留言评论。我们下期再见。
标签: #首次适应算法代码