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

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

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

FreeRTOS內(nèi)存機(jī)制詳解

冬至子 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2023-12-31 16:49 ? 次閱讀

FreeRTOS內(nèi)存分配方式

FreeRTOS是一種實(shí)時(shí)操作系統(tǒng),它提供了多種內(nèi)存分配方式,包括動(dòng)態(tài)內(nèi)存分配和靜態(tài)內(nèi)存分配。其中,動(dòng)態(tài)內(nèi)存分配是最常用的一種方式,它允許程序在運(yùn)行時(shí)動(dòng)態(tài)地申請(qǐng)和釋放內(nèi)存空間。而靜態(tài)內(nèi)存分配則是在編譯時(shí)就已經(jīng)確定了內(nèi)存空間的大小和位置,無(wú)法在運(yùn)行時(shí)進(jìn)行修改。

靜態(tài)分配內(nèi)存:以靜態(tài)分配方式給任務(wù)、軟件定時(shí)器,信號(hào)量、互斥鎖等系統(tǒng)資源分配資源,不會(huì)調(diào)用freeRTOS的pvPortMalloc內(nèi)存分配接口,在RAM在自定義內(nèi)存空間(全局?jǐn)?shù)組、全局變量等),創(chuàng)建任務(wù)、定時(shí)器。信號(hào)量、互斥鎖等資源,將自定義的內(nèi)存空間與創(chuàng)建的系統(tǒng)資源綁定。內(nèi)存分布如下圖所示:

image.png

動(dòng)態(tài)分配內(nèi)存:以動(dòng)態(tài)分配方式給任務(wù)、軟件定時(shí)器,信號(hào)量、互斥鎖等系統(tǒng)資源分配資源,調(diào)用系統(tǒng)提供的pvPortMalloc內(nèi)存分配接口,在系統(tǒng)的ucHeap中(使用heap_3.c的內(nèi)存管理方式除外,使用heap_3.c內(nèi)存方式,會(huì)直接調(diào)用c庫(kù)的malloc申請(qǐng)空間)申請(qǐng)任務(wù)、信號(hào)量、隊(duì)列、互斥鎖等所需的內(nèi)存空間。內(nèi)存分布如下圖所示(heap_3.c的內(nèi)存管理方式除外):

image.png

在FreeRTOS中,動(dòng)態(tài)內(nèi)存分配是通過(guò)函數(shù)xTaskCreate()來(lái)實(shí)現(xiàn)的。該函數(shù)可以創(chuàng)建一個(gè)任務(wù),并為其分配一定的??臻g和堆空間。其中,??臻g用于存儲(chǔ)函數(shù)調(diào)用時(shí)的局部變量和返回地址等信息,而堆空間則用于存儲(chǔ)任務(wù)運(yùn)行時(shí)需要的數(shù)據(jù)和變量等。

除了xTaskCreate()函數(shù)之外,F(xiàn)reeRTOS還提供了其他的動(dòng)態(tài)內(nèi)存分配函數(shù),如vTaskAllocateBlock()、prvAllocateRAM()等。這些函數(shù)都可以用來(lái)申請(qǐng)一定大小的內(nèi)存空間,并將其分配給指定的任務(wù)或數(shù)據(jù)結(jié)構(gòu)使用。

需要注意的是,在使用動(dòng)態(tài)內(nèi)存分配時(shí),需要確保所申請(qǐng)的內(nèi)存空間不會(huì)超出系統(tǒng)可用的內(nèi)存范圍。否則,可能會(huì)導(dǎo)致系統(tǒng)崩潰或其他不可預(yù)料的錯(cuò)誤發(fā)生。因此,在使用動(dòng)態(tài)內(nèi)存分配時(shí),需要謹(jǐn)慎地評(píng)估所需的內(nèi)存大小,并根據(jù)實(shí)際需求進(jìn)行調(diào)整。

FreeRTOS內(nèi)存操作相關(guān)接口

FreeRTOS提供了一系列的內(nèi)存操作相關(guān)接口,用于對(duì)內(nèi)存進(jìn)行管理和操作。其中,最常用的接口包括以下幾個(gè):

  1. xTaskCreate():創(chuàng)建一個(gè)任務(wù),并為其分配一定的棧空間和堆空間。
  2. vTaskDelete():刪除一個(gè)任務(wù),并釋放其占用的棧空間和堆空間。
  3. vPortFree():釋放一段已經(jīng)分配好的內(nèi)存空間。
  4. prvAllocateRAM():在系統(tǒng)中申請(qǐng)一段連續(xù)的RAM空間,并將其分配給指定的數(shù)據(jù)結(jié)構(gòu)使用。
  5. vTaskSuspendAll():暫停所有正在運(yùn)行的任務(wù),以便進(jìn)行內(nèi)存管理和其他操作。
  6. xTaskGetCurrentTaskHandle():獲取當(dāng)前正在執(zhí)行的任務(wù)句柄。
  7. uxTaskGetNumberOfTasks():獲取當(dāng)前系統(tǒng)中正在運(yùn)行的任務(wù)數(shù)量。
  8. pcTaskGetName():獲取指定任務(wù)的名稱字符串。
  9. xQueueCreate():創(chuàng)建一個(gè)隊(duì)列,并為其分配一定的內(nèi)存空間。
  10. xQueueSend():向指定的隊(duì)列中發(fā)送一個(gè)數(shù)據(jù)項(xiàng)。
  11. xQueueReceive():從指定的隊(duì)列中接收一個(gè)數(shù)據(jù)項(xiàng)。
  12. xQueuePeek():查看指定隊(duì)列中的第一個(gè)數(shù)據(jù)項(xiàng)。
  13. xQueueReset():清空指定隊(duì)列中的所有數(shù)據(jù)項(xiàng)。
  14. xQueueIsFull():判斷指定隊(duì)列是否已滿。
  15. xQueueIsEmpty():判斷指定隊(duì)列是否為空。

以上是FreeRTOS常用的一些內(nèi)存操作相關(guān)接口,通過(guò)這些接口可以實(shí)現(xiàn)對(duì)任務(wù)、隊(duì)列等數(shù)據(jù)的管理和操作。需要注意的是,在使用這些接口時(shí),需要根據(jù)實(shí)際需求選擇合適的參數(shù)和選項(xiàng),以確保系統(tǒng)的穩(wěn)定性和可靠性。

FreeRTOS內(nèi)存管理方式

FreeRTOS采用了一種先進(jìn)的內(nèi)存管理方式,即基于優(yōu)先級(jí)的搶占式多任務(wù)調(diào)度機(jī)制。在這種機(jī)制下,每個(gè)任務(wù)都有一個(gè)優(yōu)先級(jí),高優(yōu)先級(jí)的任務(wù)會(huì)優(yōu)先被調(diào)度執(zhí)行,而低優(yōu)先級(jí)的任務(wù)則會(huì)等待高優(yōu)先級(jí)的任務(wù)執(zhí)行完畢后再進(jìn)行調(diào)度。這種機(jī)制可以有效地避免任務(wù)之間的競(jìng)爭(zhēng)和沖突,提高系統(tǒng)的響應(yīng)速度和穩(wěn)定性。

此外,F(xiàn)reeRTOS還采用了一種稱為“就地”(in-place)的內(nèi)存管理方式。在這種管理方式下,任務(wù)的棧空間和堆空間都是在同一個(gè)連續(xù)的內(nèi)存區(qū)域中分配的,而不是像傳統(tǒng)的操作系統(tǒng)那樣將棧空間和堆空間分開(kāi)來(lái)管理。這種方式可以減少內(nèi)存碎片的產(chǎn)生,提高內(nèi)存利用率和系統(tǒng)性能。同時(shí),由于??臻g和堆空間是在同一個(gè)連續(xù)的內(nèi)存區(qū)域中分配的,因此也方便了任務(wù)之間的通信和數(shù)據(jù)共享。

總之,F(xiàn)reeRTOS采用了一種先進(jìn)的內(nèi)存管理方式,通過(guò)基于優(yōu)先級(jí)的搶占式多任務(wù)調(diào)度機(jī)制和就地內(nèi)存管理方式,實(shí)現(xiàn)了高效、穩(wěn)定、可靠的內(nèi)存管理和任務(wù)調(diào)度功能。這些特性使得FreeRTOS成為了嵌入式系統(tǒng)開(kāi)發(fā)中最常用的實(shí)時(shí)操作系統(tǒng)之一。

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

    評(píng)論

    相關(guān)推薦

    FreeRTOS內(nèi)存是動(dòng)態(tài)分配嗎?

    你可能會(huì)好奇:FreeRTOS可以創(chuàng)建任務(wù),也可以刪除任務(wù),它是動(dòng)態(tài)分配的內(nèi)存嗎?
    的頭像 發(fā)表于 03-24 09:55 ?2215次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>內(nèi)存</b>是動(dòng)態(tài)分配嗎?

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

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

    闡述FreeRTOS系統(tǒng)中機(jī)制的實(shí)現(xiàn)原理

    2--嵌入式操作系統(tǒng)FreeRTOS的原理與實(shí)現(xiàn)摘自::FreeRTOS是一個(gè)源碼公開(kāi)的免費(fèi)的嵌入式實(shí)時(shí)操作系統(tǒng),通過(guò)研究其內(nèi)核可以更好地理解嵌入式操作系統(tǒng)的實(shí)現(xiàn)原理.本文主要闡述FreeRTOS系統(tǒng)中的任務(wù)調(diào)度
    發(fā)表于 12-22 07:15

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

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

    SDRAM內(nèi)存詳解資料

    SDRAM內(nèi)存詳解資料
    發(fā)表于 10-30 15:45 ?8次下載
    SDRAM<b class='flag-5'>內(nèi)存</b><b class='flag-5'>詳解</b>資料

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

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

    FreeRTOS基礎(chǔ)知識(shí)詳解pdf下載

    FreeRTOS基礎(chǔ)知識(shí)詳解
    發(fā)表于 03-29 14:36 ?45次下載

    嵌入式系統(tǒng)內(nèi)存管理機(jī)制詳解

    操作系統(tǒng)的內(nèi)存管理功能用于向操作系統(tǒng)提供一致的地址映射功能和內(nèi)存頁(yè)面的申請(qǐng)、釋放操作。在嵌入式實(shí)時(shí)系統(tǒng)中,內(nèi)存管理根據(jù)不同的系統(tǒng),有不同的策略,對(duì)于有些系統(tǒng)支持的虛擬內(nèi)存管理
    發(fā)表于 11-18 09:41 ?4527次閱讀

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

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

    關(guān)于FreeRTOS內(nèi)存分配多少才合適

    FreeRTOS內(nèi)存分配多少才合適
    的頭像 發(fā)表于 03-06 15:04 ?1.9w次閱讀

    STM32內(nèi)存結(jié)構(gòu)介紹,FreeRTOS內(nèi)存分配技巧,Stack_Size和Heap_Size大小設(shè)置

    STM32內(nèi)存結(jié)構(gòu)介紹和FreeRTOS內(nèi)存分配技巧這是我第一次使用FreeRTOS構(gòu)建STM32的項(xiàng)目,踩了好些坑,又發(fā)現(xiàn)了我缺乏對(duì)于操作系統(tǒng)的內(nèi)
    發(fā)表于 12-09 13:51 ?18次下載
    STM32<b class='flag-5'>內(nèi)存</b>結(jié)構(gòu)介紹,<b class='flag-5'>FreeRTOS</b><b class='flag-5'>內(nèi)存</b>分配技巧,Stack_Size和Heap_Size大小設(shè)置

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

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

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

    本文介紹內(nèi)存管理的基礎(chǔ)知識(shí),詳細(xì)源碼分析見(jiàn)《 FreeRTOS高級(jí)篇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>管理

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

    ,比如任務(wù)創(chuàng)建函數(shù) xTaskCreateStatic(),使用此函數(shù)創(chuàng)建任務(wù)的時(shí)候需要由用戶定義任務(wù)堆棧,我們不討論這種靜態(tài)方法。 使用動(dòng)態(tài)內(nèi)存管理的時(shí)候 FreeRTOS 內(nèi)核在創(chuàng)建任務(wù)、隊(duì)列、信號(hào)量的時(shí)候會(huì)動(dòng)態(tài)的申請(qǐng) RAM。標(biāo)準(zhǔn) C 庫(kù)中的 malloc()和 f
    的頭像 發(fā)表于 07-30 10:26 ?680次閱讀

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

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