原创 图解FreeRTOS的内存管理 (原创)

2008-11-5 22:09 8619 11 11 分类: MCU/ 嵌入式

因为我一般用的是Heap_2.c,这里就主要讲讲第二种内存分配方式


    方法2优点是,能根据任务需要高效率地使用内存,尤其是当不同的任务需要不同大小的内存的时候。


    方法2的缺点是,不能把应用程序释放的内存和原有的空闲内存混合为一体,因此,若应用程序频繁申请与释放随机大小的内存,就可能造成大量的内存碎片。这就要求应用程序申请与释放内存的大小为有限个固定的值。


    方法2的另一个缺点是,程序执行时间具有一定的不确定性。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


     uCOS-II提供的内存管理机制是把连续的大块内存按分区来管理,每个分区中包含整数个大小相同的内存块。由于每个分区的大小相同,即使频繁地申请和释放内存也不会产生内存碎片问题,但其缺点是内存的利用率相对不高。


   当申请和释放的内存大小均为一个固定值时(如均为2 KB)FreeRTOS的方2 内存分配策略就可以实现类似 uCOS-II的内存管理效果


 


 

 


在FreeRTOS的配置时,我们通过配置configTOTAL_HEAP_SIZE的大小来设置系统堆的大小,我们创建任务时就从堆上申请内存来创建任务的TCB块,以及任务的栈。


 


在第一次调用pvPortMalloc申请内存时,会调用prvHeapInit()初始化堆;


初始化完成后,内存状态如下图:(转载请注明出处:青藤门客播报站



598e45b8-ec8f-4ba7-8a7b-c721a59f846d.JPG


    当申请长度为xWantedSize内存时,在分配内存时,给每段内存加一个长度,并处理地址对齐问题:xWantedSize += heapSTRUCT_SIZE;/*块标识长度*/


   申请成功后,返回分配内存的首地址,并将剩余的内存作为一个新的块插入到空间内存列表。申请成功后内存分布状态如下图所示:



d63ddafb-d267-4179-95a9-40dd9e2c2b02.JPG


再次申请内存,申请成功后内存分布就会变成下图,同时未用的内存块会按大小形成一个链表。


db1a42a0-caf8-4712-a2b7-cc095e8a75a5.JPG


释放内存块时,就会把当前内存块的链表插入到空闲内存块中,可供下一次申请内存使用。


edbb6014-d15c-446f-95da-d0d689939d19.JPG


    若应用程序频繁申请与释放 随机大小的内存,就会发现系统的内存会变得很糟,不再是一块一块的内存,而是碎片,这时再申请大容量的内存,虽然总容量足够,但由于全为碎片,却申请不到内存。


所以嵌入式应用程序要注意这个问题。


点击看大图


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条