列表和列表项的结构
FreeRTOS中用大量的列表和列表项实现各种资源管理,任务切换,队列以及任务通知。实际上列表和列表项属于C语言中的双向链表结构,“列表”可理解为这个双向链表的 “根节点”(root节点),在FreeRTOS代码中是被称为是“End”,个人认为 “Root” 更形象。“ 列表项”则是这个双向链表中的节点,“列表(Root)”中的xListEnd.pxNext指向的是节点的“Head”,xListEnd.pxPrevious指向的节点是 “Tail”(或“Last”)。下面是一个已初始化好的双向链表:
list.c中对链表的操作
任务控制块的成员包括两个列表项(起初以为是两个列表),状态列表项和事件列表项。如果一个任务由于调用了延时API函数 vTaskDelay(),则这个任务控制块中的 xStateListItem.pxContainer 就指 xDelayedTaskList1或xDelayedTaskList2(在task.c中定义的全局变量);如果一个任务由于等待信号量则其控制块中的xStateListItem.pxContainer就指向 xSuspendedTaskList (在task.c中定义的全局变量)。
整理不易,转发请注明出处。后续还有任务管理,列队操作的框图。