列表和列表项

一、列表和列表项简介

        列表是 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,一经查实,立即删除!

相关文章

Gigapixel AI 安装和使用教程

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

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

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

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…

重复文件怎么查找并清理?电脑重复文件清理工具分享: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…

2.7HDR与LDR

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

HALCON-从入门到入门-软件界面介绍

1.废话 从halcon12到halcon23&#xff0c;开发的IDE界面大差不差&#xff0c;简单说下界面上不同功能按键的分布&#xff0c;以及一些快捷键啥的&#xff0c;要是还有我没有总结到的&#xff0c;又比较好用的&#xff0c;欢迎大家补充一下。 1.菜单栏 从上看到下&#xff0c;…

python深度学习入门-从零构建CNN和RNN

文章目录 第1章 基本概念1.1. 导数1.2. 链式法则1.3. 多输入函数的导数1.4. 多输入向量函数的导数1.5. 向量函数及其导数&#xff1a; 再进一步1.6. 包含两个二维矩阵数据的计算图 第2章 基本原理2.1. 监督学习概述2.2. 监督学习模型2.3. 线性回归2.3.1. 线性回归&#xff1a; …

[激光原理与应用-94]:电控 - 低噪声运放的原理

目录 一、什么是低噪声运放 1.1 什么是低噪声水平 1.2 什么是高增益 在电子工程中的应用 在通信领域的应用 在音频和视频处理中的应用 注意事项 1.3 什么是宽带宽 1.4 什么是低偏置电流 重要性 特点 解决方法 应用 二、低噪声运放的原理图 1. 基本构成 2. 设计…

第五维度【百度之星】/二分

第五维度 二分 思路&#xff1a;看到题目是尽可能晚的情况下最早就应该想到贪心。 #include<bits/stdc.h> using namespace std; typedef long long ll; ll a[100005],b[100005]; ll n,m; bool check(ll t) {ll res0,big0;for(ll i0;i<n;i) {if(a[i]>t) continue…

JMeter工具介绍

Jmeter功能概要 JDK常用文件目录介绍 Bin目录&#xff1a;存放可执行文件和配置文件 Docs目录&#xff1a;是Jmeter的API文档&#xff0c;用于开发扩展组件 printable_docs目录&#xff1a;用户帮助手册 lib目录&#xff1a;存放JMeter依赖的jar包和用户扩展所依赖的Jar包 修…

HALCON-从入门到入门-读取图片保存图片

1.废话 视觉算法库的第一步。 读取图片&#xff1a; 看你是从哪里读取&#xff0c;从相机读取还是从本地硬盘中读取。 保存图片&#xff1a;就只有保存到本地了。 上面的截图显示我读取了一张图片 从相机中读取另开一篇来说&#xff0c;先说从本地磁盘读取哈。 怎么读取的…