本文由嵌入式企鵝圈原創團隊成員朱衡德(hunter_zhu)供稿.
近幾年來,freertos在嵌入式作業系統排行榜中一直位居前列,作為開源的嵌入式作業系統之一,它支援許多不同架構的處理器以及多種編譯工具鏈,具有輕量級、容易移植和使用的特點。本篇文章將會對freertos提供的幾種記憶體分配策略進行介紹,freertos允許開發者根據自己的專案實際需要選擇不同的記憶體分配策略或者自定義分配記憶體策略。
一、freertos記憶體分配原始碼
freertos在建立任務、佇列、互斥量、訊號量、軟體定時以及事件組的時候需要從ram中分配記憶體,原始碼目錄:freertosv9.0.0\freertos\source\portable\memmang下提供了5中記憶體分配機制的實現,本文將會講解heap1.c, heap2.c, heap4.c三種。
二、配置freertos記憶體大小
在freertosconfig.h標頭檔案中巨集configtotal_heap_size用於配置核心可用的ram大小:
在heap1.c, heap2.c, heap3.c原始檔中,分配的記憶體實際上是用乙個靜態陣列ucheap來表示:
在mdk編譯後生成的.map檔案裡面可以檢視ucheap符號資訊:
ucheap屬於rw資料,在ram中執行時的位址是0x20002788,大小是前面分配的20*1024位元組。
三、heap1.c記憶體分配機制
heap1.c是freertos提供的多種記憶體分配策略中最簡單的一種,其使用乙個全域性靜態變數xnextfreebyte來記錄未分配使用的記憶體空間的位置,每分配一次就會往後進行偏移。另外,在這種方式中,已經分配的記憶體不會再釋放。
3.1void *pvportmalloc(size_t xwantedsize)
應用程式呼叫此函式請求分配記憶體,需要注意的是函式中有兩個地方為滿足位元組對齊的要求進行調整(cortex-m3為例,8位元組對齊):
1)為確保從靜態陣列ucheap中分配給應用程式的記憶體塊是8位元組對齊,函式會判斷xwantedsize是否為8的倍數,如果不是,就會添補位元組,因此有時候分配到的記憶體比實際請求的記憶體還要多;
2)確保從靜態陣列ucheap中第乙個8位元組對齊的地方開始進行記憶體分配,用靜態變數pucalignedheap記錄首次對齊的位址作為有效空間的首位址;
記憶體分配示意圖:
上圖中可以看到ucheap前面和後面都有因位元組對齊而丟棄的空間,所丟棄的空間大小要求的位元組對齊數,對於cortex-m3系列是8,實際有效的分配空間為:
即ucheap陣列實際大小減去位元組對齊數。
在這種分配策略中,對於已經分配的記憶體不進行釋放。
前面主要主要介紹了heap1.c中記憶體分配的策略,也提到了記憶體分配過程中位元組對齊,在heap2.c和heap4.c中位元組對齊的操作和heap1.c中一樣。對於heap2.c和heap4.c的記憶體分配原理會在下篇」輕量級作業系統freertos的記憶體管理機制(二)」中進行講解。
輕量級作業系統FreeRTOS的記憶體管理機制(二)
本文由嵌入式企鵝圈原創團隊成員朱衡德 hunter zhu 供稿.ucheap 然後通過指標偏移記錄空間的分配情況,在這種記憶體機制下無法對記憶體進行釋放。同時也介紹了記憶體操作過程中位元組對齊的細節,本篇文章將會對 freertos 原始碼中第二種記憶體管理機制 heap2.c 進行講解,在 he...
了解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...