全局状态链表
- 就绪链表
pxReadyTasksLists[ configMAX_PRIORITIES ]每个优先级一个链表,所以是configMAX_PRIORITIES个。 当前正在运行的Running任务也挂在自己的优先级就绪链表里,只是pxCurrentTCB指向它。 - 延时链表
xDelayedTaskList1、xDelayedTaskList2共 2 个,通过pxDelayedTaskList和pxOverflowDelayedTaskList使用。 两个是为了处理 tick 计数器溢出。 - 挂起链表
xSuspendedTaskList一般 1 个,受INCLUDE_vTaskSuspend影响。 - 等待终止链表
xTasksWaitingTermination一般 1 个,受INCLUDE_vTaskDelete影响。 任务删除自身后先挂这里,由空闲任务回收 TCB/栈。 - Pending Ready 链表
xPendingReadyList调度器被挂起时,中断中唤醒/恢复的任务先暂存在这里,等xTaskResumeAll()后再移入就绪链表。
事件等待链表
-
事件等待链表不是全局固定链表 每个队列、信号量、互斥量、事件组、流缓冲区等对象内部都有自己的等待链表,例如:
- 队列:
xTasksWaitingToSend、xTasksWaitingToReceive - 信号量/互斥量复用队列结构
- 事件组:
xTasksWaitingForBits
任务通过 TCB 里的
xEventListItem挂入这些事件等待链表。 所以“阻塞链表”通常指这些对象私有的等待链表,数量不固定。 - 队列:
因此,如果只算全局状态链表,常见是:
configMAX_PRIORITIES个就绪链表 + 2 个延时链表 + 1 个挂起链表 + 1 个等待终止链表 + 1 个 PendingReady 链表。 事件等待链表另算。