创建

xTaskCreate()` → 加入就绪链表 → `Ready

就绪与运行

  • Ready → Running:调度器选中最高优先级就绪任务。
  • Running → Ready:被更高优先级任务抢占,或同优先级时间片用完。 注意:运行态任务仍在就绪链表中。

进入阻塞

运行中的任务调用阻塞 API:

  • vTaskDelay() / vTaskDelayUntil() → 从就绪链表移除 → 加入延时链表 → Blocked
  • 等待队列/信号量/事件组,且条件不满足:
    • 无限等待:从就绪链表移除 → 加入对应事件等待链表 → Blocked
    • 带超时等待:从就绪链表移除 → 加入事件等待链表,同时加入延时链表 → Blocked

阻塞唤醒

  • 超时:tick 中断从延时链表移除;如果还在事件等待链表,也移除 → 加入就绪链表 → Ready
  • 事件发生:从事件等待链表移除;如果还在延时链表,也移除 → 加入就绪链表或 PendingReady → Ready

挂起

  • vTaskSuspend() 从就绪/延时/事件等待/PendingReady 中移除 → 加入挂起链表 → Suspended
  • vTaskResume() / 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 --空闲任务--> 释放