1.開發背景
? ? ? ?基于上一篇指引,已經了解了線程的阻塞,這個篇章主要介紹線程優先級的影響
2.開發需求
? ? ? ? 設計實驗驗證高優先級會搶占低優先級線程 CPU
3.開發環境
? ? ? ? window10 + MDK + STM32F429 + FreeRTOS10.3.1
4.實現步驟
????????1)創建測試線程,其中線程 0 不阻塞,線程 1 定時阻塞。開始 2 個線程優先級都是1
/* 動態任務組 */
static void TaskList(void *pvParameters)
{int count = 0;int whichTask = atoi(pvParameters);for ( ; ; ){switch (whichTask){case 0:break;case 1:vTaskDelay(1000);Log_Debug("%s [%d] count = %d\r\n", __func__, whichTask, count++);break;default:vTaskDelay(1000);break;}}
}
? ? ? ? 2)控制線程在 3000ms? 后將線程 0 優先級設置為 2,再過 3000ms 將線程 0 優先級設置為 0,這里涉及到的接口有獲取線程優先級的 uxTaskPriorityGet,設置優先級接口?vTaskPrioritySet
/* 串行延時任務 */
static void TaskCtrl(void *pvParameters)
{vTaskDelay(100);UBaseType_t taskPriority[TASK_LIST_SIZE] = {0};for (int i = 0; i < TASK_LIST_SIZE; i++){taskPriority[i] = uxTaskPriorityGet(p->taskList[i]);}Log_Debug("Priority[0] = %d, Priority[1] = %d\r\n", taskPriority[0], taskPriority[1]);vTaskDelay(3000);Log_Debug("設置測試線程0 優先級 = 2\r\n");vTaskPrioritySet(p->taskList[0], 2);vTaskDelay(3000);Log_Debug("設置測試線程0 優先級 = 0\r\n");vTaskPrioritySet(p->taskList[0], 0);for ( ; ; ){vTaskDelay(1000);}
}
? ? ? ? 3)顯示測試結果
????????如圖在第 0 秒,線程 0 和線程 1 具備相同的優先級,就算線程 0 不阻塞,系統也會定時切換到線程 1,在第 3 秒時提高的線程 0? 的優先級,線程 1 無法繼續運行,直至第 6 秒的時候降低了線程 0 的優先級后線程 1 才可以繼續運行,符合設計預期。
5.?其他
? ? ? ? 除了上述的優先級設置和查詢接口,還有中斷使用的?uxTaskPriorityGetFromISR,如何在中斷中使用 FreeRTOS API 接口在前面的文章已經使用過了。