一位朋友問(wèn):黃哥,我剛學(xué)FreeRTOS不久,我想問(wèn)一下,創(chuàng)建一個(gè)任務(wù),堆棧分配多少才合適呢?
1寫(xiě)在前面
這個(gè)關(guān)于FreeRTOS操作系統(tǒng)內(nèi)存分配的問(wèn)題,其實(shí)只要大概明白內(nèi)存管理,以及資源分配的一些知識(shí),相信就不會(huì)存在這種疑惑。
操作系統(tǒng)內(nèi)存分配如果深入分析的話(huà),知識(shí)蠻多的,本文只針對(duì)開(kāi)篇的問(wèn)題展開(kāi)一些相關(guān)知識(shí)的講解。
2
操作系統(tǒng)內(nèi)存管理
FreeRTOS提供多種內(nèi)存管理方式,在MemMang文件夾下有5個(gè)文件:heap_1到heap_5。
heap,其實(shí)是堆的意思,換句話(huà)說(shuō)FrreRTOS系統(tǒng)的內(nèi)存就是通過(guò)分配堆來(lái)實(shí)現(xiàn)的。(內(nèi)存管理的知識(shí)較多,大家有空可以網(wǎng)上多了解一下,這里不講述)
而目前FreeRTOS常用的就是heap_4這種內(nèi)存管理方式:通過(guò)事先為系統(tǒng)資源分配一個(gè)堆(數(shù)組),如下圖:

1.可配置在外部,或在heap_4中分配堆;
2.通過(guò)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劃分了一塊出來(lái)。我們創(chuàng)建一個(gè)任務(wù),分配堆棧大小的原理,進(jìn)一步查看代碼:

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

參數(shù)1:隊(duì)列長(zhǎng)度,也就是隊(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)存
回到最開(kāi)始的問(wèn)題:一個(gè)任務(wù)需要分配多大內(nèi)存?
任務(wù)堆棧就是用于存放該任務(wù)的變量數(shù)據(jù)(也就是程序在執(zhí)行其他任務(wù)時(shí),需要把該任務(wù)變量數(shù)據(jù)保存起來(lái))。
那么,一個(gè)任務(wù)有哪些數(shù)據(jù)才算是“變量數(shù)據(jù)”呢?
一個(gè)是任務(wù)自身需要的內(nèi)存空間,F(xiàn)reeROS任務(wù)自身(如TCB)需要的空間好像就七八十個(gè)字節(jié)(我之前計(jì)算過(guò),記不得很清楚了)。
二是你自己應(yīng)用程序臨時(shí)變量(如下圖),這個(gè)就是由你自己計(jì)算,或者估計(jì)大小。

許多朋友一上來(lái)直接分配堆棧的大小為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)存
+關(guān)注
關(guān)注
9文章
3211瀏覽量
76381 -
堆棧
+關(guān)注
關(guān)注
0文章
183瀏覽量
20528 -
FreeRTOS
+關(guān)注
關(guān)注
14文章
499瀏覽量
66958
發(fā)布評(píng)論請(qǐng)先 登錄
keil中c語(yǔ)言的動(dòng)態(tài)分配內(nèi)存
【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配
FreeRTOS和uC/OS-II的功能特性
FreeRTOS與uC/OS-II如何選擇?
FAQ_MA35_Family M4 RAM如何調(diào)整M4的內(nèi)存分配?
RTOS怎么實(shí)現(xiàn)共享內(nèi)存?
【RA4L1-SENSOR】電壓檢測(cè)器第一個(gè)程序增加 FreeRTOS顯示量程0-3300 mV和量程0-15000mV]
超級(jí)電容阻值多少才合適?
【RA4L1-SENSOR】04 用FreeRTOS重構(gòu)工程
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】RA-Eco-RA4M2 移植FreeRTOS
如何使用LAX_CODEGEN啟用動(dòng)態(tài)內(nèi)存分配?
如何查看S32DS中S32平臺(tái)的內(nèi)存分配?
golang內(nèi)存分配
關(guān)于FreeRTOS內(nèi)存分配多少才合適
評(píng)論