列表和列表项

一、列表和列表项简介

        列表是 FreeRTOS 中的一个数据结构,列表被用来跟踪 FreeRTOS中的任务(任务当前的状态),列表项就是存放在列表中的项目

        列表相当于链表,列表项相当于节点,FreeRTOS 中的列表是一个双向循环链表  

        列表项间的地址非连续的,列表项的数目随时可以改变

        列表项的指向前一个、后一个指针,就相当于人的左右手,整个列表就相当于N个人互相拉着手,围成一个圈,而列表是管理这个圈

        

二、 列表与列表项

2.1 列表结构体

typedef struct xLIST
{
  	 listFIRST_LIST_INTEGRITY_CHECK_VALUE		    /* 校验值 */
   	 volatile UBaseType_t uxNumberOfItems;			/* 列表中的列表项数量 */
   	 ListItem_t * configLIST_VOLATILE pxIndex		/* 用于遍历列表项的指针 */
   	 MiniListItem_t xListEnd					    /* 末尾列表项 */
   	 listSECOND_LIST_INTEGRITY_CHECK_VALUE		    /* 校验值 */
} List_t;

成员说明:

成员描述

listFIRST_LIST_INTEGRITY_CHECK_VALUE

listSECOND_LIST_INTEGRITY_CHECK_VALUE

具有确定已知常量的宏

FreeRTOS通过检查这两个常量的值,来判断列表的数据在程序运行过程中,是否遭到破坏 ,该功能一般用于调试, 默认是不开启的

uxNumberOfItems用于记录列表中列表项的个数不包含 xListEnd
pxIndex用于指向列表中的某个列表项,一般用于遍历列表中的所有列表项
xListEnd一个迷你列表项排在最末尾

列表结构示意图: 

2.2 列表项结构体

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							            /* 列表项的拥有者 */
    	struct xLIST * configLIST_VOLATILE pxContainer; 	/* 列表项所在列表 */
    	listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE			/* 用于检测列表项的数据完整性*/
};
typedef struct xLIST_ITEM ListItem_t; 

成员说明:

成员描述

listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE

listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALU

用于检测列表项的数据完整性
xItemValue列表项的值,多用于将列表中的列表项按升序排序
pxNext指向列表中列表项的下一个列表项
pxPrevious指向列表中列表项的上一个列表项
pvOwner用于指向包含列表项的对象(通常是任务控制块
pxContainer用于指向列表项所在列表

列表项结构示意图: 

 2.3 迷你列表项(末尾列表项)

迷你列表项也是列表项,但迷你列表项仅用于标记列表的末尾挂载其他插入列表中的列表项(将要插入的列表项连接在一起

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;

成员说明: 

成员描述
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE用于检测数据完整性
xItemValue列表项的值,多用于按升序对列表中的列表项进行排序

pxNext

pxPrevious

用于指向列表中列表项的下一个列表项和上一个列表项

        与正常列表项,缺少列表项拥有者、列表项所在列表成员 ,以节省内存开销

迷你列表项结构示意图:

三、列表相关API函数

函数

描述

vListInitialise()

初始化列表

vListInitialiseItem()

初始化列表项

vListInsertEnd()

列表末尾插入列表项

vListInsert()

列表插入列表项(升序插入

uxListRemove()

列表移除列表项

 

3.1 初始化列表:vListInitialise( )

void vListInitialise( List_t * const pxList )
{
    /*  初始化时,列表中只有 xListEnd,因此 pxIndex 指向 xListEnd */
    pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); 
    listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) );

    /* xListEnd 的值初始化为最大值,用于列表项升序排序时,排在最后 */
    pxList->xListEnd.xItemValue = portMAX_DELAY;

    /* 初始化时,列表中只有 xListEnd,因此上一个和下一个列表项都为 xListEnd 本身 */
    pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );    
    pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); 

    /* 初始化时,列表中的列表项数量为 0(不包含 xListEnd) */
    pxList->uxNumberOfItems = ( UBaseType_t ) 0U;

    /* 检查数据的完整性 */
    listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );
    listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
}

参数说明: 

参数说明
pxList待初始化的列表

列表初始化后的结构示意图: 

3.2 列表项初始化:vListInitialiseItem()

void vListInitialiseItem( ListItem_t * const pxItem )
{
    /* 初始化时,列表项所在列表设为空  */
    pxItem->pxContainer = NULL;

    /* 初始化用于检测列表项数据完整性的校验值  */
    listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
    listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
}

        其他成员变量根据实际使用情况进行初始化 

参数说明: 

参数说明
pxItem待初始化的列表项

列表初始化后的结构示意图: 

3.3 列表插入列表项(升序插入):vListInsert()

函数功能:将待插入列表的列表项按照列表项值升序插入有序地插入到列表中

void vListInsert( List_t * const pxList,
                  ListItem_t * const pxNewListItem )
{
    /*获取列表项的数值依据数值升序排列 */
    ListItem_t * pxIterator;
    const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;

    /* 检查参数是否正确  */
    listTEST_LIST_INTEGRITY( pxList );
    listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );

    /* 如果待插入列表项的值为最大值,插入的位置为列表 xListEnd 前面  */
    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->pxContainer = pxList;
    
    /* 更新列表中列表项的数量 */ 
    ( pxList->uxNumberOfItems )++;
}

 参数说明:

参数说明

pxList

列表

pxNewListItem

待插入列表项

3.4 列表末尾插入: vListInsertEnd()

函数功能:将待插入列表的列表项插入到列表 pxIndex 指针指向的列表项前面(初始化时:pxIndex指向迷你列表项),是一种无序的插入方法 

void vListInsertEnd (  List_t * const pxList ,   ListItem_t * const pxNewListItem  )
{
	 /* 获取列表 pxIndex 指向的列表项 */
	ListItem_t * const pxIndex = pxList->pxIndex;

	/* 更新待插入列表项的指针成员变量 */	
    pxNewListItem->pxNext = pxIndex;	
    pxNewListItem->pxPrevious = pxIndex->pxPrevious;
 	
    /* 更新列表中原本列表项的指针成员变量 */	
    pxIndex->pxPrevious->pxNext = pxNewListItem;
    pxIndex->pxPrevious = pxNewListItem;

    /* 更新待插入列表项的所在列表成员变量 */	
    pxNewListItem->pxContainer = pxList;

    /* 更新列表中列表项的数量 */
    ( pxList->uxNumberOfItems )++;
} 

参数说明:

参数说明

pxList

列表

pxNewListItem

待插入列表项

2.5 移出列表项:uxListRemove()

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) 
{
	List_t * const pxList = pxItemToRemove->pxContainer; 

    /* 从列表中移除列表项 */ 
	pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
	pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; 	
 
    /*如果 pxIndex 正指向待移除的列表项 */ 
	if( pxList->pxIndex == pxItemToRemove ) 
	{
        /*pxIndex 指向上一个列表项*/ 
	 	pxList->pxIndex = pxItemToRemove->pxPrevious;
	} 
    else 
	{ 
		mtCOVERAGE_TEST_MARKER(); 
	} 

    /*将待移除的列表项的所在列表指针清空*/ 
	pxItemToRemove->pxContainer = NULL; 

    /*更新列表中列表项的数量*/ 
	( pxList->uxNumberOfItems )--; 

	return pxList->uxNumberOfItems; 
}

参数说明:

参数说明
pxItemToRemove待移出的列表项

返回值

移除后,列表剩余的列表项数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/670770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt各发布版本介绍与选择

一.Qt各个主要版本介绍 1.Qt4 Qt4的第一个版本是Qt 4.0&#xff0c;发布于2005年6月1日。 Qt 4的最后一个版本是Qt 4.8.7&#xff0c;发布时间是2015年6月10日。 2.Qt5 &#xff08;1&#xff09;Qt5的第一个版本是Qt 5.0&#xff0c;发布于2012年12月19日。 &#xff08;2&…

575. 分糖果

题目 Alice 有 n 枚糖&#xff0c;其中第 i 枚糖的类型为 candyType[i]。Alice 注意到她的体重正在增长&#xff0c;所以前去拜访了一位医生。 医生建议 Alice 要少摄入糖分&#xff0c;只吃掉她所有糖的 n / 2 即可&#xff08;n 是一个偶数&#xff09;。Alice 非常喜欢这些…

LabVIEW版本控制

LabVIEW作为一种流行的图形化编程环境&#xff0c;在软件开发中广泛应用。有效地管理版本控制对于确保软件的可靠性和可维护性至关重要。LabVIEW提供了多种方式来管理VI和应用程序的修订历史&#xff0c;以满足不同规模和复杂度的项目需求。 LabVIEW中的VI修订历史 LabVIEW内置…

低代码选型要注意什么问题?

低代码选型时&#xff0c;确实需要从多个角度综合考虑&#xff0c;以下是根据您给出的角度进行的分析和建议&#xff1a; 公司的人才资源&#xff1a; 评估团队中是否有具备编程能力的开发人员&#xff0c;以确保能够充分利用低代码平台的高级功能和进行必要的定制开发。考察实…

11.2.0.3RAC 备份集恢复为单实例11.2.0.4_法一:rman备份恢复

关键步骤&#xff1a; 1、移动硬盘格式化成Linux可以识别的文件系统&#xff0c;mount到备份目录&#xff0c;开始rman备份&#xff0c;备份完成后&#xff0c;插到目标服务器挂载&#xff0c; 2、恢复参数文件nomount库&#xff0c;恢复控制文件mount库&#xff0c;restore …

工业互联网数字中台建设方案(ppt)

工业互联网数字中台整体解决方案&#xff08;ppt原件&#xff09; 1、工业数字中台的价值 2、数字化中台的特点 3、数字化中台方案介绍 软件项目相关全套精华资料包获取方式①&#xff1a;点我获取 获取方式②&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档…

pyopengl 立方体 正投影,透视投影

目录 顶点和线的方式 划线的方式实现: 顶点和线的方式 import numpy as np from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from OpenGL.GL import * from OpenGL.GLU import * import sys…

Jupyter Notebook快速搭建

Jupyter Notebook why Jupyter Notebook Jupyter Notebook 是一个开源的 Web 应用程序&#xff0c;允许你创建和分享包含实时代码、方程、可视化和解释性文本的文档。其应用包括&#xff1a;数据清洗和转换、数值模拟、统计建模、数据可视化、机器学习等等。 Jupyter Notebo…

springboot+vue+mybatis超市管理-简单版+PPT+论文+讲解+售后

使用旧方法对超市信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在超市信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的小型超市管理系统有管理员&…

深度学习-04-数值的微分

深度学习-04-数值的微分 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xff0c;也…

vulhub中Jenkins CLI 接口任意文件读取漏洞复现(CVE-2024-23897)

Jenkins是一个开源的自动化服务器。 Jenkins使用[args4j](https://github.com/kohsuke/args4j)来解析命令行输入&#xff0c;并支持通过HTTP、Websocket等协议远程传入命令行参数。args4j中用户可以通过字符来加载任意文件&#xff0c;这导致攻击者可以通过该特性来读取服务器…

童趣盎然,米香四溢 —— 蒙自源六一儿童节特别献礼

充满欢声笑语的六一儿童节马上就要来了&#xff0c;在这个充满童真和喜悦的时刻&#xff0c;蒙自源米线品牌以一颗童心&#xff0c;为所有大朋友和小朋友准备了一份特别的礼物。 从5月25日开始&#xff0c;蒙自源诚挚邀请您和孩子们一同前往蒙自源旗下各大门店&#xff0c;品尝…

Minio启动脚本-Windows版

MinIO 是一种高性能、S3 兼容的对象存储。 它专为大规模 AI/ML、数据湖和数据库工作负载而构建,并且它是由软件定义的存储。 不需要购买任何专有硬件,就可以在云上和普通硬件上拥有分布式对象存储。 MinIO拥有开源 GNU AGPL v3 和商业企业许可证的双重许可。 ——摘自…

集合类源码浅析のArrayList

源码分析路线图&#xff1a; 初级部分&#xff1a;ArrayList->LinkedList->Vector->HashMap(红黑树数据结构&#xff0c;如何翻转&#xff0c;变色&#xff0c;手写红黑树)->ConcurrentHashMap 中级部分&#xff1a;Spring->Spring MVC->Spring Boot->M…

一文彻底讲透 PyTorch

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

linux系统的vscode快捷键大全

多行注释快捷键&#xff1a;ctrl shift A 单行注释&#xff1a;ctrl K ctrl C 取消单行注释&#xff1a;ctrl K ctrl U

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统

株洲中车时代电气股份有限公司&#xff08;下称中车时代电气&#xff09;是中国中车旗下股份制企业&#xff0c;其前身及母公司——中车株洲电力机车研究所有限公司创立于1959年。中车时代电气扎根株洲&#xff0c;走好两条钢轨&#xff0c;走出两条钢轨。中车时代电气秉承“双…

抽象一个通用的配置冲突解决方案

最近的开发项目中遇到了一个关于配置冲突的解决和产品设计&#xff0c;一直以来都没有处理好。最近抽空整理了一下思路和设计&#xff0c;并做了抽象&#xff0c;后续的类似使用&#xff0c;可以做到直接复用。 思路和代码见&#xff1a;github地址&#xff1a;https://github…

RTA GMH系列 SERIE MOTION电机驱动板手侧 英文版

RTA GMH系列 SERIE MOTION电机驱动板手侧 英文版

ESP-01S 使用 arduino 烧录程序

一、设置 arduino 编辑器 1、文件-首选项-附加开发版管理网址中添加 http://arduino.esp8266.com/stable/package_esp8266com_index.json 2、工具-开发板管理 搜索 8266 并下载 ) 3、工具-开发板 在 8266 里面选择 Generic ESP8266 Module 4、工具-端口 记得选择对应的端口 …