FreeRTOS任务状态

序号内容链接
1任务状态类型点我访问
2任务间通信方式点我访问
3任务通信机制的配合使用点我访问

在FreeRTOS中,任务状态是一个重要的概念,它决定了每个任务当前所处的状态以及调度器如何管理任务的执行。

1. 任务状态

FreeRTOS定义了多种任务状态,每个任务在任何时间点都处于以下状态之一:

1.1 运行中 (Running):

任务正在CPU上执行。系统中同一时刻只有一个任务可以处于运行状态(在单核系统中)。

1.2. 就绪 (Ready):

任务已经准备好运行,等待调度器分配CPU时间。就绪状态的任务不处于任何阻塞状态并且满足优先级条件。

1.3. 阻塞 (Blocked):

任务因为等待某个事件而无法继续执行。常见的阻塞原因包括等待信号量、队列消息、事件组或超时事件。
阻塞任务在事件发生或超时到达时会被转移到就绪状态。

1.4. 挂起 (Suspended):

任务被挂起,除非被显式唤醒(通过调用 vTaskResume() 或 vTaskResumeFromISR()),否则不会被调度执行。
挂起状态与阻塞状态的区别在于挂起状态任务不会自动因为事件发生而恢复。

1.5. 删除 (Deleted):

任务已被删除,资源等待被系统回收。被删除的任务不再被调度执行。
调用 vTaskDelete() 会将任务置于删除状态。

2. 各种状态之间的转换

在这里插入图片描述

3. 如何获取任务状态

FreeRTOS提供了一个函数 eTaskGetState() 用于获取任务的当前状态:

TaskState eTaskGetState(TaskHandle_t xTask);
参数:
xTask:任务的句柄。
返回值:返回值为任务的当前状态,可能是以下值之一:
	eRunning
	eReady
	eBlocked
	eSuspended
	eDeleted

以下示例展示了如何创建几个任务,并使用 eTaskGetState() 获取任务的状态:

#include "FreeRTOS.h"
#include "task.h"
#include <stdio.h>

// 任务句柄
TaskHandle_t xTask1Handle;
TaskHandle_t xTask2Handle;

// 任务1
void vTask1(void *pvParameters) {
    for (;;) {
        printf("Task 1 is running\n");

        // 模拟任务工作
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

// 任务2
void vTask2(void *pvParameters) {
    eTaskState xTaskState;

    for (;;) {
        // 获取任务1的状态
        xTaskState = eTaskGetState(xTask1Handle);

        switch (xTaskState) {
            case eRunning:
                printf("Task 1 is running\n");
                break;
            case eReady:
                printf("Task 1 is ready\n");
                break;
            case eBlocked:
                printf("Task 1 is blocked\n");
                break;
            case eSuspended:
                printf("Task 1 is suspended\n");
                break;
            case eDeleted:
                printf("Task 1 is deleted\n");
                break;
            default:
                printf("Unknown state\n");
                break;
        }

        // 模拟任务工作
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void app_main(void) {
    // 创建任务1
    xTaskCreate(vTask1, "Task 1", 2048, NULL, 1, &xTask1Handle);

    // 创建任务2
    xTaskCreate(vTask2, "Task 2", 2048, NULL, 2, &xTask2Handle);

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

代码解释

  1. 任务创建:创建了两个任务 vTask1 和 vTask2,分别打印任务1的状态。
  2. 状态获取:任务2使用 eTaskGetState() 获取任务1的状态,并根据状态打印相应的信息。
  3. 状态输出:任务状态会定期输出,帮助开发者了解任务在调度器中的状态。

注意事项

  1. 任务状态转换:任务可以通过任务通知、队列、信号量等机制进行状态转换。比如,通过xQueueReceive() 接收消息时阻塞任务。
  2. 资源管理:当任务被删除时,使用vTaskDelete(),需要确保释放任务堆栈和其他资源以防止内存泄漏。
  3. 多核系统:在多核系统中,每个CPU核心可以同时运行一个任务,这影响任务的调度和状态转换。
    这种状态管理机制是FreeRTOS调度器的核心部分,确保系统在实时环境中能够有效地管理和调度任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值