FreeRTOS中优先级反转

文摘   2024-11-16 07:30   内蒙古  

优先级反转的定义

优先级反转是指在多任务操作系统中,一个低优先级任务持有一个高优先级任务需要的资源,导致高优先级任务无法执行,而一些中等优先级的任务却能执行的现象。这种现象违背了任务的优先级调度原则。

优先级反转的例子

假设有三个任务A、B、C,优先级分别为高、中、低。任务A需要任务C持有的资源,但由于任务C正在执行,任务A被迫等待。此时,任务B(中等优先级)却可以执行,这就是优先级反转。

FreeRTOS中的优先级反转处理

1. 优先级继承

FreeRTOS通过优先级继承机制来解决优先级反转问题。当高优先级任务因为等待低优先级任务占用的资源而阻塞时,低优先级任务会临时继承高优先级任务的优先级,直到资源被释放。

2. 代码示例

以下是一个简单的例子,演示了在FreeRTOS中如何使用互斥量,可能会引起优先级反转:

#include "FreeRTOS.h"
#include "semphr.h"
#include "task.h"
SemaphoreHandle_t xMutex;
void vTaskHighPriority(void *pvParameters) {
    while (1) {
        if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {
            // 使用资源
            xSemaphoreGive(xMutex);
        }
    }
}
void vTaskLowPriority(void *pvParameters) {
    while (1) {
        if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {
            // 模拟长时间占用资源
            vTaskDelay(pdMS_TO_TICKS(100));
            xSemaphoreGive(xMutex);
        }
    }
}
int main(void) {
    xMutex = xSemaphoreCreateMutex();
    xTaskCreate(vTaskHighPriority, "HighPriority"1000NULL3NULL);
    xTaskCreate(vTaskLowPriority, "LowPriority"1000NULL1NULL);
    vTaskStartScheduler();
    while (1);
}

在这个例子中,如果低优先级任务持有了互斥量,并且在高优先级任务尝试获取互斥量时没有立即释放,那么高优先级任务将阻塞。

3. 启用优先级继承

在FreeRTOS中,可以通过以下宏定义启用优先级继承:

#define configUSE_MUTEXES 1
#define configUSE_RECURSIVE_MUTEXES 0
#define configUSE_MUTEXES 1

预防优先级反转的策略

  • 最小化锁的使用:尽量减少对共享资源的锁定时间。
  • 使用优先级继承:在FreeRTOS中启用优先级继承机制。
  • 避免不必要的任务阻塞:设计任务时,尽量减少对共享资源的依赖。


兄弟嵌入式
从入门到精通,学习并分享嵌入式软、硬件的知识。
 最新文章