序号 | 内容 | 链接 |
---|---|---|
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();
}
代码解释:
- 任务创建:创建了两个任务 vTask1 和 vTask2,分别打印任务1的状态。
- 状态获取:任务2使用 eTaskGetState() 获取任务1的状态,并根据状态打印相应的信息。
- 状态输出:任务状态会定期输出,帮助开发者了解任务在调度器中的状态。
注意事项
- 任务状态转换:任务可以通过任务通知、队列、信号量等机制进行状态转换。比如,通过xQueueReceive() 接收消息时阻塞任务。
- 资源管理:当任务被删除时,使用vTaskDelete(),需要确保释放任务堆栈和其他资源以防止内存泄漏。
- 多核系统:在多核系统中,每个CPU核心可以同时运行一个任务,这影响任务的调度和状态转换。
这种状态管理机制是FreeRTOS调度器的核心部分,确保系统在实时环境中能够有效地管理和调度任务。