0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

freeRTOS源碼中內(nèi)存管理的方案

汽車電子技術(shù) ? 來源:嵌入式之入坑筆記 ? 作者: 嵌入式之入坑筆記 ? 2023-02-10 11:11 ? 次閱讀

freeRTOS源碼中提供了五種內(nèi)存管理的方案,可以說是很方便了。實際需要使用哪一種,可以根據(jù)自己項目的需要進行選擇,都是可以的。

那這五種不同的內(nèi)存管理方式都有哪些差異呢?按照官方給出的說明,這五種內(nèi)存管理的特點分別如下:

1、內(nèi)存管理方式 1(heap_1.c)

heap_1 動態(tài)內(nèi)存管理方式是五種動態(tài)內(nèi)存管理方式中最簡單的,這種方式的動態(tài)內(nèi)存管理一旦申請 了相應(yīng)內(nèi)存后,是不允許被釋放的。

盡管如此,這種方式的動態(tài)內(nèi)存管理還是可以滿足許多的嵌入式項目的, 因為有些嵌入式產(chǎn)品在系統(tǒng)啟動階段就明確了任務(wù)創(chuàng)建、事件標志組、信號量、消息隊列等資源的使用情況, 而且這些資源是整個運行過程中都要一直使用的,并不打算釋放或者丟棄,所以也就不需要釋放內(nèi)存。

FreeRTOS 的 動態(tài)內(nèi)存可以申請的大小范圍可以在 FreeRTOSConfig.h 文件中進行了定義:

#define configTOTAL_HEAP_SIZE   ( ( size_t ) ( 30 * 1024 ) ) //單位字節(jié)

這個宏其實是規(guī)定了操作系統(tǒng)的堆??臻g的總大小,動態(tài)申請的內(nèi)存大小是不能操作這個這個值的。

我們可以通過函數(shù) xPortGetFreeHeapSize 就能獲得 FreeRTOS 動態(tài)內(nèi)存的剩余情況,進而可以根據(jù)剩余情況優(yōu)化 動態(tài)內(nèi)存的大小。

heap_1 方式的動態(tài)內(nèi)存管理有以下特點:

1)項目不需要刪除任務(wù)、信號量、消息隊列等已經(jīng)創(chuàng)建的資源。

2)所申請的動態(tài)內(nèi)存的時間是固定的,并且不會產(chǎn)生內(nèi)存碎片。

3)是一種靜態(tài)內(nèi)存分配方案,因為申請的內(nèi)存是不會被釋放掉。

2、內(nèi)存管理方式 2(heap_2.c)

heap_2 動態(tài)內(nèi)存管理利用了自適應(yīng)算法,并且支持內(nèi)存釋放, 但是不支持內(nèi)存碎片整理。

FreeRTOS 的 動態(tài)內(nèi)存可以申請的大小范圍可以在 FreeRTOSConfig.h 文件中進行了定義:

#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) //單位字節(jié)

通過函數(shù) xPortGetFreeHeapSize 能獲得 FreeRTOS 動態(tài)內(nèi)存的剩余,可以根據(jù)剩余情況優(yōu)化動態(tài)內(nèi)存的大小。

heap_2 方 式的內(nèi)存管理有以下特點:

1)在不考慮內(nèi)存碎片的情況下,這種方式支持重復(fù)的任務(wù)、信號量、事件標志組、軟件定時器等內(nèi)部資源 的創(chuàng)建和刪除。因為不使用的資源是支持釋放的,所以可以讓內(nèi)存資源得到反復(fù)的使用!

2)如果申請和釋放的動態(tài)內(nèi)存大小是隨機的,不建議采用這種動態(tài)內(nèi)存管理方式。

3)項目中需要重復(fù)的創(chuàng)建和刪除任務(wù),如果每次創(chuàng)建需要動態(tài)內(nèi)存大小相同,那么 heap_2 比 較適合,但每次創(chuàng)建需要動態(tài)內(nèi)存大小不同,那么方式 heap_2 就不合適了,因為容易產(chǎn)生內(nèi)存 碎片,內(nèi)存碎片過多的話會導(dǎo)致無法申請出一個大的內(nèi)存塊出來。

4)項目中需要重復(fù)的創(chuàng)建和刪除消息隊列,也會出現(xiàn)類似上面的情況。

5)直接的調(diào)用函數(shù) pvPortMalloc() 和 vPortFree() 也容易出現(xiàn)內(nèi)存碎片。如果按一定順序的申請和釋放,基本沒有內(nèi)存碎片的,而不按順序的隨機申請和釋放容易產(chǎn)生內(nèi)存碎片。

6)如果隨機的創(chuàng)建和刪除任務(wù)、消息隊列、事件標志組、信號量等內(nèi)部資源也容易出現(xiàn)內(nèi)存碎片。

3、 內(nèi)存管理方式 3(heap_3.c)

這種方式實現(xiàn)的內(nèi)存管理是對編譯器提供的 malloc 和 free 函數(shù)進行了封裝,保證是線程安全的。

FreeRTOS 的動態(tài)內(nèi)存大小在 FreeRTOSConfig.h 文件中進行了定義:

#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) //單位字節(jié)

heap_3 方式的內(nèi)存管理有以下特點:

1)需要編譯器提供 malloc 和 free 函數(shù)。

2)不具有時間確定性,即申請動態(tài)內(nèi)存的時間不是固定的。

3)增加 RTOS 內(nèi)核的代碼量。

另外要特別注意一點,這種方式的動態(tài)內(nèi)存申請和釋放不是用的 FreeRTOSConfig.h 文件中定義的heap空間大小,而是用的編譯器設(shè)置的heap空間大小。

4、內(nèi)存管理方式 4(heap_4.c)

heap_4 動態(tài)內(nèi)存管理利用了最適應(yīng)算法,且支持內(nèi)存碎片的回 收并將其整理為一個大的內(nèi)存塊。

FreeRTOS 的動態(tài)內(nèi)存大小在 FreeRTOSConfig.h 文件中進行了定義:

#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) //單位字節(jié)

heap_4 同時支持將動態(tài)內(nèi)存設(shè)置在指定的 RAM 空間位置。

通過函數(shù) xPortGetFreeHeapSize 就能獲得 FreeRTOS 動態(tài)內(nèi)存的剩余。

使用函數(shù) xPortGetMinimumEverFreeHeapSize 能夠獲取從系統(tǒng)啟 動到當前時刻的動態(tài)內(nèi)存最小剩余。

heap_4 方式的 內(nèi)存管理有以下特點:

1)可以用于需要重復(fù)的創(chuàng)建和刪除任務(wù)、信號量、事件標志組、軟件定時器等資源的項目中。

2)調(diào)用 pvPortMalloc() 和 vPortFree(),即使每次申請的內(nèi)存大小都不同,也不會產(chǎn) 生很多的內(nèi)存碎片。

3)申請動態(tài)內(nèi)存的時間不是確定的。

5、 內(nèi)存管理方式 5 (heap_5.c)

如果希望申請的空間可以采用不連續(xù)的內(nèi)存區(qū),比希望可以將內(nèi)存定義在內(nèi)部 SRAM 中的某一部分,或者外部 SRAM 的一部分,就可以采用 heap_5 動態(tài)內(nèi)存管理 方式。

heap_5 內(nèi)存管理通過函數(shù) vPortDefineHeapRegions 進行初始化的,即在創(chuàng)建任 務(wù) FreeRTOS 的內(nèi)部資源前要優(yōu)先調(diào)用這個函數(shù) vPortDefineHeapRegions,否則是無法通過函數(shù) pvPortMalloc 申請到動態(tài)內(nèi)存的。

6、這五種內(nèi)存申請方式的比較

有關(guān)五種動態(tài)內(nèi)存管理方式簡單總結(jié)如下:

1)heap_1.c:五種方式里面最簡單的,但是申請的內(nèi)存不允許釋放。

2)heap_2.c:支持動態(tài)內(nèi)存的申請和釋放,但是不支持內(nèi)存碎片的處理,無法將碎片內(nèi)存合并成一個大的內(nèi)存塊。

3)heap_3.c:將編譯器自帶的 malloc 和 free 函數(shù)進行簡單的封裝,以支持線程安全,即支持多任務(wù)調(diào) 用。

4)heap_4.c:支持動態(tài)內(nèi)存的申請和釋放,支持內(nèi)存碎片處理,支持將動態(tài)內(nèi)存設(shè)置在個固定的地址(內(nèi)部或者外部 RAM)。

5)heap_5.c:在 heap_4.c 的基礎(chǔ)上支持將動態(tài)內(nèi)存設(shè)置在不連續(xù)的區(qū)域上。

其實大多數(shù)項目中使用的都是 heap_4.c 這種內(nèi)存的管理方式,這種方式支持動態(tài)內(nèi)存的申請和釋放,支持內(nèi)存碎片處理,還支持將動態(tài)內(nèi)存設(shè)置在個固定的地址,對大多數(shù)的項目都有很高的滿足性,基本上都能夠適配上了!

五種方式不分優(yōu)劣吧,看自己的項目的需求,合適才是最好的!??!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    629

    瀏覽量

    29074
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61850
  • 內(nèi)存管理
    +關(guān)注

    關(guān)注

    0

    文章

    168

    瀏覽量

    14106
收藏 人收藏

    評論

    相關(guān)推薦

    freeRTOS 源碼

    FreeRTOS是一個迷你操作系統(tǒng)內(nèi)核的小型嵌入式系統(tǒng)。作為一個輕量級的操作系統(tǒng),功能包括:任務(wù)管理、時間管理、信號量、消息隊列、內(nèi)存管理、
    發(fā)表于 01-07 16:38

    第28章 FreeRTOS動態(tài)內(nèi)存管理

    28.4 實驗例程說明28.5總結(jié)28.1動態(tài)內(nèi)存管理介紹 FreeRTOS支持5種動態(tài)內(nèi)存管理方案
    發(fā)表于 09-11 07:15

    FreeRTOS內(nèi)存管理的算法解析?

    關(guān)于FreeRTOS內(nèi)存管理,有人測試過它給定的算法么?會不會有內(nèi)存碎片的出現(xiàn),如果產(chǎn)品一直運行,會不會出現(xiàn)內(nèi)存崩潰的情況。求證啊。目前用h
    發(fā)表于 07-30 11:39

    闡述FreeRTOS系統(tǒng)的機制及在應(yīng)用的優(yōu)缺點

    FreeRTOS是一個源碼公開的免費的嵌入式實時操作系統(tǒng),通過研究其內(nèi)核可以更好地理解嵌入式操作系統(tǒng)的實現(xiàn)原理.本文主要闡述FreeRTOS系統(tǒng)的任務(wù)調(diào)度機制、時間
    發(fā)表于 12-20 06:34

    Freertos關(guān)于堆內(nèi)存管理的相關(guān)資料分享

    內(nèi)存管理Malloc、Free防止內(nèi)存碎片Freertos
    發(fā)表于 12-27 08:12

    FreeRTOS源碼介紹

    。而且一些常用的功能,隊列,內(nèi)存管理,信號量之類的,都有,基本上徹底弄懂一個,對以后理解別的也有幫助。1. FreeRTOS介紹FreeRTOS其實不用再多介紹了,現(xiàn)在太火了,主要是免
    發(fā)表于 02-14 07:42

    FreeRTOS代碼剖析之1:內(nèi)存管理Heap

    內(nèi)存管理是一個操作系統(tǒng)的重要組成部分之一,所有應(yīng)用程序都離不開操作系統(tǒng)的內(nèi)存管理。因此,在剖析FreeRTOS的內(nèi)核代碼之前,前對
    發(fā)表于 02-09 05:25 ?888次閱讀
    <b class='flag-5'>FreeRTOS</b>代碼剖析之1:<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>Heap

    FreeRTOS代碼剖析之3:內(nèi)存管理Heap

    FreeRTOS8.0.1的第三個模型Heap_3,可以說是最容易理解的一個內(nèi)存管理模型。因為在這個模型里,FreeRTOS直接將標準C庫
    發(fā)表于 02-09 05:30 ?392次閱讀

    基于FreeRTOS的嵌入式實時操作系統(tǒng)的原理和實現(xiàn)

    FreeRTOS是一個源碼公開的免費的嵌入式實時操作系統(tǒng),通過研究其內(nèi)核可以更好地理解嵌入式操作系統(tǒng)的實現(xiàn)原理.本文主要闡述FreeRTOS系統(tǒng)的任務(wù)調(diào)度機制、時間
    發(fā)表于 11-18 03:34 ?6609次閱讀

    嵌入式操作系統(tǒng)FreeRTOS內(nèi)存如何管理和堆

    嵌入式操作系統(tǒng)FreeRTOS內(nèi)存管理和堆
    的頭像 發(fā)表于 01-10 15:17 ?4591次閱讀
    嵌入式操作系統(tǒng)<b class='flag-5'>FreeRTOS</b><b class='flag-5'>內(nèi)存</b>如何<b class='flag-5'>管理</b>和堆

    FreeRTOS高級篇7---FreeRTOS內(nèi)存管理分析

    FreeRTOS操作系統(tǒng)將內(nèi)核與內(nèi)存管理分開實現(xiàn),操作系統(tǒng)內(nèi)核僅規(guī)定了必要的內(nèi)存管理函數(shù)原型,而不關(guān)心這些
    發(fā)表于 01-26 17:36 ?7次下載
    <b class='flag-5'>FreeRTOS</b>高級篇7---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>分析

    FreeRTOS系列第8篇---FreeRTOS內(nèi)存管理

    本文介紹內(nèi)存管理的基礎(chǔ)知識,詳細源碼分析見《 FreeRTOS高級篇7---FreeRTOS內(nèi)存
    發(fā)表于 01-26 17:56 ?17次下載
    <b class='flag-5'>FreeRTOS</b>系列第8篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>

    FreeRTOS源碼下載

    內(nèi)存管理文件在FreeRTOS\portable\MemMang文件夾下,FreeRTOS提供了五種內(nèi)存
    的頭像 發(fā)表于 02-10 11:00 ?3061次閱讀
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>源碼</b>下載

    FreeRTOS內(nèi)存管理簡介

    ,比如任務(wù)創(chuàng)建函數(shù) xTaskCreateStatic(),使用此函數(shù)創(chuàng)建任務(wù)的時候需要由用戶定義任務(wù)堆棧,我們不討論這種靜態(tài)方法。 使用動態(tài)內(nèi)存管理的時候 FreeRTOS 內(nèi)核在創(chuàng)建任務(wù)、隊列、信號量的時候會動態(tài)的申請 RA
    的頭像 發(fā)表于 07-30 10:26 ?616次閱讀

    FreeRTOS內(nèi)存管理實現(xiàn)

    FreeRTOS是一個為嵌入式系統(tǒng)設(shè)計的開源實時操作系統(tǒng)。它提供了一個多任務(wù)內(nèi)核和一系列功能,適合在資源受限的設(shè)備上管理實時任務(wù)和應(yīng)用程序。FreeRTOS內(nèi)存
    的頭像 發(fā)表于 10-10 16:17 ?817次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>實現(xiàn)