首页 > 其他分享 >FreeRTOS中的任务优先级划分策略

FreeRTOS中的任务优先级划分策略

时间:2023-12-22 12:02:52浏览次数:31  
标签:优先级 FreeRTOS void 任务 PRIORITY 划分 NULL

FreeRTOS是一款广泛应用的实时操作系统,它采用任务优先级来调度不同任务的执行顺序。在多任务系统中,合理的任务优先级划分策略是确保系统稳定性和性能的关键之一。本文将深入探讨FreeRTOS中的任务优先级划分策略,以及通过详细的代码演示展示如何灵活地配置任务的优先级。

1. 任务优先级概述

在FreeRTOS中,任务的优先级范围通常从0到(configMAX_PRIORITIES - 1),其中configMAX_PRIORITIES是用户在FreeRTOS配置中定义的常量。优先级数越大,优先级越高,任务越早被调度执行。

2. 优先级划分策略

2.1 平均划分

一种简单的任务优先级划分策略是平均划分,即将可用的优先级范围均匀地分配给各个任务。这样的划分可以确保每个任务都有相对平等的机会被调度执行。

// 定义任务的优先级
#define TASK1_PRIORITY  (configMAX_PRIORITIES / 2)
#define TASK2_PRIORITY  (configMAX_PRIORITIES / 2 - 1)

void vTask1(void *pvParameters) {
    // 任务1逻辑
}

void vTask2(void *pvParameters) {
    // 任务2逻辑
}

int main() {
    // 创建任务1和任务2
    xTaskCreate(vTask1, "Task1", configMINIMAL_STACK_SIZE, NULL, TASK1_PRIORITY, NULL);
    xTaskCreate(vTask2, "Task2", configMINIMAL_STACK_SIZE, NULL, TASK2_PRIORITY, NULL);

    // 启动FreeRTOS调度器
    vTaskStartScheduler();

    // 正常情况下不会执行到这里
    return 0;
}

2.2 优先级分层

另一种策略是根据任务的功能和紧急程度将优先级进行分层。紧急程度较高的任务分配较高的优先级,确保这些任务更早地得到执行。

// 定义任务的优先级
#define HIGH_PRIORITY   (configMAX_PRIORITIES - 1)
#define MID_PRIORITY    (configMAX_PRIORITIES / 2)
#define LOW_PRIORITY    (configMAX_PRIORITIES / 4)

void vHighPriorityTask(void *pvParameters) {
    // 高优先级任务逻辑
}

void vMidPriorityTask(void *pvParameters) {
    // 中优先级任务逻辑
}

void vLowPriorityTask(void *pvParameters) {
    // 低优先级任务逻辑
}

int main() {
    // 创建高、中、低优先级任务
    xTaskCreate(vHighPriorityTask, "HighTask", configMINIMAL_STACK_SIZE, NULL, HIGH_PRIORITY, NULL);
    xTaskCreate(vMidPriorityTask, "MidTask", configMINIMAL_STACK_SIZE, NULL, MID_PRIORITY, NULL);
    xTaskCreate(vLowPriorityTask, "LowTask", configMINIMAL_STACK_SIZE, NULL, LOW_PRIORITY, NULL);

    // 启动FreeRTOS调度器
    vTaskStartScheduler();

    // 正常情况下不会执行到这里
    return 0;
}

3. 动态调整优先级

FreeRTOS允许在运行时动态调整任务的优先级。通过使用vTaskPrioritySet函数,可以根据实时需求在任务执行过程中调整其优先级。

void vDynamicPriorityTask(void *pvParameters) {
    int originalPriority = uxTaskPriorityGet(NULL);

    while (1) {
        // 根据任务执行情况动态调整优先级
        if (/* some condition */) {
            vTaskPrioritySet(NULL, originalPriority + 1);
        } else {
            vTaskPrioritySet(NULL, originalPriority);
        }

        // 任务逻辑
    }
}

4. 代码演示

以下是一个包含不同优先级划分策略的FreeRTOS程序,演示了平均划分、优先级分层和动态调整优先级的使用:

#include "FreeRTOS.h"
#include "task.h"

// 平均划分策略
#define TASK1_PRIORITY  (configMAX_PRIORITIES / 2)
#define TASK2_PRIORITY  (configMAX_PRIORITIES / 2 - 1)

// 优先级分层策略
#define HIGH_PRIORITY   (configMAX_PRIORITIES - 1)
#define MID_PRIORITY    (configMAX_PRIORITIES / 2)
#define LOW_PRIORITY    (configMAX_PRIORITIES / 4)

void vTask1(void *pvParameters) {
    // 任务1逻辑
}

void vTask2(void *pvParameters) {
    // 任务2逻辑
}

void vHighPriorityTask(void *pvParameters) {
    // 高优先级任务逻辑
}

void vMidPriorityTask(void *pvParameters) {
    // 中优先级任务逻辑
}

void vLowPriorityTask(void *pvParameters) {
    // 低优先级任务逻辑
}

void vDynamicPriorityTask(void *pvParameters) {
    int originalPriority = uxTaskPriorityGet(NULL);

    while (1) {
        // 根据任务执行情况动态调整优先级
        if (/* some condition */) {
            vTaskPrioritySet(NULL, originalPriority + 1);
        } else {
            vTaskPrioritySet(NULL, originalPriority);
        }

        // 任务逻辑
    }
}

int main() {
    // 创建示例任务
    xTaskCreate(vTask1, "Task1", configMINIMAL_STACK_SIZE, NULL, TASK1_PRIORITY, NULL);
    xTaskCreate(vTask2, "Task2", configMINIMAL_STACK_SIZE, NULL, TASK2_PRIORITY, NULL);
    xTaskCreate(vHighPriorityTask, "HighTask", configMINIMAL_STACK_SIZE, NULL, HIGH_PRIORITY, NULL);
    xTaskCreate(vMidPriorityTask, "MidTask", configMINIMAL_STACK_SIZE, NULL, MID_PRIORITY, NULL);
    xTaskCreate(vLowPriorityTask, "LowTask", configMINIMAL_STACK_SIZE, NULL, LOW_PRIORITY, NULL);
    xTaskCreate(vDynamicPriorityTask, "DynamicTask", configMINIMAL_STACK_SIZE, NULL, MID_PRIORITY, NULL);

    // 启动FreeRTOS调度器
    vTaskStartScheduler();

    // 正常情况下不会执行到这里
    return 0;
}

5. 总结

通过合理的任务优先级划分策略,可以有效提高FreeRTOS系统的响应速度和性能。在设计和实现嵌入式系统时,开发者应该根据任务的紧急程度和功能特点选择适当的优先级划分策略,以满足实时性和稳定性的需求。希望通过本文的介绍和代码演示,读者能够更好地理解FreeRTOS中任务优先级的划分和调度机制。

标签:优先级,FreeRTOS,void,任务,PRIORITY,划分,NULL
From: https://blog.51cto.com/u_16192077/8933999

相关文章

  • FreeRTOS中信号量和互斥量背后的原理
    FreeRTOS是一个流行的嵌入式实时操作系统,提供了信号量和互斥量等同步机制来协调任务之间的访问共享资源。本文将深入探讨FreeRTOS中信号量和互斥量的背后原理,以及如何使用这些机制确保系统的稳定性和性能。1.信号量和互斥量的概念1.1信号量信号量是一种计数器,用于控制多个任务对......
  • springboot配置文件的优先级
     1配置文件不同位置优先级不同 文件路径相对目录级别 classpath:application.ymlresources目录最低-程序员classpath:config/application.yml resources目录下的config目录项目经理file:application.ymljar包所在目录下的config目录运维file:co......
  • FreeRTOS--递归锁
    示例源码基于FreeRTOSV9.0.0递归锁1.概述递归锁是特殊的互斥量,允许同一任务多次获取和释放锁,而不会造成死锁;获取和释放的次数必须相同;递归锁的实现依赖于内部的uxRecursiveCallCount变量,它标记递归的次数,每次上锁加1,每次解锁减1,减为0才真正释放锁;递归锁也不能在中断内使用......
  • FreeRTOS--互斥量
    示例源码基于FreeRTOSV9.0.0互斥量1.概述互斥量用于临界资源的保护,通过互斥量,多个任务对相同资源进行的访问操作是互斥的;互斥量的核心在于谁上锁,就由谁解锁,这只是约定,FreeRTOS并没有在代码上实现这一点;互斥量是一种特殊的信号量,也是一种特殊的队列;使用互斥量,需要开启宏con......
  • 嵌入式操作系统的抉择:FreeRTOS、Linux、LiteOS的异同比较
    引言:在嵌入式系统开发中,选择合适的操作系统是至关重要的决策。FreeRTOS、Linux和LiteOS都是嵌入式领域常见的操作系统,各自具有特定的优势和应用场景。本篇博客将深入比较FreeRTOS、Linux和LiteOS之间的异同点,为嵌入式开发者提供更清晰的选择指南。1.FreeRTOS:轻量级实时操作系统Fr......
  • CSS 优先级算法
    CSS的优先级是根据样式声明的特殊性值来判断的。选择器的特殊性值分为四个等级,如下:(1)标签内选择符x,0,0,0(2)ID选择符0,x,0,0(3)class选择符/属性选择符/伪类选择符0,0,x,0(4)元素和伪元素选择符0,0,0,x计算方法:(1)每个等级的初始值为0(2)每个等级的叠加为选择器出现的次数相......
  • FreeRTOS中的任务优先级与单片机中断优先级的异同深析
    引言:在实时嵌入式系统开发中,任务的优先级和中断的优先级是关键的调度和响应机制。FreeRTOS提供了丰富的任务调度功能,而单片机的中断系统也具有类似的机制。本篇博客将深入探讨FreeRTOS中的任务优先级与单片机中断优先级的异同,通过代码演示展示它们的工作原理和使用方式。任务优先......
  • 241. 为运算表达式设计优先级(分治 +记忆化)
    Problem:241.为运算表达式设计优先级给你一个由数字和运算符组成的字符串expression,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以按任意顺序返回答案。生成的测试用例满足其对应输出值符合32位整数范围,不同结果的数量不超过示例1:输入:expression=......
  • 三维模型的顶层合并构建的模型层级和块大小划分规则浅析
    三维模型的顶层合并构建的模型层级和块大小划分规则浅析   倾斜摄影超大场景的三维模型的顶层合并是一个复杂而庞大的任务,通常需要对模型进行层级和块大小的划分,以便更好地管理和处理数据。本文将对模型层级和块大小的划分规则进行浅谈。一、模型层级划分规则均匀划分:......
  • 倾斜摄影三维模型根节点合并的模型层级和块大小划分规则探讨
    倾斜摄影三维模型根节点合并的模型层级和块大小划分规则探讨  在倾斜摄影三维模型的根节点合并过程中,模型层级和块大小的划分规则是非常重要的,它们直接影响着数据处理和渲染的效率。在本文中,我们将探讨倾斜摄影三维模型的根节点合并的模型层级和块大小划分规则。1、模型层......