天天看點

zephyr--堆記憶體池(heap memory pool)堆記憶體池概念實作建議的用法配置選項API

堆記憶體池

堆記憶體池(heap memory pool) 是一個預定義的記憶體池對象,它允許線程像使用

malloc()

那樣從一段通用記憶體區動态地申請記憶體。

概念

堆記憶體池隻能定義一個。與其它記憶體池不同的是,堆記憶體池不能通過記憶體位址對其引用。

堆記憶體池的大小是可配置的,支援如下大小:256 位元組,1024 位元組,4096 位元組和 16384 位元組。

線程可以調用函數

k_malloc()

來動态申請一大塊堆記憶體。所配置設定的位址是 4 位元組對齊的。如果核心沒有找到合适的記憶體塊,将傳回一個

NULL

當線程使用完堆記憶體後,它應當調用

k_free()

将其釋放到堆記憶體池中。

内部操作

堆記憶體池定義了一個包含整個堆的單一的最大尺寸塊;即單一塊的大小是 256、1024、4096 或 16384 位元組。堆記憶體池也定義了一個最小尺寸塊 —— 64 位元組。下表展示了堆記憶體池在每種塊尺寸下所能支援的塊的數量。

堆尺寸 64位元組的塊 256位元組的塊 1025位元組的塊 4096位元組的塊 16384位元組的塊
256 4 1
1024 16 4 1
4096 64 16 4 1
16384 256 64 16 4 1
對于某個給定的尺寸的記憶體塊,能同時配置設定到的數量通常小于上面的表所列舉的結果。例如,每當從大小為 1024 位元組的堆記憶體中配置設定一個大小為 256 位元組的塊後,所能配置設定到的大小為 64 位元組的塊的數量就會減 4。記憶體池 buffer 中的碎片也會進一步減小可用塊的數量。

記憶體塊被配置設定後,它的前 16 個位元組将被核心用于記錄塊描述符。核心随後會使用該描述符釋放塊。是以,如果應用程式請求的堆記憶體大小是 N 位元組,實際至少會使用 N+16 位元組。

實作

定義堆記憶體池

配置選項

CONFIG_HEAP_MEM_POOL_SIZE

用于指定堆記憶體池的大小。

預設情況下,堆記憶體池的大小是零位元組,它訓示核心不要去定義堆記憶體池對象。

配置設定記憶體

函數

k_malloc()

用于配置設定一塊堆記憶體。

下面的代碼先申請了 200 位元組的堆記憶體空間,然後将其填充為零。如果沒有擷取到所需的空間,它将列印一條警告消息。

注意,應用程式實際會接收到一個大小為 256 位元組的記憶體塊,因為這是堆記憶體池所支援的最接近的尺寸。

char *mem_ptr;
      
      
      
       mem_ptr = k_malloc(
       200);
      
      
       if (mem_ptr != 
       NULL)) {
      
          
       memset(mem_ptr, 
       0, 
       200);
      
      
           ...
      
      
       } 
       else {
      
          
       printf(
       "Memory not allocated");
      
      
       }
            

釋放記憶體

函數

k_free()

用于釋放一塊堆記憶體。

下面的代碼申請了 75 位元組的記憶體塊,并在不再使用時釋放。(基于安全考慮,實際上會從堆記憶體池使用 256 位元組的記憶體塊。

char *mem_ptr;
      
      
      
       mem_ptr = k_malloc(
       75);
      
      
       ... 
       /* use memory block */
      
      
       k_free(mem_ptr);
            

建議的用法

您可以像使用

malloc()

那樣使用堆記憶體池動态地配置設定記憶體。

配置選項

相關的配置選項:

  • CONFIG_HEAP_MEM_POOL_SIZE

API

頭檔案

kernel.h

中提供了如下的堆記憶體池 API:

  • k_malloc()

  • k_free()

繼續閱讀