?任務的調度機制(核心是鏈表)!!!
使用鏈表來管理任務
在我前面寫的FreeRTOS任務(深入到源碼進行分析),我創建了三個任務,他們的優先級都是一樣的,所以他們在FreeRTOS中是輪流執行的,實際上,根據不同的需求,會創建出不同優先級的任務,有些任務的優先級高,就會優先執行,只要優先級任務處于就緒狀態之下,低優先級的任務就永遠無法執行。有很多任務都想運行,優先級各不相同,怎么管理它們?
?在task.c文件下面,創建了很多的鏈表,如圖:
每個優先級,都有一個就緒鏈表:pxReadyTasksLists[優先級],
任務被創建時,要使用prvAddNewTaskToReadyList()
來把它放入對應的就緒鏈表,調用過程為:
xTaskCreateprvAddNewTaskToReadyListlistINSERT_END( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) );
?使用鏈表來理解調度機制
第1個任務是誰?
最高優先級的ready list里最后一個創建的任務:
這里可以解釋,為什么在任務進行調度之前,相等優先級以及該優先級是最高優先級的情況下,后創建的任務會先運行,因為pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority,等于狀態下pxCurrentTCB也會指向新創建的任務(后創建的任務)。
?搶占
最高優先級的ready list里的第1個任務永遠可以即刻執行:
?使用鏈表和Tick來理解時間片輪轉
FreeRTOS的任務輪轉時:每個任務運行一個Tick。一個Tick有多大,我們可以在FreeRTOSConfig.h中找到。
在FreeRTOS中,用于配置時鐘節拍頻率和任務調度行為的宏通常包含在FreeRTOSConfig.h文件中。以下是一些常見的宏定義,用于配置FreeRTOS的行為:
1. configTICK_RATE_HZ:用于設置時鐘節拍的頻率,即每秒鐘的時鐘節拍數。
2. configUSE_PREEMPTION:用于啟用或禁用搶占式調度。
3. configUSE_TIME_SLICING:用于啟用或禁用時間片輪轉調度。
4. configMAX_PRIORITIES:用于設置系統支持的最大任務優先級數量。
這些宏定義可以根據你的需求進行配置,以定制化FreeRTOS的行為和任務調度機制。你可以在FreeRTOSConfig.h文件中找到這些宏定義,并根據需要進行修改。
?任務狀態的切換(鏈表+Tick)
任務狀態切換圖?:
Ready:就緒狀態
Blocked:阻塞狀態
Suspended:掛起狀態?
在FreeRTOS中,任務的狀態可以分為幾種,包括就緒狀態(Ready)、阻塞狀態(Blocked)和掛起狀態(Suspended)。這些狀態對應了不同的任務鏈表,這些鏈表在FreeRTOS內核中用于管理任務的調度和狀態轉換。
1. Ready狀態(就緒狀態)的任務存儲在就緒任務列表(Ready List)中。這個列表包含了所有已經準備好運行,但還未被調度執行的任務。
2. Blocked狀態(阻塞狀態)的任務存儲在阻塞任務列表(Blocked List)中。這個列表包含了由于某種原因而無法立即執行的任務,比如等待某個事件發生或者等待某個資源的釋放。
3. Suspended狀態(掛起狀態)的任務通常不會存儲在特定的鏈表中,因為掛起狀態的任務已經被暫時停止,不參與調度。它們的狀態信息通常會以其他方式進行管理,比如在任務控制塊中進行標記。
通過這些鏈表,FreeRTOS可以有效地管理任務的狀態轉換和調度,確保任務按照預期的方式執行。
總結:
鏈表在任務調度中起著至關重要的作用,對任務的管理和調度都有著重要的影響。以下是鏈表在任務調度中的作用和影響的總結:
1. 任務狀態管理:鏈表用于存儲不同狀態的任務,如就緒狀態、阻塞狀態等。通過將任務按照狀態存儲在不同的鏈表中,操作系統可以高效地管理和調度任務。
2. 調度算法實現:操作系統根據不同的調度算法(如優先級調度、時間片輪轉調度等)從任務鏈表中選擇下一個要執行的任務。鏈表提供了數據結構來組織和管理這些任務,以便調度器能夠快速找到合適的任務進行調度。
3. 任務狀態轉換:任務在不同狀態之間轉換時,需要移動到不同的鏈表中。例如,一個任務從就緒狀態變為阻塞狀態時,需要從就緒任務列表中移除并加入到阻塞任務列表中。鏈表提供了數據結構來支持這種狀態轉換操作。
4. 系統性能影響:鏈表的設計和實現會影響任務調度的效率和系統性能。良好設計的鏈表數據結構可以提高調度器的效率,減少任務切換的開銷,并促進系統的穩定運行。
綜上所述,鏈表在任務調度中扮演著關鍵的角色,通過有效地管理任務的狀態和調度順序,幫助操作系統實現高效的任務調度和管理。知道了鏈表和任務調度的關系,在后續的學習中將會如虎添翼,讓你對FreeRTOS的底層掌握更進一步。