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 接口在前面的文章已经使用过了。