輕量級作業系統FreeRTOS的記憶體管理機制(二)

2022-07-07 20:54:13 字數 2165 閱讀 4832

本文由嵌入式企鵝圈原創團隊成員朱衡德(hunter_zhu)供稿.

ucheap

,然後通過指標偏移記錄空間的分配情況,在這種記憶體機制下無法對記憶體進行釋放。同時也介紹了記憶體操作過程中位元組對齊的細節,本篇文章將會對

freertos

原始碼中第二種記憶體管理機制

heap2.c

進行講解,在

heap2.c

中同樣使用乙個全域性靜態陣列

ucheap

來表示記憶體,

heap2.c

記憶體管理機制較

heap1.c

而言增加了記憶體釋放的功能,通過使用鍊錶對記憶體進行有效管理。

一、blocklink_t結構體和鍊錶

在hesp2.c中引入了乙個重要結構體:

blocklink_t結構體用來描述一塊空閒空間的資訊,它放在空閒塊中的前面部分,xblocksize表示空閒塊空間的大小,空間中供程式用的大小為:

描述空閒塊資訊的所有blocklink_t結構體

根據xblocksize按小到大連線成鍊錶。在

heap2.c

中,這個鍊錶的開頭和結尾節點分別是

xstart

和xend

,初始化時

heap2.c

中的鍊錶結構如下:

初始狀態下,鍊錶中只有3個節點,

xstart

是鍊錶的頭節點;第二個節點位於記憶體實際有效分配空間的前面部分,這個

blocklink_t

結構體描述了實際有效分配空間的資訊,如這裡

xblocksize

的值為configadjusted_heap_size

,即初始時整塊可用空間的大小;最後乙個節點為

xend

,它的下乙個節點指向

null

,xblocksize值設定為configadjusted_heap_size是因為鍊錶是按

xblocksize

大小進行排序的。

二、記憶體分配策略

heap2.c記憶體分配的整體思路是:空閒塊通過鍊錶結構進行管理,當需要分配一塊記憶體時,遍歷鍊錶(鍊錶中的節點已經按空閒塊大小進行排序),找到第一塊夠大的空閒塊進行分配,從鍊錶中移除出來,同時檢查這塊空間是否過大,如果過大就將空閒塊進行切割,然後將剩下部分重新用

blocklink_t

描述並插入到鍊錶中。

下圖是應用程式請求分配8個位元組空間後的鍊錶和記憶體空間結構示意圖:

pvportmalloc()核心**:

三、記憶體**機制

sizeof(blocklink_t)

位元組偏移可以得到原來空閒塊的首位址,然後再將空閒塊的

blocklink_t

結構體按小到大的順序插入到空閒塊鍊錶中。

下面兩圖表示了程式釋放8位元組空間後的鍊錶和記憶體空間結構示意圖:

下圖展示了經過多次記憶體分配和**後的鍊錶和記憶體空間結構示意圖:

vportfree()核心**:

可以看出,heap2.c雖然支援記憶體**,但是**記憶體時不進行相鄰空閒塊的合併,因此這種策略會導致記憶體碎片,系統執行久了會出現無法分配過大的連續空間的情況,

heap4.c

中記憶體管理機制就是為了彌補這種缺陷而誕生的,它在

heap2.c

輕量級作業系統FreeRTOS的記憶體管理機制(一)

本文由嵌入式企鵝圈原創團隊成員朱衡德 hunter zhu 供稿.近幾年來,freertos在嵌入式作業系統排行榜中一直位居前列,作為開源的嵌入式作業系統之一,它支援許多不同架構的處理器以及多種編譯工具鏈,具有輕量級 容易移植和使用的特點。本篇文章將會對freertos提供的幾種記憶體分配策略進行介...

了解FreeRTOS作業系統

1 與freertos核心有關的檔案數量為3個,分別是list.c queue.c tasks.c 該檔案位於freertos source 2 與記憶體分配有關的檔案共有5個,分別是heap 1.c,heap 2.c,heap 3.c,heap 4.c,heap 5.c。5個檔案只需選擇其中的1個...

freertos作業系統 任務排程

一 任務建立 目的 應用程式中如何給各任務分配處理時間 任意時刻,os如何使任務投入執行 優先順序如何影響系統行為 任務狀態 如何實現任務 建立乙個或多個任務的例項 任務引數的使用 right 改變任務優先順序 刪除任務 週期性處理 空閒任務何時執行,可以用來幹什麼 解決 任務實現 任務函式 voi...