你可能會好奇:FreeRTOS可以創(chuàng)建任務(wù),也可以刪除任務(wù),它是動態(tài)分配的內(nèi)存嗎?
xTaskCreate(LED_Task, "LED_Task", 128, NULL, 6, NULL);
這個問題如果要細(xì)說,牽涉到的知識點(diǎn)比較多,下面挑幾個重要相關(guān)的內(nèi)容來解答這個問題。
內(nèi)存靜態(tài)和動態(tài)分配
內(nèi)存分配一般分為:靜態(tài)和動態(tài)分配。
1.靜態(tài)分配內(nèi)存
什么叫靜態(tài)分配內(nèi)存?
簡單來說,就是在編譯的時候就分配的內(nèi)存。你可以理解為芯片上電,指定的某區(qū)域(地址)內(nèi)存就被占用了。
一般有幾種情況,比如:
啟動分配堆棧:
Stack_Size EQU 0x400
定義一個靜態(tài)變量,這個就是最好理解的一個例子:
static int a;
定義一個全局變量/數(shù)組等:
intchar;
2.動態(tài)分配內(nèi)存
什么叫動態(tài)分配內(nèi)存? 與靜態(tài)分配對應(yīng),動態(tài)就是不確定在某個時刻分配的內(nèi)存。 最常見的就是某個函數(shù)定義一個局部變量,如果這個函數(shù)被調(diào)用,就會臨時分配一個內(nèi)存空間給這個變量,執(zhí)行完函數(shù),這個內(nèi)存就被釋放了。
void UART_Send(char *p) { char buf[10]; //...... }還有一個經(jīng)典的就是 malloc() 動態(tài)分配內(nèi)存函數(shù),這個函數(shù)對于普通開發(fā)者一般不建議使用,因為存在一些“弊端”。 比如:忘記使用 free() 釋放內(nèi)存,還有就是容易產(chǎn)生“內(nèi)存碎片”等。
梳理FreeRTOS內(nèi)存分配
1.全局?jǐn)?shù)組(堆棧)
FreeRTOS的內(nèi)存是在 FreeRTOSConfig.h 文件分配的一個全局?jǐn)?shù)組,這個內(nèi)存大小由用戶自己根據(jù)情況分配,比如:
#define configTOTAL_HEAP_SIZE ((size_t)(10 * 1024))
數(shù)組(堆棧)ucHeap:
這個數(shù)組是 FreeRTOS 系統(tǒng)的“堆棧”,創(chuàng)建任務(wù)、信號量、隊列等都會調(diào)用這個堆棧。
2.創(chuàng)建任務(wù)
FreeRTOS創(chuàng)建任務(wù),分配堆棧大小,比如:128“字”
xTaskCreate(LED_Task, "LED_Task", 128, NULL, 6, NULL);
提醒:這里“字”是單位,比如:uint32_t
通過進(jìn)一步追蹤代碼,你會發(fā)現(xiàn)在“創(chuàng)建任務(wù)”函數(shù)中調(diào)用了【pvPortMalloc】函數(shù)分配內(nèi)存。
這是系統(tǒng)自定義的函數(shù),并非標(biāo)準(zhǔn)的malloc函數(shù)。 看似是在“動態(tài)分配內(nèi)存”,實際是在“瓜分”上面定義的全局?jǐn)?shù)組(堆棧)。 具體如何“瓜分”的,可以參看“heap_4.c”源代碼(通過我們使用“heap_4.c”內(nèi)存分配方式,如果其他的可以參看對應(yīng)的源碼)。 其他創(chuàng)建信號量、隊列也是類似原理。
3.刪除任務(wù)
FreeRTOS刪除任務(wù),會調(diào)用“vPortFree()”函數(shù)釋放對應(yīng)的內(nèi)存。
這里會牽涉到 TCB(任務(wù)控制塊),就是任務(wù)相關(guān)的這一塊數(shù)據(jù)。(這里不細(xì)說,后面有機(jī)會再說)。
FreeRTOS是動態(tài)分配內(nèi)存嗎?
看到這里,你能回答開篇這個問題了嗎?
答案:FreeRTOS不是動態(tài)分配內(nèi)存,只是模擬了動態(tài)分配的方式,實際的內(nèi)存是靜態(tài)分配的。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3081瀏覽量
74592 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4353瀏覽量
63292 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62772 -
編譯
+關(guān)注
關(guān)注
0文章
666瀏覽量
33211 -
動態(tài)分配
+關(guān)注
關(guān)注
0文章
5瀏覽量
9760
原文標(biāo)題:FreeRTOS內(nèi)存是動態(tài)分配嗎?
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
C語言既然可以自動為變量分配內(nèi)存,為什么還要用動態(tài)分配內(nèi)存呢?
怎么在LL2和DDR3上用malloc同時動態(tài)分配內(nèi)存
請教關(guān)于在堆區(qū)的動態(tài)分配內(nèi)存問題
請問使用動態(tài)內(nèi)存分配安全嗎?
使用動態(tài)內(nèi)存分配安全嗎
CH545芯片可以使用malloc函數(shù)進(jìn)行內(nèi)存的動態(tài)分配嘛?
請問沒有MMU的ARM芯片是否支持使用malloc()函數(shù)動態(tài)分配內(nèi)存呢?
LPCXpresso55S16如何從閃存中動態(tài)分配內(nèi)存?
動態(tài)分配內(nèi)存知識
51單片機(jī)內(nèi)存動態(tài)分配

為什么需要動態(tài)分配內(nèi)存?

評論