义的链表和链表节点数据结构如下所示:

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]方可实现。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查