前言
整理一下学习FreeRTOS的学习笔记,之后有遗忘也不用找,学习参考《野火FreeRTOS 教程》,教程无好坏,个人喜好选择!
如有错误或建议,望指正!!!
列表和列表项是直接从FreeRTOS源码的注释中的 list 和 list item 翻译过来的,其实就是对应我们C语言当中的链表和节点,在后续的函数和结构体中也会出 list 和 list 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; /* 精简节点数据类型重定义 */
总结
节点是一个结构体,链表也是一个结构体。以上都是对一些结构体的定义,后续初始化才会对这些结构体进行操作,所以这里的东西不要想那么复杂,就是正常的结构体数据,看不懂的时候去复习复习结构体和结构体指针。