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