FreeRTOS链表代码分析
1、链表节点的分析
创建任务xTaskCreate的源代码如下:
可见,上面的代码开辟了任务栈可见,和任务控制块TCB可见。
链表中的数据节点的源代码如下:(任务控制块TCB_t的源代码)
综上:由TCB_t的源代码所得:TCB_t的结构体是数据节点,数据节点中存在2个通用节点,在链表的连接中通用节点连接在一起。
链表中数据节点的通用节点的源代码如下:
链表中管理节点的通用节点的源代码如下:
#if ( configUSE_MINI_LIST_ITEM == 1 )
struct xMINI_LIST_ITEM
{
configLIST_VOLATILE TickType_t xItemValue;
struct xLIST_ITEM * configLIST_VOLATILE pxNext;
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;
typedef struct xLIST_ITEM MiniListItem_t;
综上:可见管理节点中的通用节点有2中类型,一种是xLIST_ITEM 结构体
,另外一种是xMINI_LIST_ITEM 结构体
。当然,一般情况下使用的是xLIST_ITEM 结构体
和数据节点中的通用节点类型相同。
链表中的管理节点的源代码如下:
综上:状态链表如下图所示:任务控制块为链表中的数据节点,通过通用节点前后连接在一起。,通用节点中的pvOwner保存的数据节点的地址,pxContainer保存的管理节点的地址。
2、源码分析
2.1、链表节点的初始化
一:管理节点的初始化
二:通用节点的初始化
2.2、链表节点的插入
【注意】,若状态链表中存在了3个TCB_t的数据节点,而此时正在管理节点的pxIndex正指向第2个数据节点中的通用节点(即正在执行第2个TASK),则想要插入一个新的数据节点,那在哪里插入喃?
答案是在pxIndex
指向的节点前面插入新节点。因为为了绝对的“公平”,新插入的节点想要最后一个执行。