zephyr筆記 2 3 3 堆記憶體池

2021-08-19 13:27:59 字數 1436 閱讀 1434

堆記憶體池是乙個預定義的記憶體池物件,它允許執行緒以類似 malloc() 方式從公共記憶體區域動態分配記憶體。

我正在學習 zephyr,乙個很可能會用到很多物聯網裝置上的作業系統,如果你也感興趣,可點此檢視帖子zephyr學習筆記彙總。

只能定義乙個堆記憶體池。與其他記憶體池不同,堆記憶體池不能使用其記憶體位址直接引用。

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

乙個執行緒可以通過呼叫 k_malloc() 來動態分配一堆堆記憶體。分配的塊的位址保證在4個位元組的倍數上對齊。如果找不到合適的堆記憶體塊,則返回 null。

當執行緒完成一堆堆記憶體時,它可以通過呼叫 k_free() 將塊釋放回堆記憶體池。

堆記憶體池定義了包含整個堆的單個最大大小塊; 即,乙個256,1024,4096或16384位元組的單個塊。 堆記憶體池還定義了64位元組的最小塊大小。 因此,下表顯示了堆記憶體池可支援的每個大小的最大塊數。

注意:可以同時分配給定大小的塊的數量通常小於表中顯示的值。 例如,從1024位元組的堆中分配256位元組的塊將減少可用於分配的64位元組塊的數量。對記憶體池的緩衝區進行分段還可以進一步減少塊的可用性。
核心使用從堆記憶體池中分配的任何記憶體塊的前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)) else

通過呼叫 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 中提供了:

k_malloc

()k_free

()

zephyr 系統 記憶體池使用方法

記憶體池 memory pool 是乙個核心物件,它允許從指定的記憶體區域上動態地分配記憶體塊 memory block 同乙個記憶體池中的記憶體塊的大小是不固定的,這樣可以減小由於不同的應用程式需要為大小不同的資料結構分配不同的儲存空間所造成的浪費。記憶體池使用 夥伴 buddy 記憶體分配 演算...

學習筆記 new delete的堆記憶體操作

c c 中的動態記憶體分配是指程式設計師手動執行記憶體分配。動態分配的內存在堆上分配,非靜態和區域性變數在堆疊上分配記憶體 有什麼應用?他與分配給普通變數的記憶體有什麼不同?如何在c 中分配 取消分配記憶體?普通陣列宣告與使用new 宣告普通陣列與使用new分配記憶體塊之間有區別。最重要的區別是,常...

Nginx 原始碼閱讀筆記1 記憶體池

在大體看完 unp 後本來想練手寫乙個小型 http 伺服器的,但是感覺少了點什麼,所以打算先學習一下 nginx 原始碼,看看大牛們是怎麼設計的。然而突然發現自己好像不怎麼了解 nginx,所以花了乙個多星期翻完了 深入理解 nginx 感興趣的部分,加強了對 nginx 的了解。計畫是以 lin...