本文由嵌入式企鵝圈原創團隊成員朱衡德(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...