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