FreeRTOS-列表和列表项

news2024/12/23 22:18:30

列表和列表项:

列表是FreeRTOS中的一个数据结构,用来跟踪FreeRTOS中的任务。
列表项就是存放在列表中的项目,属于列表的子集。
列表就相当于一个链表,列表项就相当于节点,在FreeRTOS中的列表是一个双向的环形链表。

列表的特点:

  • 列表项之间的地址非连续的,是人为连接在一起的;
  • 列表项的数目是由后期添加的个数决定的,随时可以改变。

在OS中任务的数量是不确定的,并且任务状态是会发生改变的,所以非常适合使用列表(链表)。

列表示意图:

在这里插入图片描述

  • 开头和结尾的两个校验值是用来调试使用的,默认不开启;
  • 成员uxNumberOfltems,用于记录列表中列表项的个数(不包含xListEnd);
  • 成员pxlndex用于指向列表中的某个列表项,一般用于遍历列表中的所有列表项;
  • 成员变量xListEnd是一个迷你列表项,排在最末尾。
    在这里插入图片描述

列表项 :

在这里插入图片描述

  • 成员变量xltemValue为列表项的值,用于按升序对列表中的列表项进行排序;
  • 成员变量pxNextpxPrevious分别用于指向列表项的下一个列表项和上一个列表项;
  • 成员变量pxOwner用于指向包含列表项的对象(通常是任务控制块);
  • 成员变量pxContainer用于指向列表项所在列表。
    在这里插入图片描述

迷你列表项:

迷你列表项仅用于标记列表项的末尾和挂载其他插入列表中的列表项。
在这里插入图片描述

  • 成员变量`xltemValue为列表项的值,用于按升序对列表中的列表项进行排序;
  • 成员变量pxNextpxPrevious分别用于指向列表中列表项的下一个列表项和上一个列表项;
  • 迷你列表项只用于标记列表的末尾和挂载其他插入列表中的列表项,因此不需要成员变量pxOwnerpxContainer,以节省内存开销。
    在这里插入图片描述

列表相关的API函数:

在这里插入图片描述

初始化列表项vListInitalise():

void vListInitialise( List_t * const pxList )
{
    pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );//初始化时,列表中只有ListEnd,因此pxIndex指向xListEnd
    pxList->xListEnd.xItemValue = portMAX_DELAY;//xListEnd的值初始化为最大值,用于列表项升序排序时,排在最后面
    //初始化时,列表中只有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
描述:待初始化的列表
在这里插入图片描述

函数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
描述:待初始化列表项

函数vListInset():

void vListInset(List_t * const pxList,ListItem_t *const pxNewListItem)//用于将待插入列表项按照列表项的值升序进行排序,有序地插入到列表中

形参:
pxList表示列表;
pxNewListItem表示待插入列表项

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 );
    if( xValueOfInsertion == portMAX_DELAY )
    {
        pxIterator = pxList->xListEnd.pxPrevious;//插入位置为列表xListEnd前面
    }
    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 )++;//更新列表中列表项的数量
}

函数vListInsertEnd():

void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )

形参:
pxList表示要插入的列表;
pxNewListItem表示待插入的列表项

void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
{
	//获取列表pxIndex指向的列表项
    ListItem_t * const pxIndex = pxList->pxIndex;
    
    listTEST_LIST_INTEGRITY( pxList );
    listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );
    /*更新待插入列表项的指针成员*/
    pxNewListItem->pxNext = pxIndex;
    pxNewListItem->pxPrevious = pxIndex->pxPrevious;
    mtCOVERAGE_TEST_DELAY();
    /*更新列表中原本列表项的指针成员变量*/
    pxIndex->pxPrevious->pxNext = pxNewListItem;
    pxIndex->pxPrevious = pxNewListItem;
    /*更新待插入列表项的所在列表成员数量*/
    pxNewListItem->pxContainer = pxList;
    /*更新列表中列表项的数量*/
    ( pxList->uxNumberOfItems )++;
}

函数uxListRemove():

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )

形参:
pxItemToRemove表示待移除的列表项
返回值:
整数,表示待移除列表项移除后,所在列表剩余列表项的数量

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
{
    List_t * const pxList = pxItemToRemove->pxContainer;
	/*从列表中移除列表项*/
    pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
    pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;

    mtCOVERAGE_TEST_DELAY();
    /*如果pxIndex正指向待移除的列表项*/
    if( pxList->pxIndex == pxItemToRemove )
    {
    	/*pxIndex指向上一个列表项*/
        pxList->pxIndex = pxItemToRemove->pxPrevious;
    }
    else
    {
        mtCOVERAGE_TEST_MARKER();
    }
	/*将待移除的列表项的所在列表指针清空*/
    pxItemToRemove->pxContainer = NULL;
    /*更新列表中列表项的数量*/
    ( pxList->uxNumberOfItems )--;
	/*返回移除后的列表中列表项的数量*/
    return pxList->uxNumberOfItems;
}

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

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

相关文章

基于FPGA的视频接口之PAL(NTSC)编码

简介 PAL又称帕尔制&#xff0c;是咱们中国早期视频所是使用的视频广播模式&#xff0c;基本上现在的电视都兼容这种视频模式&#xff0c;使用的接口也是传统的BNC插头&#xff0c;有兴趣的伙伴可以看看电视屁股后面是不是有一个单独的BNC接口&#xff0c;百分之98就是支持PAL格…

FastReport.Net FastReport.Core 2023.2.23 Crack

FastReport.Net & FastReport.Core 2023.2.23适用于 .NET 7、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可用于 Microsoft Visual Studio 2022 和 JetBrains Rider。 利用数据呈现领域专家针对 .NET 7、.NET Core、Blazor、ASP.NET、MVC、Windo…

【Windows】cmd和powershell命令合集

文章目录 1 前言2 一些规则3 cmd命令合集4 bat语法学习5 powershell命令合集6 powershell语法学习 1 前言 在日常使用过程中&#xff0c;总是会遇到不记得或无法区分cmd命令和powershell命令的情况&#xff0c;因为在Windows的工作大部分都是可视化的鼠标点击&#xff0c;用到命…

CLH自旋锁原理

CLH自旋锁 JUC中显式锁基于AQS抽象队列同步器&#xff0c;而AQS是CLH锁的一个变种。 在争夺锁激烈的情况下&#xff0c;为了减少CAS空自旋&#xff08;CAS需要CPU进行内部通信保证缓存一致性造成流量过大引起总线风暴&#xff09;&#xff0c;Java轻量级锁会升级为重量级锁&a…

大数据学习03-Hive分布式集群部署

系统环境&#xff1a;centos7 软件版本&#xff1a;jdk1.8、zookeeper3.4.8、hadoop2.8.5、hive1.1.0 一、安装 hive官网 下载hive安装包&#xff0c;上传到linux服务器上&#xff0c; 解压安装包 tar -zxvf apache-hive-1.1.0-bin.tar.gz -C /home/local/重命名文件 mv …

腾讯云轻量应用服务器搭建Typecho博客网站全流程

腾讯云轻量应用服务器自带Typecho应用模板镜像&#xff0c;腾讯云提供的Typecho模板镜像是基于CentOS 7.6 64位操作系统&#xff0c;并已预置Nginx、PHP、MariaDB软件程序&#xff0c;使用Typecho应用模板可以快速搭建博客、企业官网、电商及论坛等各类网站。腾讯云服务器网分享…

C# 反转链表

206 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3…

Python中的标签编码和独热编码

在机器学习项目中&#xff0c;我们通常处理具有不同分类列的数据集&#xff0c;其中一些列的元素在有序变量类别中&#xff0c;例如列收入水平具有低&#xff0c;中或高的元素&#xff0c;在这种情况下&#xff0c;我们可以用1&#xff0c;2&#xff0c;3替换这些元素。其中1表…

【100天精通python】Day9:数据结构_字典、集合

目录 目录 1 字典 1.1 字典的基本操作示例 1.2 字典推导式 2 集合 2.1 集合的常用操作示例 3 列表、元组、字典、集合的区别 1 字典 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种无序的数据结构&#xff0c;用于存储键值对的集合。每个…

flask 读取文件夹文件,展示在页面,可以通过勾选删除

项目结构 app.py from flask import Flask, render_template, request, redirect, url_for import os import globapp Flask(__name__)app.route(/, methods[GET, POST]) def index():if request.method POST:to_delete request.form.getlist(checks)for file in to_delete…

Spring Security 的工作原理/总体架构

目录 1、过滤器的视角 2、DelegatingFilterProxy 委派过滤器代理&#xff08;类&#xff09; 2、FilterChainProxy 过滤器链代理&#xff08;类&#xff09; 4、SecurityFilterChain 安全过滤器链&#xff08;接口&#xff09; 5、Security Filters 安全过滤器实例 6、Sp…

解锁潜力,驭数赋能:大数据与云计算的强强联合

随着数字化时代的来临&#xff0c;大数据和云计算已成为信息技术领域的两大热门话题。大数据指的是以海量、高速、多样化的数据为基础&#xff0c;通过分析和挖掘来获得有价值的信息和洞察。而云计算则是一种基于网络的计算模式&#xff0c;通过将数据和应用程序存储在云端服务…

day31-Password Generator(密码生成器)

50 天学习 50 个项目 - HTMLCSS and JavaScript day31-Password Generator&#xff08;密码生成器&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&q…

Qt 之 自定义日志文件,QtMessageHandler应用

目录 一、前言 二、头文件代码 三、源文件代码 四、使用示例 五、使用效果 一、前言 在qt程序发布后&#xff0c;还需要查看一些调试输出信息&#xff0c;一般将输出信息写入日志文件&#xff0c;本文通过自定义函数实现将Debug、Warning、Critical、Fatal及Info信息自动输…

品牌全量数据监测分析

线上渠道众多&#xff0c;涉及的产品链接量也是巨大的&#xff0c;多数品牌在做线上数据监测时&#xff0c;是需要对全量数据进行监测分析&#xff0c;比如对某个SKU的全量数据&#xff0c;或者对某个竞品的全量数据进行监测&#xff0c;所以需求确认了&#xff0c;是否有能做到…

windows系统安装指定的vue/cli、node和npm;vue/cli脚手架搭建项目所涉及的vue/cli、node、npm依赖版本等问题

文章目录 前言一、安装vue/cli脚手架1.安装指定版本脚手架&#xff0c;我是用的3.12.0版本2.查看版本是否安装成功&#xff0c;成功有版本号2.1问题&#xff1a;安装失败2.2解决方案2.3 安装成功 二、安装指定node和npm1.为什么需要安装指定node和npm版本&#xff0c;同时匹配v…

【mysql】—— 表的操作

前言&#xff1a; 在上期中&#xff0c;我们把 mysql 中库的基本操作进行了相应的讲解。本期&#xff0c;我将给大家讲解的是关于mysql 中表的基本操作。 目录 &#xff08;一&#xff09;创建表 &#xff08;二&#xff09;查看表结构 1、DESCRIBE 方式 2、SHOW CREATE TA…

Data Structure, Algorithm,and Applications in C++

在学习这本书进阶内容之前&#xff0c;我们可以跟着它的第一章部分再巩固和复习。本书由Sartaj Sahni撰写&#xff0c;由王立柱和刘志红翻译。全书通俗易懂&#xff0c;内容丰富&#xff0c;是巩固C内容的不二选择。希望本文对各位有所帮助。 目录 1.函数与参数 1.1.传值参数…

【备考2023年CISSP认证考试学习手册,信息系统安全在职人员日常参考指南——《CISSP信息系统安全专家认证All-in-One(第9版)》】

《CISSP信息系统安全专家认证All-in-One(第9版)》针对最新发布的CISSP考试做了全面细致的修订和更新&#xff0c;涵盖(ISC)2新开发的2021 CISSP考试大纲的所有目标。这本综合性权威指南编排精当&#xff0c;每章开头列出学习目标&#xff0c;正文中穿插考试提示&#xff0c;章末…

精准测试之分布式调用链底层逻辑

目录 前言&#xff1a; ⼀、分布式调⽤链系统概述 分布式架构所带来的问题 分布式链路监控的作用 ⼆、调用链系统的演进 链路监控系统列表 三、调用链系统的底层实现逻辑 调用链系统的本质 调用链基本元素 事件捕捉 事件串联 事件的开始与结束 上传 四、Span 内容…