FreeRTOS笔记(六)列表与任务控制块


上一文链接:FreeRTOS笔记(五)任务状态

01 - 列表

  上一文提及到,任务具有多种状态,例如就绪、运行、阻塞等等,如果有多个任务都处于某一状态,例如就绪态,那么这些任务就需要排队等待处理,于是这些任务就组成了一个列表,一个简单的列表看起来应该是这样的。

  这个列表谁来创建、谁来使用?就是FreeRTOS系统,它负责创建、使用和维护列表,这个过程对开发人员是透明的,目的是实现多任务并发进行。
  列表是被设计用来跟踪任务,底层是一个数据结构,实际上是一个列表头,它的定义如下:

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;

  其中指针ListItem_t*指向当前的列表项,迷你列表项MiniListItem_t用于表示列表的结束,概念上和链表头类似,不过列表头存放着更多的信息。

列表
链表

  任务的每一个状态都会有一个列表(运行态除外,因为每次只有一个运行态,不存在排队),比如就绪态列表、阻塞态列表等等,FreeRTOS就是去管理这些列表,以达到多任务的并发执行,可以在stasks.c中看到这些列表的创建:

//就绪列表和阻塞列表
PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];//就绪列表
PRIVILEGED_DATA static List_t xDelayedTaskList1;                        //延迟列表1
PRIVILEGED_DATA static List_t xDelayedTaskList2;                        //延迟列表2
PRIVILEGED_DATA static List_t xPendingReadyList;                        //暂存列表

#if( INCLUDE_vTaskDelete == 1 )
    PRIVILEGED_DATA static List_t xTasksWaitingTermination;             //僵尸列表
#endif

#if ( INCLUDE_vTaskSuspend == 1 )
    PRIVILEGED_DATA static List_t xSuspendedTaskList;                   //挂起列表
#endif

  现在我们关心列表项是些什么内容?列表项的定义如下:

struct xLIST_ITEM
{
    listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE           //检查列表完整性
    configLIST_VOLATILE TickType_t xItemValue;          //列表值,用于排序
    struct xLIST_ITEM * configLIST_VOLATILE pxNext;     //下一个列表项指针
    struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; //前一个列表项指针
    void * pvOwner;                                     //该列表项属于哪一个TCB
    void * configLIST_VOLATILE pvContainer;             //该列表项属于哪一个列表
    listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE          //检查列表完整性
};
typedef struct xLIST_ITEM ListItem_t;                   //类型改名

/*迷你列表项*/
struct xMINI_LIST_ITEM
{
    listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE           //检查列表完整性
    configLIST_VOLATILE TickType_t xItemValue;          //列表值,用于排序
    struct xLIST_ITEM * configLIST_VOLATILE pxNext;     //下一个列表项指针
    struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; //前一个列表项指针
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;          //类型改名

  所谓的迷你列表项,其实就是少了几个成员,因为迷你列表项表示列表的结束位置,不需要太多的成员。能够看出,多个列表项其实组成了一个双向链表,而列表头中指向该双向链表的某一个列表项和最后一个列表项,只要有列表头,就可以实现增删查改的功能,从而实现多任务的并发执行

02 - 列表与任务控制块

  列表项中一个非常重要的成员是pvOwner,它指向列表项所属的任务控制块TCB,何为TCB?简单理解为储存任务特性的结构,任务具有状态、堆栈、优先级等特性,这些特性需要储存起来供系统使用,比如根据优先级进行任务切换等等,储存的结构就称为TCB,TCB应该是操作系统中最大的一个结构体了,包含着非常多的信息,列表和TCB的关系如下(部分指针没有画出,以免过乱):

03 - 总结

  • 任务状态的每一次改变,都会进入对应的状态列表
  • 列表的本质其实就是双向链表,列表项的内容有TCB指针,next指针等
  • FreeRTOS负责维护和处理状态列表以达到多任务并发执行

猜你喜欢

转载自blog.csdn.net/Hxj_CSDN/article/details/85165270
今日推荐