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 );

相关推荐
计蒙不吃鱼8 分钟前
星闪开发之Server-Client 指令交互控制红灯亮灭案例解析(SLE_LED详解)
嵌入式硬件·物联网·iot·星闪·星闪开发
想搞嵌入式的小白1 小时前
STM32 NVIC中断控制器
stm32·单片机·嵌入式硬件·nvic
A-花开堪折1 小时前
Android7 Input(十)View 处理Input事件pipeline
android·嵌入式硬件
深圳市尚想信息技术有限公司2 小时前
【深尚想】OPA855QDSGRQ1运算放大器IC德州仪器TI汽车级高速8GHz增益带宽的全面解析
单片机·嵌入式硬件
陕西艾瑞科惯性技术有限公司2 小时前
让飞行姿态 “可感知”:为什么无人机需要三轴陀螺仪?
嵌入式硬件·机器学习·机器人·无人机·pcb工艺
代码总长两年半2 小时前
STM32----IAP远程升级
stm32·单片机·嵌入式硬件
广药门徒3 小时前
STM32手册上标称的18MHz GPIO翻转速度和你实际测量到的速度之间的差异是预期之内且合理的
单片机·嵌入式硬件
广药门徒3 小时前
在使用一些不用驱动大电流的设备就可以用stm32的自己的上下拉但是本身上下拉不就是给iicspi这些他通信给信号的吗中怎么还跟驱动能力扯上了有什么场景嘛
stm32·单片机·fpga开发
jz_ddk4 小时前
[zynq] Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解(代码示例)
linux·运维·c语言·网络·嵌入式硬件
天天爱吃肉82184 小时前
【十年技术演进深度解构:车载充电机(OBC)将成为新能源汽车的“能源大脑”】
python·嵌入式硬件·算法·汽车·能源