heap_1 內(nèi)存分配方法
動(dòng) 態(tài) 內(nèi) 存 分 配 需 要 一 個(gè) 內(nèi) 存 堆 , FreeRTOS 中 的 內(nèi) 存 堆 為 ucHeap[] , 大 小 為configTOTAL_HEAP_SIZE,這個(gè)前面講 FreeRTOS 配置的時(shí)候就講過了。不管是哪種內(nèi)存分配方法,它們的內(nèi)存堆都為 ucHeap[],而且大小都是 configTOTAL_HEAP_SIZE。內(nèi)存堆在文件heap_x.c(x 為 1~5)中定義的,比如 heap_1.c 文件就有如下定義:
#if(configAPPLICATION_ALLOCATED_HEAP==1)
extern
uint8_t
ucHeap[configTOTAL_HEAP_SIZE];
//需要用戶自行定義內(nèi)存堆
#else
static
uint8_t
ucHeap[configTOTAL_HEAP_SIZE];
//編譯器決定
#endif
當(dāng)宏 configAPPLICATION_ALLOCATED_HEAP 為 1 的時(shí)候需要用戶自行定義內(nèi)存堆,否則的話由編譯器來決定,默認(rèn)都是由編譯器來決定的。如果自己定義的話就可以將內(nèi)存堆定義到外部 SRAM 或者 SDRAM 中。
heap_1 實(shí)現(xiàn)起來就是當(dāng)需要 RAM 的時(shí)候就從一個(gè)大數(shù)組(內(nèi)存堆)中分一小塊出來,大數(shù)組(內(nèi)存堆)的容量為 configTOTAL_HEAP_SIZE。使用函數(shù) xPortGetFreeHeapSize() 可以獲取內(nèi)存堆中剩余內(nèi)存大小。
heap_1 特性如下:
1、適用于那些一旦創(chuàng)建好任務(wù)、信號(hào)量和隊(duì)列就再也不會(huì)刪除的應(yīng)用,實(shí)際上大多數(shù)的 FreeRTOS 應(yīng)用都是這樣的。
2、具有可確定性(執(zhí)行所花費(fèi)的時(shí)間大多數(shù)都是一樣的),而且不會(huì)導(dǎo)致內(nèi)存碎片。
3、代碼實(shí)現(xiàn)和內(nèi)存分配過程都非常簡(jiǎn)單,內(nèi)存是從一個(gè)靜態(tài)數(shù)組中分配到的,也就是適合于那些不需要?jiǎng)討B(tài)內(nèi)存分配的應(yīng)用。
如果使用 heap_1,一旦申請(qǐng)內(nèi)存成功就不允許釋放!但是 heap_1 的內(nèi)存分配過程簡(jiǎn)單,如此看來 heap_1 似乎毫無任何使用價(jià)值啊。千萬不能這么想,有很多小型的應(yīng)用在系統(tǒng)一開始就創(chuàng)建好任務(wù)、信號(hào)量或隊(duì)列等,在程序運(yùn)行的整個(gè)過程這些任務(wù)和內(nèi)核對(duì)象都不會(huì)刪除,那么這個(gè)時(shí)候使用 heap_1 就很合適的。
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304797 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3019瀏覽量
74003 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62139
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論