衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

freeRTOS源碼中內存管理的方案

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

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

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

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

heap_1 動態內存管理方式是五種動態內存管理方式中最簡單的,這種方式的動態內存管理一旦申請 了相應內存后,是不允許被釋放的。

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

FreeRTOS 的 動態內存可以申請的大小范圍可以在 FreeRTOSConfig.h 文件中進行了定義:

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

這個宏其實是規定了操作系統的堆棧空間的總大小,動態申請的內存大小是不能操作這個這個值的。

我們可以通過函數 xPortGetFreeHeapSize 就能獲得 FreeRTOS 動態內存的剩余情況,進而可以根據剩余情況優化 動態內存的大小。

heap_1 方式的動態內存管理有以下特點:

1)項目不需要刪除任務、信號量、消息隊列等已經創建的資源。

2)所申請的動態內存的時間是固定的,并且不會產生內存碎片。

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

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

heap_2 動態內存管理利用了自適應算法,并且支持內存釋放, 但是不支持內存碎片整理。

FreeRTOS 的 動態內存可以申請的大小范圍可以在 FreeRTOSConfig.h 文件中進行了定義:

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

通過函數 xPortGetFreeHeapSize 能獲得 FreeRTOS 動態內存的剩余,可以根據剩余情況優化動態內存的大小。

heap_2 方 式的內存管理有以下特點:

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

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

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

4)項目中需要重復的創建和刪除消息隊列,也會出現類似上面的情況。

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

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

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

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

FreeRTOS 的動態內存大小在 FreeRTOSConfig.h 文件中進行了定義:

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

heap_3 方式的內存管理有以下特點:

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

2)不具有時間確定性,即申請動態內存的時間不是固定的。

3)增加 RTOS 內核的代碼量。

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

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

heap_4 動態內存管理利用了最適應算法,且支持內存碎片的回 收并將其整理為一個大的內存塊。

FreeRTOS 的動態內存大小在 FreeRTOSConfig.h 文件中進行了定義:

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

heap_4 同時支持將動態內存設置在指定的 RAM 空間位置。

通過函數 xPortGetFreeHeapSize 就能獲得 FreeRTOS 動態內存的剩余。

使用函數 xPortGetMinimumEverFreeHeapSize 能夠獲取從系統啟 動到當前時刻的動態內存最小剩余。

heap_4 方式的 內存管理有以下特點:

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

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

3)申請動態內存的時間不是確定的。

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

如果希望申請的空間可以采用不連續的內存區,比希望可以將內存定義在內部 SRAM 中的某一部分,或者外部 SRAM 的一部分,就可以采用 heap_5 動態內存管理 方式。

heap_5 內存管理通過函數 vPortDefineHeapRegions 進行初始化的,即在創建任 務 FreeRTOS 的內部資源前要優先調用這個函數 vPortDefineHeapRegions,否則是無法通過函數 pvPortMalloc 申請到動態內存的。

6、這五種內存申請方式的比較

有關五種動態內存管理方式簡單總結如下:

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

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

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

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

5)heap_5.c:在 heap_4.c 的基礎上支持將動態內存設置在不連續的區域上。

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

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

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

    關注

    8

    文章

    652

    瀏覽量

    29452
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62395
  • 內存管理
    +關注

    關注

    0

    文章

    168

    瀏覽量

    14188
收藏 人收藏

    評論

    相關推薦

    freeRTOS 源碼

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

    第28章 FreeRTOS動態內存管理

    28.4 實驗例程說明28.5總結28.1動態內存管理介紹 FreeRTOS支持5種動態內存管理方案
    發表于 09-11 07:15

    FreeRTOS內存管理的算法解析?

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

    闡述FreeRTOS系統的機制及在應用的優缺點

    FreeRTOS是一個源碼公開的免費的嵌入式實時操作系統,通過研究其內核可以更好地理解嵌入式操作系統的實現原理.本文主要闡述FreeRTOS系統的任務調度機制、時間
    發表于 12-20 06:34

    Freertos關于堆內存管理的相關資料分享

    內存管理Malloc、Free防止內存碎片Freertos
    發表于 12-27 08:12

    FreeRTOS源碼介紹

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

    FreeRTOS代碼剖析之1:內存管理Heap

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

    FreeRTOS代碼剖析之3:內存管理Heap

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

    基于FreeRTOS的嵌入式實時操作系統的原理和實現

    FreeRTOS是一個源碼公開的免費的嵌入式實時操作系統,通過研究其內核可以更好地理解嵌入式操作系統的實現原理.本文主要闡述FreeRTOS系統的任務調度機制、時間
    發表于 11-18 03:34 ?6725次閱讀

    嵌入式操作系統FreeRTOS內存如何管理和堆

    嵌入式操作系統FreeRTOS內存管理和堆
    的頭像 發表于 01-10 15:17 ?4816次閱讀
    嵌入式操作系統<b class='flag-5'>FreeRTOS</b><b class='flag-5'>內存</b>如何<b class='flag-5'>管理</b>和堆

    FreeRTOS高級篇7---FreeRTOS內存管理分析

    FreeRTOS操作系統將內核與內存管理分開實現,操作系統內核僅規定了必要的內存管理函數原型,而不關心這些
    發表于 01-26 17:36 ?8次下載
    <b class='flag-5'>FreeRTOS</b>高級篇7---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>內存</b><b class='flag-5'>管理</b>分析

    FreeRTOS系列第8篇---FreeRTOS內存管理

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

    FreeRTOS源碼下載

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

    FreeRTOS內存管理簡介

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

    FreeRTOS內存管理實現

    FreeRTOS是一個為嵌入式系統設計的開源實時操作系統。它提供了一個多任務內核和一系列功能,適合在資源受限的設備上管理實時任務和應用程序。FreeRTOS內存
    的頭像 發表于 10-10 16:17 ?920次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>內存</b><b class='flag-5'>管理</b>實現
    百家乐官网赌博玩法技巧| 网上百家乐内幕| 百家乐官网真人博彩的玩法技巧和规则 | 大发888 df登录| 大发888娱乐场大发888娱乐场| 大发888官网sscbcgsesb| 大发888下载 df888gfxzylc8| 大发888 dafa888 大发官网| 环球棋牌评测网| 8大胜娱乐| 友谊县| 网上百家乐官网好玩吗| 广宗县| 百家乐官网号论坛博彩正网| 大发娱乐场| 玩百家乐上高尔夫娱乐场| 大发888代充值存款| 老牌全讯网| 百家乐官网百乐发破解版| 百家乐官网防伪筹码套装| 红9百家乐官网的玩法技巧和规则 高尔夫百家乐官网的玩法技巧和规则 | 大发888dafa8668| 网上娱乐| 百家乐官网网页游戏网址| 百家乐官网可以作假吗| 牌九百家乐官网的玩法技巧和规则 | 百家乐官网买闲打法| 百家乐投注平台| 自贡百家乐娱乐场开户注册| 大发888在线赌场网站| 足球博彩| 百家乐官网赌博论坛在线| 百家乐百乐发破解版| 大发888棋牌下载| 革吉县| 百家乐官网b28博你| 百家乐搏牌| 新世纪娱乐城信誉怎么样| 百家乐官网视频官方下载| 做生意养猫风水| 太阳城花园|