【个人笔记01】FreeRTOS——列表和列表项(即链表和节点)的结构体定义

文章目录

  • 前言
  • 一、指向下一个节点的指针
  • 二、节点结构体定义
  • 三、 节点结构体初始化
  • 四、定义链表根节点数据结构
  • 总结


前言

  整理一下学习FreeRTOS的学习笔记,之后有遗忘也不用找,学习参考《野火FreeRTOS 教程》,教程无好坏,个人喜好选择!
如有错误或建议,望指正!!!


  列表和列表项是直接从FreeRTOS源码的注释中的 listlist item 翻译过来的,其实就是对应我们C语言当中的链表和节点,在后续的函数和结构体中也会出 listlist item,不带 item 就是链表(列表),带 item 就是节点(列表项),这样看那些函数和宏定义等等就不会乱糟糟的了。

一、指向下一个节点的指针

struct node	//就是普通的结构体定义
{
	struct node *next; /* 指向链表的下一个节点 */
};

  struct node *next; 是定义一个 struct node 类型的结构体指针变量,next赋值时,应该是另外一个struct node类型的结构体地址。
  next只是一个结构体指针变量,存的是结构体地址(用来指向下一个节点,需要赋值),不是结构体,也不会套娃(我曾经的疑惑,复习一下结构体指针就明白了)。

二、节点结构体定义

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

  (1) TickType_t 是被重定义的关键字,由configUSE_16_BIT_TICKS 这个宏决定,
     当该宏定义为 1 时,TickType_t 为 16 位,否则为32 位。
     该宏在 FreeRTOSConfig.h中默认定义为 0,即默认32位整型;
  (2)(3) 定义 xLIST_ITEM 类型 的结构体指针,用于存放上一个节点与下一个节点的地址;
  (4) 用于指向该节点的拥有者,即该节点内嵌在哪个数据结构中,属于哪个数据结构的一个成员;
  (5) 用于指向该节点所在的链表,通常指向链表的根节点。
  (6) 节点数据类型重定义,xLIST_ITEM 和 ListItem_t 一个前面加x,一个后面加t,中间字母大小写不同,
     但他们都是 list item,即节点,链表是list,之前看的时候太乱了,多看几眼,理一理就好多了。

三、 节点结构体初始化

void vListInitialiseItem( ListItem_t * const pxItem )
{
	/* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */
	pxItem->pvContainer = NULL; (1)
}

  初始化的时候只需将pvContainer 初始化为空即可,表示该节点还没有插入到任何链表。

四、定义链表根节点数据结构

typedef struct xLIST
{
	UBaseType_t uxNumberOfItems;	 /* 链表节点计数器 */ 	(1)
	ListItem_t * pxIndex; 			/* 链表节点索引指针 */ 		(2)
	MiniListItem_t xListEnd; 		/* 链表最后一个节点 */ 		(3)
}List_t;	//这里没有像定义节点时那样定义后再重定义,而是直接重定义,作用是相同的

  (1)链表节点计数器,用于表示该链表下有多少个节点,根节点除外。UBaseType_t 是关键字 unsigned long;
  (2)节点类型的结构体指针变量,用于遍历链表内的各个节点;
  (3)看结构体名字就知道是mini版的List Item,即迷你版节点,相比 ListItem_t 只剩计数器,和前后节点的指针;
  他是链表的最后(也可以是第一个)节点。

struct xMINI_LIST_ITEM
{
	TickType_t xItemValue; 			/* 辅助值,用于帮助节点做升序排列 */
	struct xLIST_ITEM * pxNext; 	/* 指向链表下一个节点 */
	struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */
};
typedef struct xMINI_LIST_ITEM MiniListItem_t; /* 精简节点数据类型重定义 */

总结

节点是一个结构体,链表也是一个结构体。以上都是对一些结构体的定义,后续初始化才会对这些结构体进行操作,所以这里的东西不要想那么复杂,就是正常的结构体数据,看不懂的时候去复习复习结构体和结构体指针。

你可能感兴趣的:(RTOS,链表,数据结构,c语言)