列表和列表项

一、列表和列表项简介

        列表是 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.mzph.cn/bicheng/20878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全文搜索算法的思路

一、作用 全文搜索算法适合文本文件的搜索。 二、应用场景 全文搜索算法广泛应用在各个网站的搜索功能中。 三、全文搜索和正则模糊查询的区别 1、全文搜索可以把搜索关键字进行分割&#xff0c;提取出相关的关键词。 2、正则模糊查询只能把关键字作为整体&#xff0c;不能…

Gigapixel AI 安装和使用教程

简介 Topaz Gigapixel AI 是一款功能强大的图像放大软件&#xff0c;它可以帮助用户将低分辨率的图像放大到更高的分辨率&#xff0c;而不会损失细节。该软件利用人工智能技术&#xff0c;能够智能分析图像并重建丢失的细节&#xff0c;从而生成高质量的放大图像。 安装 下载…

系统架构设计师 - 操作系统(1)

操作系统 操作系统&#xff08;5-6分&#xff09;操作系统概述进程管理进程和线程的基本概念进程的状态 ★前趋图 ★★★★信号量与 PV 操作 ★★★★死锁及银行家算法 ★ 大家好呀&#xff01;我是小笙&#xff0c;本章我主要分享系统架构设计师 - 操作系统(1)知识&#xff0c…

CSS简述(1)

CSS概述 CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种样式表语言&#xff0c;用于对HTML文档控制外观&#xff0c;定义布局。例如、css涉及字体、颜色、边距、高度、背景图像、高级定位等方面 CSS的主要用途&#xff1a; 1. 分离内容和样…

2024.6.1 学习记录

1、面经复习 2、项目使用guthub action 完成CI/CD&#xff0c;使用rollup打包为es格式 3、代码随想录刷题复习

Go语言-切片底层探索 —— 补充篇:切片和底层数组到底是什么关系?

之前的切片探索中&#xff0c;上篇通过一道算法题目&#xff0c;了解到切片的两大特性&#xff1a;一是&#xff1a;切片是引用类型&#xff0c;指向底层数组&#xff0c;修改其底层数组的时候&#xff0c;会影响切片中的值。二是&#xff1a;向切片中添加元素的时候&#xff0…

半导体光子电学期末笔记1: 电磁光学基本理论

Chapter 2: 电磁光学基本理论 电磁光学理论概述 真空中麦克斯韦方程组[p9] 在自由空间中&#xff0c;麦克斯韦方程组可以写成如下形式&#xff1a; { ∇ H ϵ 0 ∂ E ∂ t (1) ∇ E − μ 0 ∂ H ∂ t (2) ∇ ⋅ E 0 (3) ∇ ⋅ H 0 (4) \begin{cases} \nabla \times \…

Java——异常详解

异常五个主要关键字&#xff1a;throw、try、catch、finally、throws 1. 异常的概念与体系结构 1.1 异常的概念 在Java中&#xff0c;程序执行过程中发生的不正常行为被称为异常&#xff0c;如&#xff1a; 1. 算数异常 public static void main(String[] args) {System.ou…

基于MingGW64 GCC编译Windows平台上的 libuvc

安装cmake 打开cmake官网 https://cmake.org/download/&#xff0c;下载安装包&#xff1a; 安装时选择将cmake加到系统环境变量里。安装完成后在新的CMD命令窗口执行cmake --version可看到输出&#xff1a; D:\>cmake --version cmake version 3.29.3 CMake suite mainta…

牛客网刷题 | BC108 反斜线形图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…

社交媒体数据恢复:Voxer

一、Voxer数据恢复教程 了解Voxer应用 Voxer是一款专门为iPhone和Android智能手机设计的免费对讲机应用&#xff0c;为用户提供即时的语音、文本、照片等信息发送和接收服务。该应用有点类似短信服务&#xff0c;但用声音代替文本。当你下载之后&#xff0c;如果不邀请朋友&a…

Github查询语法

转载自link 基础查询结构 一个关键词会匹配文件内容或文件路径。 多个关键词会匹配文件内容&#xff0c;只要包含关键词&#xff0c;就会出现在搜索结果中&#xff0c;不论前后顺序&#xff0c;是否是一个单词&#xff08;多个关键词之间没有空格&#xff09;。 还可以使用…

Java中的JVM是什么?简要说明其工作原理

Java虚拟机&#xff08;JVM&#xff09;概述 Java虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是Java技术的核心部分。它是一个抽象的计算机&#xff0c;可以解释和执行Java字节码。JVM提供了一个运行Java程序的环境&#xff0c;使得Java程序可以在各种…

【面试】字节码文件是跨平台的吗?

目录 1. 说明 1. 说明 1.字节码文件&#xff08;.class文件&#xff09;是跨平台的。2.字节码文件是Java源代码经过Java编译器&#xff08;javac&#xff09;编译后生成的中间代码文件&#xff0c;这些包含了Java虚拟机&#xff08;JVM&#xff09;指令&#xff0c;而不是特定…

重复文件怎么查找并清理?电脑重复文件清理工具分享:4个

在日常使用电脑的过程中&#xff0c;我们不可避免地会遇到各种重复文件的问题。这些重复文件不仅占据了宝贵的存储空间&#xff0c;还可能导致系统性能下降&#xff0c;甚至引发一些不必要的问题。因此&#xff0c;如何有效地查找并清理这些重复文件成为了许多用户关注的焦点。…

计算 x 的二进制表示中 1 的个数

计算 x 的二进制表示中 1 的个数 代码如下&#xff1a; int func(int x){int countx 0;while (x>0){countx;x x & (x - 1);}return countx;} 完整代码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat…

STM32基于HAL库的HC-SR04模块超声波测距

文章目录 一、HC-SR04模块介绍二、创建工程1.选择芯片2.配置RCC、SY![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9d2a5b883f0e409eabb804e6da861277.png)3.配置串口14.配置定时器5.配置GPIO 三、Keil代码1.勾选Use MicroLIB2.创建SR04.c和SR04.h文件3.其他代码 …

html three.js 引入.stl模型示例

1.新建一个模块用于放置模型 <div id"chart_map" style"width:800px;height:500px"></div> 2. 引入代码根据需求更改 <!-- 在head或body标签内加入以下链接 --> <script src"https://cdn.jsdelivr.net/npm/three0.137/build/t…

算法题-字符串排序

题目描述 给定n个字符串&#xff0c;请对n个字符串按照字典序排列。 输入描述: 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。 输出描述: 数据输出n行&#xff0c;输出结果为按照字典序排列的字符串。 输入 #输…

2.7HDR与LDR

一、基本概念 1.基本概念 动态范围&#xff08;Dynamic Range&#xff09; 最高亮度 / 最低亮度 HDR High Dynamic RangeLDR Low Dynamic Range HDR与LDR和Tonemapping的对应关系&#xff1a; 我们常用的各种显示器屏幕&#xff0c;由于不同的厂家不同的工艺导致它们的…