任务状态是操作系统中重要的概念任务在创建后在每个时刻都会有对应的状态
运行状态(Running)
-
定义:任务正在CPU上执行,占用处理器资源。
-
触发条件:
-
任务被调度器选中,从就绪态切换为运行态。
-
-
退出条件:
-
时间片用完(分时调度)。
-
主动让出CPU(如调用阻塞函数
vTaskDelay()
)。 -
被更高优先级任务抢占(抢占调度)
-
就绪状态(Ready)
-
定义:任务已具备运行条件,但尚未被调度器分配CPU时间。
-
特点:
-
任务在就绪队列中等待调度。
-
优先级高的就绪任务会优先被调度。
-
-
触发条件:
-
任务初始化完成,未阻塞或挂起。
-
阻塞条件解除(如信号量释放、延时结束)。
-
-
状态转换:
-
调度器选择该任务时,进入运行态。
-
阻塞状态(Blocked)
-
定义:任务因等待某个事件或资源而暂停执行,不参与调度。
-
常见阻塞原因:
-
时间阻塞:调用
vTaskDelay()
等待特定时间。 -
资源阻塞:等待信号量(
xSemaphoreTake()
)、队列(xQueueReceive()
)或事件组(xEventGroupWaitBits()
)。 -
同步阻塞:等待其他任务或中断的通知。
-
-
特点:
-
任务移出就绪队列,直到事件触发。
-
不消耗CPU资源,适合节能场景。
-
-
退出条件:
-
等待的事件发生(如时间到达、信号量释放)。
-
挂起状态(Suspended)
-
定义:任务被显式暂停,无法被调度器选中,需手动恢复。
-
触发方式:
-
调用
vTaskSuspend()
挂起任务。 -
任务自挂起:
vTaskSuspend(NULL)
。
-
-
退出条件:
-
调用
vTaskResume()
或xTaskResumeFromISR()
恢复任务。
-
-
应用场景:
-
调试时临时冻结任务。
-
动态管理任务执行流程。
-
状态转换图
关键API函数与状态管理
状态操作 | API函数 | 说明 |
---|---|---|
任务挂起 | vTaskSuspend(TaskHandle_t) | 强制任务进入挂起状态。 |
任务恢复 | vTaskResume(TaskHandle_t) | 将任务从挂起状态恢复到就绪状态。 |
任务延时(阻塞) | vTaskDelay(TickType_t) | 阻塞任务指定时间(以系统节拍为单位)。 |
删除任务 | vTaskDelete(TaskHandle_t) | 终止任务并释放资源。 |
查询任务状态 | eTaskGetState(TaskHandle_t) | 返回任务当前状态(枚举值)。 |
总结
-
运行态:任务正在执行,占用CPU。
-
就绪态:等待调度,随时可运行。
-
阻塞态:等待事件,节能高效。
-
挂起态:手动暂停,灵活控制。