FreeRTOS 任务优先级

FreeRTOS 任务优先级

介绍

在 FreeRTOS 中,任务优先级是一种重要的调度机制,它决定了任务在系统中的执行顺序和调度方式。本文将深入探讨 FreeRTOS 任务优先级的概念、作用以及如何合理地设置任务优先级。

什么是任务优先级?

任务优先级是 FreeRTOS 中用于调度任务的一个重要属性。在 FreeRTOS 中,系统中的每个任务都有一个优先级,优先级越高的任务将优先被调度执行。任务优先级是一个非负整数,取值范围通常是 0 到 (configMAX_PRIORITIES - 1),其中 configMAX_PRIORITIES 是 FreeRTOS 配置文件中定义的最大优先级数量。

任务优先级的作用

任务优先级的设置直接影响了任务的调度顺序和执行顺序。具有较高优先级的任务将在具有较低优先级的任务之前被调度执行,这保证了系统中重要任务的及时响应和执行。

如何设置任务优先级?

设置任务优先级可以通过 xTaskCreate() 函数的参数来指定任务的优先级。通常情况下,优先级为数值 0 到 (configMAX_PRIORITIES - 1)。

xTaskCreate(taskFunction, "TaskName", stackSize, parameters, priority, &taskHandle);

其中,priority 参数用于设置任务的优先级。较高的数值表示较高的优先级。

《吃撑和饿死》 的问题

“饥饿” 或 “吃撑” 问题,是多任务系统中常见的一种情况。这种情况发生时,高优先级任务持续占用 CPU 资源,导致低优先级任务无法得到执行,甚至可能永远被阻塞或挂起。

饥饿问题通常由以下几个原因导致:

  1. 优先级反转:当一个低优先级任务持有一个高优先级任务所需的资源时,高优先级任务被阻塞,低优先级任务占用资源。这种情况下,即使高优先级任务可运行,它也无法执行。

  2. 忙等待:高优先级任务在循环中持续运行,而不释放 CPU 或让出时间片给其他任务。这会导致低优先级任务无法得到执行。

FreeRTOS 中用于任务调度的一些关键API

  1. 设置任务优先级:

    • 函数原型:void vTaskPrioritySet(TaskHandle_t xTask, UBaseType_t uxNewPriority);
    • 作用:用于设置指定任务的优先级。
    • 参数:
      • xTask:要设置优先级的任务句柄。
      • uxNewPriority:新的任务优先级。
    • 示例:
      vTaskPrioritySet(taskHandle, 3);
      

    这将任务 taskHandle 的优先级设置为 3。

  2. 获取任务优先级:

    • 函数原型:UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask);
    • 作用:用于获取指定任务的优先级。
    • 参数:xTask:要获取优先级的任务句柄。
    • 示例:
      UBaseType_t priority = uxTaskPriorityGet(taskHandle);
      

    这将获取任务 taskHandle 的优先级,并存储在 priority 变量中。

  3. 获取当前任务优先级:

    • 函数原型:UBaseType_t uxTaskPriorityGet(NULL);
    • 作用:用于获取当前任务的优先级。
    • 示例:
      UBaseType_t priority = uxTaskPriorityGet(NULL);
      

    这将获取当前任务的优先级,并存储在 priority 变量中。

  4. 任务让步:

    • 函数原型:void taskYIELD();void yield();
    • 作用:让出 CPU 时间片,使得调度器重新评估任务的优先级,并决定下一个要执行的任务。
    • 示例:
      taskYIELD();
      

    这将让出当前任务的执行,使得调度器有机会重新评估任务的优先级,然后选择下一个要执行的任务。

总结

任务优先级是 FreeRTOS 中任务调度的重要机制之一,它决定了任务的执行顺序和调度方式。合理设置任务的优先级可以有效地管理系统资源,确保系统的稳定性和实时性。程序需要根据应用的实际需求和系统特点,灵活设置任务的优先级,以提高系统的性能和可靠性。

你可能感兴趣的:(freeRTOS-ESP32,开发语言,c++,单片机,嵌入式硬件,freeRTOS,STM32)