义的链表和链表节点数据结构如下所示:
typedef struct xLIST{ //定义链表结构
unsigned portSHORPT usNumberOfItems;
//usNumberOfItems为链表的长度,为0表示链表为空
volatile xListItem * pxHead;//pxHead为链表的头指针
volatile xListItem * pxIndex; //pxIndex指向链表当前结点的指针
volatile xListItem xListEnd; //xListEnd为链表尾结点
}xList;
struct xLIST_ITEM { //定义链表结点的结构
port Tick type xItem Value;
//xItem Value的值用于实现时间管理
//port Tick Type为时针节拍数据类型,
//可根据需要选择为16位或32位
volatile struct xLIST_ITEM * pxNext;
//指向链表的前一个结点
void * pvOwner;//指向此链表结点所在的任务控制块
void * pvContainer;//指向此链表结点所在的链表};
FreeRTOS中每个任务对应于一个任务控制块(TCB),其定义如下所示:
typedef struct tskTaskControlBlock {
portSTACK_TYPE * pxTopOfStack;
//指向任务堆栈结束处
portSTACK_TYPE * pxStack;
//指向任务堆栈起始处
unsigned portSHORT usStackDepth; //定义堆栈深度
signed portCHAR pcTaskName[tskMAX_TASK_NAME_LEN];//任务名称
unsigned portCHAR ucPriority; //任务优先级
xListItem xGenericListItem;
//用于把TCB插入就绪链表或等待链表
xListItem xEventListItem;
//用于把TCB插入事件链表(如消息队列)
unsigned portCHAR ucTCBNumber; //用于记录功能
}tskTCB;
FreeRTOS定义就绪任务链表数组为xList pxReady—TasksLists[portMAX_PRIORITIES]。其中portMAX_PRIORITIES为系统定义的最大优先级。若想使优先级为n的任务进入就绪态,需要把此任务对应的TCB中的结点xGenericListltem插入到链表pxReadyTasksLiStS[n]中,还要把xGenericListItem中的pvContainer指向pxReadyTasksLists[n]方可实现。