FreerRTOS中的链表概述

FreerRTOS中的链表概述

    • 一、链表简介
    • 二、FreeRTOS中定义过的链表
    • 三、任务块中的链表项

一、链表简介

1、FreeRTOS中的链表是结构体模拟的双向链表,其链表的内容为:

FreerRTOS中的链表概述_第1张图片
(1)、listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE()
listSECOND_LIST_INTEGRITY_CHECK_VALUE()均是用来检查链表完整的。
(2)、uxNumberOfItems是用来记录链表中队列项的数目
(3)、pxIndex用来指向相对的头指针,此处相对的含义是指链表的头是变化的(在相关链表API函数调用时),而不是固定指向一个地址。
(4)、xListEnd是一个链表项,此链表项无实际的作用,而是充当类似哨兵的功能

二、链表项
链表项顾名思义即插入链表中的值,其结构体定义为FreerRTOS中的链表概述_第2张图片
(1)xItemValue是用来保存链表项的值,该值用在链表中对链表项进行排序。
(2)pxNext是指向下一个链表项
(3)pxPrevious是指向亲啊一个链表项
(4)pvOwner指向拥有该链表项的任务
(5)pvContainer是指向该链表项插入的链表

二、FreeRTOS中定义过的链表

FreeRTOS中的任务管理等采用链表的方式,对任务的数量没有限制
FreerRTOS中的链表概述_第3张图片
挂起链表
等待删除链表

(1)pxReadyTasksLists链表存放处于就绪态的等待执行的任务
(2)xDelayedTaskList1、xDelayedTaskList2链表存放由于任务阻塞(由于等待的信号量等无效或调用了延时类API等)且指定了阻塞时间的任务
(3)链表指针pxDelayedTaskList、pxOverflowDelayedTaskList分别指向普通延时列表和溢出延时链表(其实就是指向(2)中的两个链表),采用双延时链表机制是由于FreeRTOS的系统时钟是32位的计数,一定会在某时刻发生溢出,或者计算阻塞任务基于当前系统时间的解阻塞的时间发生了溢出。
(4)xPendingReadyList是由于任务调度器被挂起时发生了任务解阻塞而无法将任务加入到就绪链表,则将该任务加入到挂起就绪链表中,在任务调度器恢复时会将该链表中的所有链表项加入到就绪链表中。
(5)xSuspendedTaskList为挂起链表,存放当阻塞任务的阻塞时间设置为portMAX_DELAY(为FreeRTOS设置的阻塞时间最大值)时,将任务链表项加入该链表中。
(6)xTasksWaitingTermination是由于调用删除任务API,则将任务对应链表项加入,并作标记,待在空闲任务中执行删除工作,这样可以提高系统的效率。

附:在队列结构中存在的两个链表队列中的链表
(1)xTasksWaitingToSend是由于链表满而没有发送成功的任务,且设置了阻塞时间,则将任务对应链表项加入该链表中。
(2)xTasksWaitingToReceive是由于链表空而没有接受成功的任务,且设置了阻塞时间,则将任务对应链表项加入该链表中。

三、任务块中的链表项

任务块中的链表项
(1)xStateListItem用于指示当前任务处于何种状态,在系统中可加入二中的系统定义链表(1)-(6)中。
(2)xEventListItem是用于标记该任务是否在存在事件。若存在时间且处于堵塞态则将其插入到二中的附(1)(2)中

【注】当前学习FreeRTOS后对其链表及其用途的大体理解,后续补充,错误处请指出

你可能感兴趣的:(freertos学习笔记)