当前位置: 首页 > news >正文

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

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

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

鏈表

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

鏈表下面主要由

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

2.節點索引指針

3.根節點組成

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

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

2.根節點的前後指針

節點項

節點項可以表示一個任務

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

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

3.是TCB任務塊的指針

4.是所屬根節點

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

初始化鏈表

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

初始化節點


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

將節點插入鏈表的尾部

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

按順序將節點插入鏈表

#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

刪除一個鏈表

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

http://www.dtcms.com/a/503420.html

相关文章:

  • LeetCode:886. 可能的二分法
  • 【Linux】应用层协议http
  • cms网站后台上传图片提示图片类型错误但是类型是正确的服装网站建设效果
  • C程序中的数组与指针共生关系
  • 网站的建立步骤网站ip地址大全
  • 每日Reddit AI信息汇总 10.19
  • k8s(九)安全机制
  • 中国建设银行陕西分行官方网站微网站建设使用程序
  • 福州网站优化手机网站设计案例
  • Orleans 序列化、Actor Placement 和 Actor 调用详细分析
  • Java Object类及包装类
  • 《算法通关指南---C++编程篇(4)》
  • VScode 入门(设置篇)
  • 【第十八周】机器学习笔记07
  • 机械行业做网站wordpress 唯艾迪
  • TVM | 基本概念
  • 建设网站免费模板下载中国旅游网站模板
  • UVa 1471 Defense Lines
  • 【题解】洛谷 P11673 [USACO25JAN] Median Heap G [树形 dp]
  • 气球游戏(DP,分治)
  • MySQL同步连接池与TrinityCore的对比学习(六)
  • UserWarning: No file found at “C:\Faces\image_0032.jpg“AssertionError
  • 网站生成器下载wordpress 添加微博关注
  • 【个人成长笔记】Qt Creator快捷键终极指南:从入门到精通
  • 【开题答辩过程】以《校园可共享物品租赁系统的设计与实现》为例,不会开题答辩的可以进来看看
  • 北京高端网站定制公司猎头公司工作怎么样
  • StarRocks-基本介绍(一)基本概念、特点、适用场景
  • Java零基础入门:从封装到构造方法 --- OOP(上)
  • JAVA算法练习题day43
  • 如何学习Lodash源码?