STM32 FreeRTOS列表和列表项(标准库)

一、前言

本文将系统的介绍下列表和列表项的基础,关系,一些底层逻辑等

二、列表项

结构体(在list.h中):

复制代码
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;										//归谁所有,一般为任务控制块
	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;

以上两种的区别其实并不大,就在于他们所占的内存空间

三、列表

结构体(在list.h中):

复制代码
typedef struct xLIST
{
	listFIRST_LIST_INTEGRITY_CHECK_VALUE				//检查列表完整性
	configLIST_VOLATILE UBaseType_t uxNumberOfItems;    //记录列表中列表项的个数(但下面的成员xListEnd并不算在其中,即:xListEnd在创建列表时就存在,但此时uxNumberOfItems=0)
	ListItem_t * configLIST_VOLATILE pxIndex;			//用于检索列表项,指向着某个列表项
	MiniListItem_t xListEnd;							//最后的列表项,且始终在最后
	listSECOND_LIST_INTEGRITY_CHECK_VALUE				//检查列表完整性
} List_t;

四、图形化表示列表和列表项的关系

五、列表项中的 void * pvOwner; 的底层实现

在 二 中说到,pvOwner 变量表示该列表项归谁所有的,那么具体代码实现(从创建任务开始,到具体实现,具体可自行查找相关函数):

创建任务( xTaskCreate() )------>对任务进行初始化( prvInitialiseNewTask() )------>设定列表项的Owner( listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); )。

最后goto下 listSET_LIST_ITEM_OWNER(); 这个函数,即可看到其具体实现:

复制代码
pxListItem )->pvOwner = ( void * ) ( pxOwner )

六、列表初始化

函数在 list.c 中:

复制代码
void vListInitialise( List_t * const pxList )
{
	pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );			

	pxList->xListEnd.xItemValue = portMAX_DELAY;

	pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );	
	pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );
	pxList->uxNumberOfItems = ( UBaseType_t ) 0U;

	listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );
	listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
}

需要注意的几点:

列表中 xListEnd 成员被赋予的值:0xffffffffUL

列表中 xListEnd 的两个指针都指向了自己

列表中的 uxNumberOfItems 初值为0,即一开始时并没有将 xListEnd 算作列表项中的一个

七、列表项的插入

插入有两个函数:

vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem );

vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) ;

这两个函数的区别为:

vListInsert()::插入列表项时,是按照 xItemValue 的大小升序插入的,所以 xListEnd 永远是列表项的最后一个

vListInsertEnd(): 插入列表项时,是直接插入到列表末尾的

八、列表项的删除

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove );

九、列表的遍历

listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList );

相关推荐
llilian_165 小时前
总线授时卡 CPCI总线授时卡的工作原理及应用场景介绍 CPCI总线校时卡
运维·单片机·其他·自动化
禾仔仔6 小时前
USB MSC从理论到实践(模拟U盘为例)——从零开始学习USB2.0协议(六)
嵌入式硬件·mcu·计算机外设
The Electronic Cat7 小时前
树莓派使用串口启动死机
单片机·嵌入式硬件·树莓派
先知后行。10 小时前
常见元器件
单片机·嵌入式硬件
恒锐丰小吕10 小时前
屹晶微 EG2302 600V耐压、低压启动、带SD关断功能的高性价比半桥栅极驱动器技术解析
嵌入式硬件·硬件工程
Dillon Dong11 小时前
按位或(|=)的核心魔力:用宏定义优雅管理嵌入式故障字
c语言·stm32
Free丶Chan12 小时前
dsPIC系列-1:dsPIC33点灯 [I/O、RCC、定时器]
单片机·嵌入式硬件
v先v关v住v获v取13 小时前
塔式立体车库5张cad+设计说明书+三维图
科技·单片机·51单片机
恒锐丰小吕13 小时前
屹晶微 EG2106D 600V耐压、半桥MOS/IGBT驱动芯片技术解析
嵌入式硬件·硬件工程