heap_2 內(nèi)存分配方法
heap_2 提供了一個(gè)更好的分配算法,不像 heap_1那樣,heap_2 提供了內(nèi)存釋放函數(shù)。heap_2 不會(huì)把釋放的內(nèi)存塊合并成一個(gè)大塊,這樣有一個(gè)缺點(diǎn),隨著你不斷的申請(qǐng)內(nèi)存,內(nèi)存堆就會(huì)被分為很多個(gè)大小不一的內(nèi)存(塊),也就是會(huì)導(dǎo)致內(nèi)存碎片!
heap_2 的特性如下:
1、可以使用在那些可能會(huì)重復(fù)的刪除任務(wù)、隊(duì)列、信號(hào)量等的應(yīng)用中,要注意有內(nèi)存碎片產(chǎn)生!
2、如果分配和釋放的內(nèi)存 n 大小是隨機(jī)的,那么就要慎重使用了,比如下面的示例:
● 如果一個(gè)應(yīng)用動(dòng)態(tài)的創(chuàng)建和刪除任務(wù),而且任務(wù)需要分配的堆棧大小都是一樣的,那么 heap_2 就非常合適。如果任務(wù)所需的堆棧大小每次都是不同,那么 heap_2 就不適合了,因?yàn)檫@樣會(huì)導(dǎo)致內(nèi)存碎片產(chǎn)生,最終導(dǎo)致任務(wù)分配不到合適的堆棧!
● 如果一個(gè)應(yīng)用中所使用的隊(duì)列存儲(chǔ)區(qū)域每次都不同,那么 heap_2 就不適合了,和上面一樣。
● 應(yīng)用需要調(diào)用 pvPortMalloc()和 vPortFree()來申請(qǐng)和釋放內(nèi)存,而不是通過其他 FreeRTOS 的其他 API 函數(shù)來間接的調(diào)用,這種情況下 heap_2 不適合。
3、如果應(yīng)用中的任務(wù)、隊(duì)列、信號(hào)量和互斥信號(hào)量具有不可預(yù)料性(如所需的內(nèi)存大小不能確定,每次所需的內(nèi)存都不相同,或者說大多數(shù)情況下所需的內(nèi)存都是不同的)的話可能會(huì)導(dǎo)致內(nèi)存碎片。
4、具有不可確定性,但是也遠(yuǎn)比標(biāo)準(zhǔn) C 中的 mallo()和 free()效率高!heap_2 基本上可以適用于大多數(shù)的需要?jiǎng)討B(tài)分配內(nèi)存的工程中,而 heap_4 更是具有將內(nèi)存碎片合并成一個(gè)大的空閑內(nèi)存塊(就是內(nèi)存碎片回收)的功能。
-
嵌入式
+關(guān)注
關(guān)注
5125文章
19438瀏覽量
313198 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3102瀏覽量
74890 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
485瀏覽量
63518
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C語言知識(shí)總結(jié):動(dòng)態(tài)內(nèi)存分配
請(qǐng)問cmd中heap默認(rèn)是在哪個(gè)段分配呢,動(dòng)態(tài)分配段名是什么?
請(qǐng)問cmd中heap默認(rèn)是在哪個(gè)段分配呢?
基于FreeRTOS內(nèi)存管理Heap_4.c的實(shí)現(xiàn)方法
一種嵌入式系統(tǒng)的內(nèi)存分配方案
FreeRTOS代碼剖析之2:內(nèi)存管理Heap

淺談內(nèi)存分配方式 避免內(nèi)存浪費(fèi)問題
什么是堆內(nèi)存?堆內(nèi)存是如何分配的?
韋東山freeRTOS系列教程之內(nèi)存管理(2)

heap_1內(nèi)存分配方法
FreeRTOS heap_3內(nèi)存分配方法

評(píng)論