FreeRTOS(二)列表与列表项

要想看懂FreeRTOS的源码,理解任务运行原理,就必须弄懂列表和列表项。
列表和列表项是FreeRTOS大量使用的一种数据结构,这里的列表和列表项其实和我们学过数据结构中的链表和节点(而且是双向链表)很像。

  1. 列表
typedef struct xLIST
{
    listFIRST_LIST_INTEGRITY_CHECK_VALUE                //检查完整性
    configLIST_VOLATILE UBaseType_t uxNumberOfItems;    //列表项计数
    ListItem_t * configLIST_VOLATILE pxIndex;           //指向当前列表项索引号(第一个列表项)
    MiniListItem_t xListEnd;                            //指向最好一个列表项(迷你列表项)
    listSECOND_LIST_INTEGRITY_CHECK_VALUE               //检查完整性
} List_t;

列表相当于数据结构中链表头结点,那么列表再FreeRTOS中的作用是什么呢?
我们知道,FreeRTOS程序有五种状态,每一种状态都对应一个列表,列表被用来跟踪 FreeRTOS
中的任务。

  1. 列表项
 struct xLIST_ITEM 
  { 
      TickType_t xItemValue;           /* 辅助值,用于帮助节点做顺序排列 */ 
      struct xLIST_ITEM *  pxNext;     /* 指向链表下一个列表项 */            
      struct xLIST_ITEM *  pxPrevious; /* 指向链表前一个列表项 */            
      void * pvOwner;      			   /* 指向拥有该节点的内核对象,通常是 TCB(任务控制块) */
      void *  pvContainer;    		   /* 指向该节点所在的链表 */            
  }; 
typedef struct xLIST_ITEM ListItem_t;  /* 节点数据类型重定义 */ 

还有一个迷你列表项,就是最后一个列表项。
在这里插入图片描述

3.列表项与任务控制块(TCB)

typedef struct tskTaskControlBlock
{
    volatile StackType_t *pxTopOfStack;   /* 栈顶 */
    ListItem_t	    xStateListItem;       /* 任务节点 */
    StackType_t     *pxStack;             /* 任务栈起始地址 */
    char            pcTaskName[ configMAX_TASK_NAME_LEN ];    /* 任务名称,长度默认16 */  
} tskTCB;

列表项中有一个成员变量pvOwner,记录此链表项归谁拥有,通常是任务控制块。FreeRTOS 的每个任务都有一些属性需要存储,FreeRTOS 把这些属性集合到一起用一个结构体来表示,这个结构体叫做任务控制块:TCB_t,在使用函数 xTaskCreate()创建任务的时候就会自动的给每个任务分配一个任务控制块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值