heap_1 內(nèi)存分配方法
動 態(tài) 內(nèi) 存 分 配 需 要 一 個 內(nèi) 存 堆 , FreeRTOS 中 的 內(nèi) 存 堆 為 ucHeap[] , 大 小 為configTOTAL_HEAP_SIZE,這個前面講 FreeRTOS 配置的時候就講過了。不管是哪種內(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 的時候需要用戶自行定義內(nèi)存堆,否則的話由編譯器來決定,默認(rèn)都是由編譯器來決定的。如果自己定義的話就可以將內(nèi)存堆定義到外部 SRAM 或者 SDRAM 中。
heap_1 實現(xiàn)起來就是當(dāng)需要 RAM 的時候就從一個大數(shù)組(內(nèi)存堆)中分一小塊出來,大數(shù)組(內(nèi)存堆)的容量為 configTOTAL_HEAP_SIZE。使用函數(shù) xPortGetFreeHeapSize() 可以獲取內(nèi)存堆中剩余內(nèi)存大小。
heap_1 特性如下:
1、適用于那些一旦創(chuàng)建好任務(wù)、信號量和隊列就再也不會刪除的應(yīng)用,實際上大多數(shù)的 FreeRTOS 應(yīng)用都是這樣的。
2、具有可確定性(執(zhí)行所花費的時間大多數(shù)都是一樣的),而且不會導(dǎo)致內(nèi)存碎片。
3、代碼實現(xiàn)和內(nèi)存分配過程都非常簡單,內(nèi)存是從一個靜態(tài)數(shù)組中分配到的,也就是適合于那些不需要動態(tài)內(nèi)存分配的應(yīng)用。
如果使用 heap_1,一旦申請內(nèi)存成功就不允許釋放!但是 heap_1 的內(nèi)存分配過程簡單,如此看來 heap_1 似乎毫無任何使用價值啊。千萬不能這么想,有很多小型的應(yīng)用在系統(tǒng)一開始就創(chuàng)建好任務(wù)、信號量或隊列等,在程序運行的整個過程這些任務(wù)和內(nèi)核對象都不會刪除,那么這個時候使用 heap_1 就很合適的。
-
嵌入式
+關(guān)注
關(guān)注
5152文章
19675瀏覽量
317691 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3125瀏覽量
75279 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
493瀏覽量
64371
發(fā)布評論請先 登錄
C語言知識總結(jié):動態(tài)內(nèi)存分配
請問cmd中heap默認(rèn)是在哪個段分配呢?
基于FreeRTOS內(nèi)存管理Heap_4.c的實現(xiàn)方法
一種嵌入式系統(tǒng)的內(nèi)存分配方案
FreeRTOS代碼剖析之1:內(nèi)存管理Heap

FreeRTOS代碼剖析之2:內(nèi)存管理Heap

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

heap_2內(nèi)存的特性與分配方法
FreeRTOS heap_3內(nèi)存分配方法

評論