FreeRTOS链表插入分析

文章详细分析了在FreeRTOS中如何初始化链表、在尾部插入节点以及按升序在中间插入节点的过程。初始化时,链表索引指向最后一个节点,节点值设为最大,形成闭环。插入链表尾部时,更新节点的前后指针并增加节点计数。插入中间时,根据节点值找到合适位置并调整相邻节点的指针。
摘要由CSDN通过智能技术生成


参考:野火仿真教程

插入一个数逻辑图

1.初始化链表

/* 链表根节点初始化 */
void vListInitialise( List_t * const pxList )
{
	/* 将链表索引指针指向最后一个节点 */
	pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );//pxIndex会变成0x2000000C

	/* 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点 */
	pxList->xListEnd.xItemValue = portMAX_DELAY;

    /* 将最后一个节点的pxNext和pxPrevious指针均指向节点自身,表示链表为空 */
	pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );//0x2000000C
	pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );//0x2000000C

	/* 初始化链表节点计数器的值为0,表示链表为空 */
	pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
}

在这里插入图片描述
在这里插入图片描述

2.插入链表尾部

/* 将节点插入到链表的尾部 */
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
{
	ListItem_t * const pxIndex = pxList->pxIndex;//都会为0x2000000C 会重新生成一个类型为ListItem_t的pxIndex 

    /*这里需要注意的是pxIndex和 pxList->pxIndex和xListEnd的地址都是一样的都是0x2000000C,改变也随之改变*/
	pxNewListItem->pxNext = pxIndex;//0x2000000C
	pxNewListItem->pxPrevious = pxIndex->pxPrevious;//0x2000000C
	pxIndex->pxPrevious->pxNext = pxNewListItem;//0x20000004
	pxIndex->pxPrevious = pxNewListItem;//0x20000004

	/* 记住该节点所在的链表 */
	pxNewListItem->pvContainer = ( void * ) pxList;

	/* 链表节点计数器++ */
	( pxList->uxNumberOfItems )++;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这边主要是形成了一个闭环

3.插入链表中间

/* 将节点按照升序排列插入到链表 */
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
{
	ListItem_t *pxIterator;
	
	/* 获取节点的排序辅助值 */
	const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;

	/* 寻找节点要插入的位置 */
	if( xValueOfInsertion == portMAX_DELAY )
	{
		pxIterator = pxList->xListEnd.pxPrevious;
	}
	else
	{
		for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd );
		     pxIterator->pxNext->xItemValue <= xValueOfInsertion; 
			 pxIterator = pxIterator->pxNext )
		{
			/* 没有事情可做,不断迭代只为了找到节点要插入的位置 */			
		}
	}

	pxNewListItem->pxNext = pxIterator->pxNext;
	pxNewListItem->pxNext->pxPrevious = pxNewListItem;
	pxNewListItem->pxPrevious = pxIterator;
	pxIterator->pxNext = pxNewListItem;

	/* 记住该节点所在的链表 */
	pxNewListItem->pvContainer = ( void * ) pxList;

	/* 链表节点计数器++ */
	( pxList->uxNumberOfItems )++;
}

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值