FreeRTOS【6】线程优先级

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值