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 實(shí)現(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ù)、信號量和隊(duì)列就再也不會刪除的應(yīng)用,實(shí)際上大多數(shù)的 FreeRTOS 應(yīng)用都是這樣的。
2、具有可確定性(執(zhí)行所花費(fèi)的時間大多數(shù)都是一樣的),而且不會導(dǎo)致內(nèi)存碎片。
3、代碼實(shí)現(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ù)、信號量或隊(duì)列等,在程序運(yùn)行的整個過程這些任務(wù)和內(nèi)核對象都不會刪除,那么這個時候使用 heap_1 就很合適的。
-
嵌入式
+關(guān)注
關(guān)注
5095文章
19189瀏覽量
307987 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3064瀏覽量
74382 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62419
發(fā)布評論請先 登錄
相關(guān)推薦
C語言知識總結(jié):動態(tài)內(nèi)存分配
請問cmd中heap默認(rèn)是在哪個段分配呢?
基于FreeRTOS內(nèi)存管理Heap_4.c的實(shí)現(xiàn)方法
一種嵌入式系統(tǒng)的內(nèi)存分配方案
FreeRTOS代碼剖析之1:內(nèi)存管理Heap
![FreeRTOS代碼剖析之<b class='flag-5'>1</b>:<b class='flag-5'>內(nèi)存</b>管理<b class='flag-5'>Heap</b>](https://file1.elecfans.com//web2/M00/A6/A8/wKgZomUMP2-AXEPPAAAcXbfhrWQ977.png)
FreeRTOS代碼剖析之2:內(nèi)存管理Heap
![FreeRTOS代碼剖析之2:<b class='flag-5'>內(nèi)存</b>管理<b class='flag-5'>Heap</b>](https://file1.elecfans.com//web2/M00/A6/A8/wKgZomUMP2-Af1DuAAAM-f5jrT8382.png)
淺談內(nèi)存分配方式 避免內(nèi)存浪費(fèi)問題
什么是堆內(nèi)存?堆內(nèi)存是如何分配的?
韋東山freeRTOS系列教程之內(nèi)存管理(2)
![韋東山freeRTOS系列教程之<b class='flag-5'>內(nèi)存</b>管理(2)](https://file.elecfans.com//web2/M00/21/A9/poYBAGGkljaAGaCKAABpFtTbD8o186.png)
heap_2內(nèi)存的特性與分配方法
FreeRTOS heap_3內(nèi)存分配方法
![FreeRTOS <b class='flag-5'>heap</b>_3<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配方法</b>](https://file1.elecfans.com/web2/M00/8E/63/wKgZomTFzK-AH4uHAAHr9mmqzkk824.jpg)
評論