全局状态链表

  1. 就绪链表 pxReadyTasksLists[ configMAX_PRIORITIES ] 每个优先级一个链表,所以是 configMAX_PRIORITIES 个。 当前正在运行的 Running 任务也挂在自己的优先级就绪链表里,只是 pxCurrentTCB 指向它。
  2. 延时链表 xDelayedTaskList1、xDelayedTaskList2 共 2 个,通过 pxDelayedTaskList 和 pxOverflowDelayedTaskList 使用。 两个是为了处理 tick 计数器溢出。
  3. 挂起链表 xSuspendedTaskList 一般 1 个,受 INCLUDE_vTaskSuspend 影响。
  4. 等待终止链表 xTasksWaitingTermination 一般 1 个,受 INCLUDE_vTaskDelete 影响。 任务删除自身后先挂这里,由空闲任务回收 TCB/栈。
  5. Pending Ready 链表 xPendingReadyList 调度器被挂起时,中断中唤醒/恢复的任务先暂存在这里,等 xTaskResumeAll() 后再移入就绪链表。

事件等待链表

  1. 事件等待链表不是全局固定链表 每个队列、信号量、互斥量、事件组、流缓冲区等对象内部都有自己的等待链表,例如:

    • 队列:xTasksWaitingToSend、xTasksWaitingToReceive
    • 信号量/互斥量复用队列结构
    • 事件组:xTasksWaitingForBits

    任务通过 TCB 里的 xEventListItem 挂入这些事件等待链表。 所以“阻塞链表”通常指这些对象私有的等待链表,数量不固定。

因此,如果只算全局状态链表,常见是:

configMAX_PRIORITIES 个就绪链表 + 2 个延时链表 + 1 个挂起链表 + 1 个等待终止链表 + 1 个 PendingReady 链表。 事件等待链表另算。