创建
xTaskCreate()` → 加入就绪链表 → `Ready
就绪与运行
Ready→Running:调度器选中最高优先级就绪任务。Running→Ready:被更高优先级任务抢占,或同优先级时间片用完。 注意:运行态任务仍在就绪链表中。
进入阻塞
运行中的任务调用阻塞 API:
vTaskDelay()/vTaskDelayUntil()→ 从就绪链表移除 → 加入延时链表 →Blocked- 等待队列/信号量/事件组,且条件不满足:
- 无限等待:从就绪链表移除 → 加入对应事件等待链表 →
Blocked - 带超时等待:从就绪链表移除 → 加入事件等待链表,同时加入延时链表 →
Blocked
- 无限等待:从就绪链表移除 → 加入对应事件等待链表 →
阻塞唤醒
- 超时:tick 中断从延时链表移除;如果还在事件等待链表,也移除 → 加入就绪链表 →
Ready - 事件发生:从事件等待链表移除;如果还在延时链表,也移除 → 加入就绪链表或 PendingReady →
Ready
挂起
vTaskSuspend()从就绪/延时/事件等待/PendingReady 中移除 → 加入挂起链表 →SuspendedvTaskResume()/xTaskResumeFromISR()从挂起链表移除 → 加入就绪链表或 PendingReady →Ready
注意:挂起恢复后通常直接变就绪,不会自动恢复到挂起前的阻塞等待。
删除
vTaskDelete(NULL)删除自身 → 从各链表移除 → 加入xTasksWaitingTermination→ 空闲任务回收vTaskDelete(其他任务句柄)→ 从各链表移除 → 直接释放 TCB/栈
创建
|
v
Ready <---------------- 事件发生 / 超时 / 恢复 / PendingReady合并
| ^
| | 抢占 / 时间片到
v |
Running
|
| vTaskDelay / 等事件失败
v
Blocked
|-- 纯延时:挂延时链表
|-- 等事件:挂事件等待链表
|-- 等事件+超时:事件等待链表 + 延时链表
|
| 超时或事件发生
v
Ready
Ready/Running/Blocked --vTaskSuspend--> Suspended --vTaskResume--> Ready/PendingReady
Running --vTaskDelete(NULL)--> xTasksWaitingTermination --空闲任务--> 释放