一位朋友問:黃哥,我剛學FreeRTOS不久,我想問一下,創(chuàng)建一個任務,堆棧分配多少才合適呢?
1寫在前面
這個關于FreeRTOS操作系統內存分配的問題,其實只要大概明白內存管理,以及資源分配的一些知識,相信就不會存在這種疑惑。
操作系統內存分配如果深入分析的話,知識蠻多的,本文只針對開篇的問題展開一些相關知識的講解。
2
操作系統內存管理
FreeRTOS提供多種內存管理方式,在MemMang文件夾下有5個文件:heap_1到heap_5。
heap,其實是堆的意思,換句話說FrreRTOS系統的內存就是通過分配堆來實現的。(內存管理的知識較多,大家有空可以網上多了解一下,這里不講述)
而目前FreeRTOS常用的就是heap_4這種內存管理方式:通過事先為系統資源分配一個堆(數組),如下圖:
1.可配置在外部,或在heap_4中分配堆;
2.通過FreeRTOSConfig.h配置堆的大小,注意大小單位為字節(jié)。
提示:heap_1至heap_5其他管理方式其實還是有很大差別,這里不講述(后面抽時間再講述),具體可以參看:
https://www.freertos.org/a00111.html
3
系統資源內存分配
FreeRTOS中系統為各資源分配內存,使用heap_4內存管理方式就是在創(chuàng)建之初就分配一段內存。
而分配的這個資源就是從整個系統堆ucHeap劃分了一塊出來。我們創(chuàng)建一個任務,分配堆棧大小的原理,進一步查看代碼:
提示:這個創(chuàng)建任務大小為我們填寫數值x4字節(jié)。比如,填寫128,其實分配的空間為512Byte.(很多人以為單位是字節(jié),發(fā)現多創(chuàng)建幾個任務,內存就分配失敗了)
再比如,創(chuàng)建隊列:
參數1:隊列長度,也就是隊列的數量;
參數2:隊列大小,也就是一個隊列有多少字節(jié);
隊列分配的內存大小就是:參數1x參數2 (單位Byte)。
這里就舉上面兩個例子,重點就是強調:分配內存的單位是字節(jié)(Byte),還是字(4Byte)。
4
哪些變量會占用任務內存
回到最開始的問題:一個任務需要分配多大內存?
任務堆棧就是用于存放該任務的變量數據(也就是程序在執(zhí)行其他任務時,需要把該任務變量數據保存起來)。
那么,一個任務有哪些數據才算是“變量數據”呢?
一個是任務自身需要的內存空間,FreeROS任務自身(如TCB)需要的空間好像就七八十個字節(jié)(我之前計算過,記不得很清楚了)。
二是你自己應用程序臨時變量(如下圖),這個就是由你自己計算,或者估計大小。
許多朋友一上來直接分配堆棧的大小為256(x4字節(jié)),或512(x4字節(jié)),但自己應用程序臨時變量并不多。
如果你應用程序就幾個字節(jié)的臨時變量,分配64(x4字節(jié))都完全夠你用。
提示:這個“臨時變量”包含你應用程序調用的函數所分配的變量。
-
內存
+關注
關注
8文章
2966瀏覽量
73812 -
堆棧
+關注
關注
0文章
182瀏覽量
19717 -
FreeRTOS
+關注
關注
12文章
483瀏覽量
61915
發(fā)布評論請先 登錄
相關推薦
評論