RM新时代网站-首页

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

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

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

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

黃工的嵌入式技術(shù)圈 ? 來源:網(wǎng)站整理 ? 2020-03-06 15:04 ? 次閱讀

一位朋友問:黃哥,我剛學(xué)FreeRTOS不久,我想問一下,創(chuàng)建一個(gè)任務(wù),堆棧分配多少才合適呢?

1寫在前面

這個(gè)關(guān)于FreeRTOS操作系統(tǒng)內(nèi)存分配的問題,其實(shí)只要大概明白內(nèi)存管理,以及資源分配的一些知識(shí),相信就不會(huì)存在這種疑惑。

操作系統(tǒng)內(nèi)存分配如果深入分析的話,知識(shí)蠻多的,本文只針對(duì)開篇的問題展開一些相關(guān)知識(shí)的講解。

2

操作系統(tǒng)內(nèi)存管理

FreeRTOS提供多種內(nèi)存管理方式,在MemMang文件夾下有5個(gè)文件:heap_1到heap_5。

heap,其實(shí)是堆的意思,換句話說FrreRTOS系統(tǒng)的內(nèi)存就是通過分配堆來實(shí)現(xiàn)的。(內(nèi)存管理的知識(shí)較多,大家有空可以網(wǎng)上多了解一下,這里不講述)

而目前FreeRTOS常用的就是heap_4這種內(nèi)存管理方式:通過事先為系統(tǒng)資源分配一個(gè)堆(數(shù)組),如下圖:

1.可配置在外部,或在heap_4中分配堆;

2.通過FreeRTOSConfig.h配置堆的大小,注意大小單位為字節(jié)。

提示:heap_1至heap_5其他管理方式其實(shí)還是有很大差別,這里不講述(后面抽時(shí)間再講述),具體可以參看:

https://www.freertos.org/a00111.html

3

系統(tǒng)資源內(nèi)存分配

FreeRTOS中系統(tǒng)為各資源分配內(nèi)存,使用heap_4內(nèi)存管理方式就是在創(chuàng)建之初就分配一段內(nèi)存。

而分配的這個(gè)資源就是從整個(gè)系統(tǒng)堆ucHeap劃分了一塊出來。我們創(chuàng)建一個(gè)任務(wù),分配堆棧大小的原理,進(jìn)一步查看代碼:

提示:這個(gè)創(chuàng)建任務(wù)大小為我們填寫數(shù)值x4字節(jié)。比如,填寫128,其實(shí)分配的空間為512Byte.(很多人以為單位是字節(jié),發(fā)現(xiàn)多創(chuàng)建幾個(gè)任務(wù),內(nèi)存就分配失敗了)

再比如,創(chuàng)建隊(duì)列:

參數(shù)1:隊(duì)列長度,也就是隊(duì)列的數(shù)量;

參數(shù)2:隊(duì)列大小,也就是一個(gè)隊(duì)列有多少字節(jié);

隊(duì)列分配的內(nèi)存大小就是:參數(shù)1x參數(shù)2 (單位Byte)。

這里就舉上面兩個(gè)例子,重點(diǎn)就是強(qiáng)調(diào):分配內(nèi)存的單位是字節(jié)(Byte),還是字(4Byte)。

4

哪些變量會(huì)占用任務(wù)內(nèi)存

回到最開始的問題:一個(gè)任務(wù)需要分配多大內(nèi)存?

任務(wù)堆棧就是用于存放該任務(wù)的變量數(shù)據(jù)(也就是程序在執(zhí)行其他任務(wù)時(shí),需要把該任務(wù)變量數(shù)據(jù)保存起來)。

那么,一個(gè)任務(wù)有哪些數(shù)據(jù)才算是“變量數(shù)據(jù)”呢?

一個(gè)是任務(wù)自身需要的內(nèi)存空間,F(xiàn)reeROS任務(wù)自身(如TCB)需要的空間好像就七八十個(gè)字節(jié)(我之前計(jì)算過,記不得很清楚了)。

二是你自己應(yīng)用程序臨時(shí)變量(如下圖),這個(gè)就是由你自己計(jì)算,或者估計(jì)大小。

許多朋友一上來直接分配堆棧的大小為256(x4字節(jié)),或512(x4字節(jié)),但自己應(yīng)用程序臨時(shí)變量并不多。

如果你應(yīng)用程序就幾個(gè)字節(jié)的臨時(shí)變量,分配64(x4字節(jié))都完全夠你用。

提示:這個(gè)“臨時(shí)變量”包含你應(yīng)用程序調(diào)用的函數(shù)所分配的變量。

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

    關(guān)注

    8

    文章

    3019

    瀏覽量

    74002
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19753
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62139
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    opa627BP用來做前級(jí)放大,接地電阻用多少合適?反饋電阻用多少合適?

    你好,opa627BP 用來做前級(jí)放大,接地電阻用多少合適,反饋電阻用多少合適,謝謝
    發(fā)表于 10-31 07:38

    如何使用反射內(nèi)存交換機(jī)

    反射內(nèi)存交換機(jī)是一種用于實(shí)現(xiàn)高速數(shù)據(jù)共享和通信的關(guān)鍵設(shè)備,以下是關(guān)于如何使用反射內(nèi)存交換機(jī)的詳細(xì)介紹:一、前期準(zhǔn)備?在開始使用反射內(nèi)存交換機(jī)之前,需要進(jìn)行以下準(zhǔn)備工作:?1.了解系統(tǒng)需
    發(fā)表于 09-14 09:23 ?0次下載

    轉(zhuǎn)載 golang內(nèi)存分配

    Go 的分配采用了類似 tcmalloc 的結(jié)構(gòu).特點(diǎn): 使用一小塊一小塊的連續(xù)內(nèi)存頁, 進(jìn)行分配某個(gè)范圍大小的內(nèi)存需求. 比如某個(gè)連續(xù) 8KB 專門用于
    的頭像 發(fā)表于 09-05 14:12 ?255次閱讀
    轉(zhuǎn)載 golang<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    如何自定義內(nèi)存控制器的設(shè)置

    FreeRTOS中自定義內(nèi)存控制器的設(shè)置,主要涉及到內(nèi)存分配策略的選擇和配置。FreeRTOS提供了多種
    的頭像 發(fā)表于 09-02 14:28 ?456次閱讀

    freertos最多支持多少個(gè)任務(wù)

    FreeRTOS是一個(gè)輕量級(jí)的實(shí)時(shí)操作系統(tǒng)(RTOS),其設(shè)計(jì)初衷就是為了提供簡單、可靠且高效的實(shí)時(shí)任務(wù)管理。關(guān)于FreeRTOS最多支持多少個(gè)任務(wù)的問題,實(shí)際上并沒有一個(gè)固定的上限,這主要取決于
    的頭像 發(fā)表于 09-02 14:21 ?845次閱讀

    堆棧和內(nèi)存的基本知識(shí)

    本文主要聊聊關(guān)于堆棧的內(nèi)容。包括堆棧和內(nèi)存的基本知識(shí)。常見和堆棧相關(guān)的 bug,如棧溢出,內(nèi)存泄漏,堆內(nèi)存分配失敗等。后面介紹軟件中堆棧統(tǒng)計(jì)
    的頭像 發(fā)表于 08-29 14:10 ?444次閱讀
    堆棧和<b class='flag-5'>內(nèi)存</b>的基本知識(shí)

    可以用os_malloc() 分配多少內(nèi)存?有哪些限制?

    我可以用 os_malloc() 分配多少內(nèi)存?有哪些限制?
    發(fā)表于 07-15 06:32

    在tc397 + freertos + lwip + cycloneDDS中分配內(nèi)存失敗了怎么解決?

    你好,我在tc397中使用tc397+freertos+lwip的cyscloneDDS,因?yàn)閏ycloneDDS需要分配較大的內(nèi)存: ddsi_rbufpool_new: rb
    發(fā)表于 07-05 07:17

    ESP32S3+LVGL創(chuàng)建一個(gè)界面,請(qǐng)問能只在SPIRAM分配內(nèi)存,IRAM不分配嗎?

    各位前輩好。ESP32S3+LVGL的開發(fā)的過程中發(fā)現(xiàn),創(chuàng)建一個(gè)界面,會(huì)同時(shí)在SPIRAM和IRAM分配相同大小的內(nèi)存。請(qǐng)問能只在SPIRAM分配內(nèi)存,IRAM不
    發(fā)表于 06-06 07:45

    FreeRTOS如何在中斷中調(diào)用內(nèi)存分配函數(shù)?

    最近在玩FreeRTOS,遇到一個(gè)問題,就是不知如何在中斷中調(diào)用內(nèi)存分配函數(shù)。pvPortMalloc函數(shù)中會(huì)調(diào)用xTaskResumeAll,而這個(gè)函數(shù)不能再中斷調(diào)用,所以請(qǐng)問在中斷中進(jìn)行內(nèi)
    發(fā)表于 05-08 08:25

    freertos任務(wù)創(chuàng)建,每一個(gè)任務(wù)分配內(nèi)存是多大才好,怎么計(jì)算呢?

    小白剛剛接觸freertos,想問一下就創(chuàng)建任務(wù)而言,每一個(gè)任務(wù)分配內(nèi)存是多大才好,怎么計(jì)算呢? 另外,每個(gè)任務(wù)的執(zhí)行周期怎么確定?在任務(wù)里面放延時(shí)函數(shù)嗎?
    發(fā)表于 04-23 06:39

    C語言內(nèi)存泄漏問題原理

    內(nèi)存泄漏問題只有在使用堆內(nèi)存的時(shí)候才會(huì)出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問題,因?yàn)闂?b class='flag-5'>內(nèi)存會(huì)自動(dòng)分配和釋放
    發(fā)表于 03-19 11:38 ?521次閱讀
    C語言<b class='flag-5'>內(nèi)存</b>泄漏問題原理

    Linux內(nèi)核內(nèi)存管理之內(nèi)核非連續(xù)物理內(nèi)存分配

    我們已經(jīng)知道,最好將虛擬地址映射到連續(xù)頁幀,從而更好地利用緩存并實(shí)現(xiàn)更低的平均內(nèi)存訪問時(shí)間。然而,如果對(duì)內(nèi)存區(qū)域的請(qǐng)求并不頻繁,那么考慮基于通過連續(xù)線性地址訪問非連續(xù)頁幀的分配方案是有意義的。該模式
    的頭像 發(fā)表于 02-23 09:44 ?944次閱讀
    Linux內(nèi)核<b class='flag-5'>內(nèi)存</b>管理之內(nèi)核非連續(xù)物理<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    Linux內(nèi)核內(nèi)存管理之ZONE內(nèi)存分配

    內(nèi)核中使用ZONE分配器滿足內(nèi)存分配請(qǐng)求。該分配器必須具有足夠的空閑頁幀,以便滿足各種內(nèi)存大小請(qǐng)求。
    的頭像 發(fā)表于 02-21 09:29 ?890次閱讀

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

    FreeRTOS是一種實(shí)時(shí)操作系統(tǒng),它提供了多種內(nèi)存分配方式,包括動(dòng)態(tài)內(nèi)存分配和靜態(tài)內(nèi)存
    的頭像 發(fā)表于 12-31 16:49 ?2681次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>內(nèi)存</b>機(jī)制詳解
    RM新时代网站-首页