1. 程式人生 > >輕量級作業系統FreeRTOS的記憶體管理機制(一)

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

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

應用程式呼叫此函式請求分配記憶體,需要注意的是函式中有兩個地方為滿足位元組對齊的要求進行調整(cortex-m3為例,8位元組對齊):

1)為確保從靜態陣列ucHeap中分配給應用程式的記憶體塊是8位元組對齊,函式會判斷xWantedSize是否為8的倍數,如果不是,就會添補位元組,因此有時候分配到的記憶體比實際請求的記憶體還要多;

2)確保從靜態陣列ucHeap中第一個8位元組對齊的地方開始進行記憶體分配,用靜態變數pucAlignedHeap記錄首次對齊的地址作為有效空間的首地址;

記憶體分配示意圖:

上圖中可以看到ucHeap前面和後面都有因位元組對齊而丟棄的空間,所丟棄的空間大小要求的位元組對齊數,對於cortex-m3系列是8,實際有效的分配空間為:

即ucHeap陣列實際大小減去位元組對齊數。

3.2void vPortFree( void *pv )

在這種分配策略中,對於已經分配的記憶體不進行釋放。

 

前面主要主要介紹了heap1.c中記憶體分配的策略,也提到了記憶體分配過程中位元組對齊,在heap2.c和heap4.c中位元組對齊的操作和heap1.c中一樣。對於heap2.c和heap4.c的記憶體分配原理會在下篇”FreeRTOS幾種記憶體分配機制(二)”中進行講解。

關注微信公眾號:嵌入式企鵝圈,獲得上百篇物聯網原創技術分享!