内容主要来源于正点原子的FreeRTOS开发手册
本文主要是做笔记,以及日后复习
文章目录
1 什么是列表和列表项
1.1 列表
列表是FreeRTOS中的一种数据类型,和数据结构中的链表有一些相似。列表用来跟踪FreeRTOS的任务。(在list.h中定义了)
列表的数据类型结构:
/*
* Definition of the type of queue used by the scheduler.
*/
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
configLIST_VOLATILE UBaseType_t uxNumberOfItems;
ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */
MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */
listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
} List_t;
变量 | 描述 |
---|---|
uxNumberOfItems | 用来记录列表项的数量 |
pxIndex | 用来记录当前的列表项索引号 |
xListEnd | 列表的最后一个列表项,用来表示列表的结束。 |
其他的两个结构体成员不用管,用来检查列表完整性。所以一个列表如下图所示。
1.2 列表项
列表项就是存放在列表中。FreeRTOS提供了两种列表项:列表项以及迷你列表项(在list.h中定义了)
1.2.1 列表项
/*
* Definition of the only type of object that a list can contain.
*/
struct xLIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */
struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */
void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */
void * configLIST_VOLATILE pvContainer; /*< Pointer to the list in which this list item is placed (if any). */
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
};
typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */
变量 | 描述 |
---|---|
xItemValue | 列表项值 |
pxNext | 指向下一个列表项 |
pxPrevious | 指向那个上一个列表项(和pxNext配合,可以构成双向链表) |
pvOwner | 记录此列表项归谁所有(一般是任务控制块) |
pvContainer | 记录此列表项归哪个列表所有 ( pvcontainer用来记录此列表项归哪个列表。注意和 pvowner 的区别,在前面讲解任务控制块TCBt的时候说了在TCBt中有两个变量 x Statelistitem和 Xeventlistitem,这两个变量的类型就是 Listitem_t,也就是说这两个成员变量都是列表项。以 xstate Listitem为例,当创建个任务以后 xstate Listitem的 pvowner变量就指向这个任务的任务控制块,表示 x Satelistltem属于此任务。当任务就绪态以后 Xstate Listitem的变量 container就指向就绪列表,表明此列表项在就绪列表中。 |
所以一个列表项如下图所示。
1.2.2 迷你列表项
列表项有些功能在实际开发中可能不需要,所以为了避免内存浪费,有了迷你列表项
struct xMINI_LIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
configLIST_VOLATILE TickType_t xItemValue;