雖然現在的單片機系統,CPU的資源并不是那么緊缺了,也有豐富的內存空間,但是我們還是要積極地實現內存管理,這可以幫我們減少內存資源的占用,優化程序,提高效率。
而任務調度算法,則是幫助我們合理安排實時系統中各個任務的邏輯順序,保證各個任務按照某種規則協調有效地進行。
1
內存管理
- 堆(heap):就是一塊空閑的內存,需要提供管理函數
- 棧(stack):函數調用時局部變量保存在棧中,當前程序的環境也是保存在棧中
FreeRTOS 中內存管理的接口函數為:pvPortMalloc 、 vPortFree ,對應于 C 庫的 malloc 、 free。
源碼中提供了5種內存管理的方法。
1.heap_1
它只實現了pvPortMalloc,沒有實現vPortFree。
它的實現過程就是,先定義一個大數組(堆)-A,當用戶創建任務時B圖中的藍色區域被占用,創建更多任務時,如圖所示。
2.heap_2
Heap_2 使用 最佳匹配算法 (best fifit) 來分配內存,它支持vPortFree釋放內存
Heap_2 不會合并相鄰的空閑內存,所以 Heap_2 會導致嚴重的 " 碎片化 " 問題。
但是,如果申請、分配內存時大小總是相同的,這類場景下 Heap_2 沒有碎片化的問題。所以它適用于:頻繁地創建、刪除任務,但是任務的棧大小都是相同的( 創建任務時,需要分配 TCB 和棧, TCB 總是一樣的) 。
3.heap_3
Heap_3 使用標準 C 庫里的 malloc 、 free 函數,所以堆大小由鏈接器的配置決定,配置項confifigTOTAL_HEAP_SIZE 不再起作用。
4.heap_4
Heap_4 使用首次適應算法 (fifirst fifit) 來分配內存。它還會把相鄰的空閑內存合并為一個更大的空閑內存, 這有助于較少內存的碎片問題。
Heap_4 會把相鄰空閑內存合并為一個大的空閑內存,可以較少內存的碎片化問題。適用于這種場景:頻繁地分配、釋放不同大小的內存。
5.heap_5
Heap_5 分配內存、釋放內存的算法跟 Heap_4 是一樣的。相比于 Heap_4 , Heap_5 并不局限于管理一個大數組:它可以管理多塊、分隔開的內存。
在嵌入式系統中,內存的地址可能并不連續,這種場景下可以使用 Heap_5 ,但需要進行初始化:確定這些內存塊在哪、多大。
內存分配失敗時的鉤子函數:
在 FreeRTOSConfifig.h 中,把宏 confifigUSE_MALLOC_FAILED_HOOK 定義為1,可以開啟使用一個鉤子函數vApplicationMallocFailedHook,當pvPortMalloc失敗后,可以在這個鉤子函數中做一些事情。
void * pvPortMalloc( size_t xWantedSize )vPortDefineHeapRegions
{
......
#if ( configUSE_MALLOC_FAILED_HOOK == 1 )
{
if( pvReturn == NULL )
{
extern void vApplicationMallocFailedHook( void );
vApplicationMallocFailedHook();
}
}
#endif
return pvReturn;
}
2
任務調度
所謂調度算法就是怎么確定哪個就緒態的任務可以切換為運行狀態。
通過配置文件 FreeRTOSConfifig.h 的兩個配置宏來配置調度算法:confifigUSE_PREEMPTION、confifigUSE_TIME_SLICING 。
- confifigUSE_PREEMPTION:為1時,采用可搶占調度,高優先級的任務搶先執行;為0時,當一個任務正在執行時,就算一個更高優先級的任務處于Ready狀態了也不能打斷該任務的執行,除非這個任務自己停止。
- confifigUSE_TIME_SLICING:為1時,開啟時間片調度,同優先級的任務輪流執行;為0時,
當前任務會一直執行,直到主動放棄、或者被高優先級任務搶占。
3
總結
關于內存管理及任務調度寫這些,后面會進行常用的任務--通訊方式堆棧、隊列等的介紹。
-
FreeRTOS
+關注
關注
12文章
485瀏覽量
63495 -
狀態機
+關注
關注
2文章
493瀏覽量
27970 -
STM32F103
+關注
關注
33文章
481瀏覽量
64844 -
內存管理
+關注
關注
0文章
168瀏覽量
14423
發布評論請先 登錄
相關推薦
轉:第10章 FreeRTOS任務管理
轉:第14章 任務調度—搶占式,時間片和合作式
將FreeRTOS移植到STM32F103中的步驟
STM32F103教程之STM32F103單片機的使用心得資料免費下載
STM32F103的系列Ucos程序合集免費下載

GD32F103與STM32F103的區別 2021.6.2

評論