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