堆記憶體池
堆記憶體池(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 位元組的記憶體塊,因為這是堆記憶體池所支援的最接近的尺寸。
|
釋放記憶體
函數
k_free()
用于釋放一塊堆記憶體。
下面的代碼申請了 75 位元組的記憶體塊,并在不再使用時釋放。(基于安全考慮,實際上會從堆記憶體池使用 256 位元組的記憶體塊。
|
建議的用法
您可以像使用
malloc()
那樣使用堆記憶體池動态地配置設定記憶體。
配置選項
相關的配置選項:
-
CONFIG_HEAP_MEM_POOL_SIZE
API
頭檔案
kernel.h
中提供了如下的堆記憶體池 API:
-
k_malloc()
-
k_free()