最簡實時性操作系統之任務鏈表

在freertos中任務和就緒列表就像衣架一樣由根節點和節點那樣構成

實時性操作系統中鏈表的數據結構

鏈表

cpp 复制代码
/* 链表结构体定义 */
typedef struct xLIST
{
	UBaseType_t uxNumberOfItems;    /* 链表节点计数器 */
	ListItem_t *  pxIndex;			/* 链表节点索引指针 */
	MiniListItem_t xListEnd;		/* 链表最后一个节点 */
} List_t;

鏈表下面主要由

1.節點計數器,不包含節點

2.節點索引指針

3.根節點組成

其中根節點一般表示一個就緒任務集合還有阻塞任務集合,用以串聯起該任務的

1.輔助值用以升序排序,一般設爲最大值

2.根節點的前後指針

節點項

節點項可以表示一個任務

1.是輔助值用以升序排序

2.是節點項的上一項和下一項的指針

3.是TCB任務塊的指針

4.是所屬根節點

實時性操作系統中鏈表的操作函數

初始化鏈表

cpp 复制代码
//初始化一個根節點
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);
}

初始化節點

cpp 复制代码
//初始化一個節點
void vListInitialiseItem(ListItem_t * const pxItem)
{
	pxItem->pvContainer = NULL;
}

將節點插入鏈表的尾部

cpp 复制代码
void vListInserEnd(list_t * const pxList, ListItem_t *const pxNewListItem)
{
	ListItem_t * const pxIndex = pxList->pxIndex;
	
	pxNewListItem->pxNext = pxIndex;
	pxNewListItem->pxPrevious = pxIndex->pxPrevious;
	pxIndex->pxPrevious->pxNext = pxNewListItem;
	pxIndex->pxPrevious = pxNewListItem;
	
	pxNewListItem->pvContainer = (void *)pxList;
	(pxList->uxNumberOfItems)++;
}

聽著有點拗口,實際上一個鏈表長這樣 INDEX -> A -> B -> INDEX

INDEX是固定的,INDEX->pxPrevious表示當前鏈表的最後一項

1.首先將當前插入的項的前後相分別指向鏈表的頭相和尾項

2.然後解決之前鏈表的最後一項,讓它指向鏈表要新插入的相,因爲鏈表之前最後一項的上一項沒有變化所以不用改變

3.最後把鏈表相挂在在鏈表中,并且計數器加1

按順序將節點插入鏈表

cpp 复制代码
#include "list.h"

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

講解如下:

向链表的尾部插入一个项_哔哩哔哩_bilibili

刪除一個鏈表

cpp 复制代码
UBaseType_t uxListRemove(ListItem_t * const pxItemToRemove)
{
	list_t * const pxList = (list_t *) pxItemToRemove->pvContainer;
	
	pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
	pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
	
	if(pxList->pxIndex == pxItemToRemove)
	{
		pxList->pxIndex = pxItemToRemove->pxPrevious;
	}
	
	pxItemToRemove->pvContainer = NULL;
	(pxList->uxNumberOfItems)--;
	
	return pxList->uxNumberOfItems;
}
相关推荐
JiKun6 小时前
一键配置 Web 前端开发环境(PowerShell 自动化脚本)
前端·windows·程序员
yuuki2332336 小时前
【C语言】预处理详解
c语言·windows·后端
墨尘笔尖8 小时前
使用子进程实现 C++ 与 Python 交互式控制台
c++·windows·python
许泽宇的技术分享8 小时前
Windows MCP.Net:解锁AI助手的Windows桌面自动化潜能
人工智能·windows·.net·mcp
IT小哥哥呀15 小时前
5 个 Windows 故障排除工具
windows·故障排除·系统运维·windows系统·电脑问题
应用市场17 小时前
构建自定义命令行工具 - 打造专属指令体
开发语言·windows·python
东方佑17 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
Warren981 天前
复习MySQL
数据库·windows·tcp/ip·mysql·ubuntu·ssh·ansible
低调小一1 天前
KuiklyUI 科普:UI 如何映射到 Android View 并完成渲染
android·windows·ui