【FreeRTOS-列表和列表项】

参照正点原子以及以下gitee笔记整理本博客,并将实验结果附在文末。
https://gitee.com/xrbin/FreeRTOS_learning/tree/master

一、列表和列表项的简介(熟悉)

1、什么是列表

答:列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。

2、什么列表项

答:列表项就是存放在列表中的项目。

3、列表和列表项关系

答:列表相当于链表,列表项相当于节点,FreeRTOS中的列表是一个双向环形链表。
在这里插入图片描述

4、列表(链表)和数组的区别

答:
在这里插入图片描述

  • 列表的特点:列表项间的地址非连续的,是人为的连接到一起的。列表项的数目是由后期添加或删除的个数决定的,随时可以改变。
  • 数组的特点:数组成员地址是连续的,数组在最初确定了成员数量后,后期将无法改变。

5、OS中为什么使用列表

答:在OS中任务的数量是不确定的,并且任务状态是会发生改变的,所以非常适用列表(链表)这种数据结构。

6、列表结构体介绍

答:有关列表的东西均在文件list.c和list.h中,以下是列表结构体:
在这里插入图片描述

  1. 在结构体中,包含两个宏(listFIRST_LIST_INTEGRITY_CHECK_VALUE 和 listSECOND_LIST_INTEGRITY_CHECK_VALUE),这两个宏是确定的已知常量,FreeRTOS通过检查这两个常量的值,来判断列表的数据在程序运行过程中,是否遭到破坏,该功能一般用于测试,默认是不开启的(我们一般不用去理会)。
  2. 成员uxNumberOfltems,用于记录列表中的列表项的个数(不包括xListEnd)。
  3. 成员pxIndex用于指向列表中的某个列表项,一般用于遍历列表中的所有列表项。
  4. 成员变量xListEnd是一个迷你列表项,排在最末尾。

列表结构示意图:
在这里插入图片描述

7、列表项结构体介绍

答:列表项是列表中用于存放数据的地方,在list.h文件中,列表项的相关结构体定义:
在这里插入图片描述
成员变量xItemValue为列表项的值,这个值多用于按升序对列表中的列表项进行排序。
在这里插入图片描述

  1. 成员变量pxNext和pxPrevious分别用于指向列表中列表项的下一个列表项和上一个列表项。
  2. 成员变量pxOwner用于指向包含列表项的对象(通常是任务控制块)。->指向任务
  3. 成员变量pxContainer用于指向列表项所在列表(就绪,阻塞和挂起)。->指向列表,代表什么状态

列表项结构体示意图:
在这里插入图片描述

8、迷你列表项

答:迷你列表项也是列表项,但迷你列表项仅用于标记列表的末尾挂载其他插入列表中的列表项
在这里插入图片描述

  1. 成员变量xItemValue为列表项的值,这个值多用于按升序对列表中的列表项进行排序。
  2. 成员变量pxNext和pxPrevious分别用于指向列表中列表项的下一个列表项和上一个列表项。
  3. 迷你列表项只用于标记列表的末尾和挂载其他插入列表中的列表项,因此不需要成员变量pxOwner和pxContainer,以节省内存开销。

迷你列表项示意图:
在这里插入图片描述

9、列表和列表项关系事例

答:

列表初始状态:

列表项数目、指向某一个列表项和末尾列表项
在这里插入图片描述
在这里插入图片描述
列表插入(挂在)两个列表项:
在这里插入图片描述
在这里插入图片描述
列表当前状态:
在这里插入图片描述

二、列表相关的API函数介绍(掌握)

1、列表API函数

答:

在这里插入图片描述

2、初始化列表函数vListInitialise()

答:
在这里插入图片描述
函数参数:
在这里插入图片描述
列表初始化后示意图:
在这里插入图片描述

3、初始化列表项函数vListInitialiseItem()

答:
在这里插入图片描述
函数参数:
在这里插入图片描述
列表初始化后示意图:
在这里插入图片描述

4、列表插入列表项函数vListInsert()

答:此函数用于将待插入列表的列表项按照列表项值升序进行排序,有序地插入到列表中 。

目的:pxNewListItem列表项插入到pxList列表中。

portMAX_DELAY = 0xFFFFFFFF
在这里插入图片描述
函数参数:
在这里插入图片描述
总结:函数vListInsert(),是将插入列表的列表项按照列表项值升序进行排列,有序地插入到列表中。

例子:插入值为40的列表项
1、初始状态

在这里插入图片描述

2、插入一个新的列表项

在这里插入图片描述

在前一个基础上插入60的列表项

在这里插入图片描述
在前一个基础上插入50的列表项
在这里插入图片描述
总结:函数vListInsert(),是将待插入列表的列表项按照列表项值升序进行排序,有序地插入到列表中。列表项数值越大,列表项插入的位置越靠后

5、列表末尾插入列表项vListInsertEnd()

答:此函数用于将待插入列表的列表项插入到列表 pxIndex 指针指向的列表项前面,是一种无序的插入方法。
在这里插入图片描述
函数参数:
在这里插入图片描述

例子1

p指向end,列表中已有列表项1,此时插入列表项2
在这里插入图片描述

例子2

p指向end,列表中有列表项1(40),要插入列表项2(30)
在这里插入图片描述
在这里插入图片描述

例子3

p指向1,列表中有列表项1(40),要插入列表项2(30)
在这里插入图片描述
在这里插入图片描述

总结

函数vListInsertEnd(),是将待插入的列表项插入到列表 pxIndex 指针指向的列表项前面; 它是一种无序的插入方法!!

6、列表项移除函数uxListRemove()

答:此函数用于将列表项从列表项所在列表中移除。
在这里插入图片描述函数参数:
在这里插入图片描述
函数返回值:
在这里插入图片描述
删除过程:若要删除2,那么3_previous->1,1_next->3
在这里插入图片描述
如果P指向2(要删除的对象),那么P需要重新指向2的上一个1
在这里插入图片描述

例子1

在这里插入图片描述
在这里插入图片描述

三、列表项的插入和删除实验(掌握)

实验简介

在这里插入图片描述

实验现象

在撸代码前先确认代码是否正常运行

/* 任务一 实现LED0每500ms翻转一次*/
void task1(void * pvParameters)
{while(1){printf("task1!!!\r\n");LED0_TOGGLE();vTaskDelay(500);}
}/* 任务二 调用列表和列表项相关API函数,插入和删除,并且通过串口输出相应的信息,进行观察 */
void task2(void * pvParameters)
{while(1){printf("task2!!!\r\n");vTaskDelay(500);}
}

可通过观察LED0是否闪烁和是否正确打印串口信息得到。

升序插入列表项

第二步:打印列表和其他列表项的地址
在这里插入图片描述
第三步:列表项1插入列表
在这里插入图片描述
由第二步和第三步可知,列表项一和末尾列表项互指。

第四步:列表项2插入列表
在这里插入图片描述
实验结果与预期结果相同!
在这里插入图片描述
第五步:列表项3插入列表
在这里插入图片描述

移除列表项2,60

在这里插入图片描述
在这里插入图片描述

末尾插入

主要取决于pxIndex所指向的列表项,末尾插入在所指向列表项前一个。

当pxIndex指向末尾列表项
	/* 第七步:列表末尾添加列表项2 */printf("\r\n/****************第七步:列表末尾添加列表项2****************/\r\n");vListInsertEnd((List_t*     )&TestList,     /* 列表 */(ListItem_t* )&ListItem2);   /* 列表项 */printf("项目\t\t\t\t地址\r\n");printf("TestList->pxIndex\t\t0x%p\r\n", TestList.pxIndex);printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem1.pxNext));printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem2.pxNext));printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem3.pxNext));printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem1.pxPrevious));printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem2.pxPrevious));printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem3.pxPrevious));printf("/************************实验结束***************************/\r\n");

预期结果是回到移除列表项2前的实验现象。

在这里插入图片描述

当pxIndex指向列表项1
	/* 第七步:列表末尾添加列表项2 */printf("\r\n/****************第七步:列表末尾添加列表项2****************/\r\n");TestList.pxIndex = &ListItem1;  /* 在插入列表前改变pxIndex指向的列表项 */vListInsertEnd((List_t*     )&TestList,     /* 列表 */(ListItem_t* )&ListItem2);   /* 列表项 */printf("项目\t\t\t\t地址\r\n");printf("TestList->pxIndex\t\t0x%p\r\n", TestList.pxIndex);printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem1.pxNext));printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem2.pxNext));printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem3.pxNext));printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem1.pxPrevious));printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem2.pxPrevious));printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem3.pxPrevious));printf("/************************实验结束***************************/\r\n");

在删除列表项2的前提下,末尾插入列表项2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【c++】【STL】queue详解

目录 queue的作用什么是容器适配器queue的接口构造函数emptysizefrontback queue类的实现 queue的作用 queue是stl库提供的一种容器适配器,也就是我们数据结构中学到的队列,是非常常用的数据结构,特点是遵循LILO(last in last ou…

【一】 基本概念与应用领域【数字图像处理】

考纲 文章目录 1 概念2005甄题【名词解释】2008、2012甄题【名词解释】可考题【简答题】可考题【简答题】 2 应用领域【了解】2.1 伽马射线成像【核医学影像】☆2.2 X射线成像2.3 紫外波段成像2.4 可见光和红外波段成像2.5 微波波段成像2.6 无线电波段成像2.7 电子显微镜成像2…

RAG技术完全指南(一):检索增强生成原理与LLM对比分析

RAG技术完全指南(一):检索增强生成原理与LLM对比分析 文章目录 RAG技术完全指南(一):检索增强生成原理与LLM对比分析1. RAG 简介2. 核心思想3. 工作流程3.1 数据预处理(索引构建)3.2…

对计网考研中的信道、传输时延、传播时延的理解

对计网考研中的信道、传输时延、传播时延的理解 在学习数据链路层流量控制和可靠传输那一节的三个协议的最大信道利用率时产生的疑惑 情景: 假如A主机和B主机通过集线器连接,A和集线器是光纤连接,B和集线器也是光纤连接,A给B发…

【2025五一数学建模竞赛C题】社交媒体平台用户分析问题|建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析&#xff0c…

使用 Spring Boot Actuator 实现应用实时监控

1. 引言 1.1 什么是 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的一组生产级功能模块,用于帮助开发者对 Spring Boot 应用进行监控和管理。它提供了一系列 REST API 端点(Endpoints),可以获取应用程序的运行状态、健康检查、度量指标等信息。 这些…

2025MathorCup数学应用挑战赛B题

目录 模型建立与求解 1.问题一的模型建立与求解 1.1 搬迁补偿模型设计 1.2 住户是否搬迁的应对策略与分析 1.3 定量讨论 2.问题二的模型建立与求解 2.1 搬迁方案模型的优化介绍 2.2 模型的评估 2.3 模型结果 3.问题三的模型建立与求解 3.1 拐点存在性分析模型的建立 3.2 模型的…

西门子数字化研发设计制造一体化规划案例P87(87页PPT)(文末有下载方式)

资料解读:《西门子数字化研发设计制造一体化规划案例》 详细资料请看本解读文章的最后内容。 该文档围绕西门子为企业打造的智能化制造研发工艺生产一体化平台规划方案展开,全面阐述了从业务现状分析到项目实施及案例分享的整个过程。 业务现状与需求分析…

stm32基础001(串口)

文章目录 通信的基本概念串行通信和并行通信单工,半双工和全双工串口的硬件连接 stm32的串口原理图CPU的芯片手册stm32串口的库函数实现通过串口实现printf函数使用中断实现串口的接收 通信的基本概念 串行通信和并行通信 串行通信一个方向只有一个数据通道&#x…

【验证技能】文档要求和好文档注意点

项目文档 产品场景分析; 产品规格需求:OR; 项目设计需求:DR; 业务文档:学发材料; 计划 项目执行计划,设计计划,验证计划,一~四级计划; 一级计…

使用 CarrierWave 通过 AWS S3上传文件到阿里云 OSS

虽然阿里云 OSS 与 AWS S3 兼容,但需要使用阿里云的特定端点进行配置。CarrierWave 是一个流行的 Ruby 文件上传库,可以方便地与 AWS S3 集成。以下是配置和使用方法: 1. 安装必要的 gem 首先,在 Gemfile 中添加以下 gem&#x…

上位机知识篇---流水线执行

文章目录 前言前言 本文简单介绍了流水线. 基本概念 流水线(Pipeline) 是一种通过将任务分解为多个子任务(阶段),并让不同子任务并行执行以提高效率的技术。其灵感来源于工业流水线,每个阶段专注于特定操作,多任务在不同阶段重叠执行,从而提升整体吞吐率(Throughput)…

第三部分:赋予网页灵魂 —— JavaScript(下)

目录 7 DOM 操作:控制网页的"智能面板7.1 小例子:点击按钮时改变段落文字,根据用户输入改变图片7.2 练习:实现一个简单的 Tab 切换效果 8 事件处理:响应用户的"指令"8.1 小例子:实现点击按钮…

芯片软错误概率探究:基于汽车芯片安全设计视角

摘要: 本文深入剖析了芯片软错误概率问题,结合 AEC-Q100 与 IEC61508 标准,以 130 纳米工艺 1Mbit RAM 芯片为例阐述其软错误概率,探讨汽车芯片安全等级划分及软错误对汽车关键系统的影响,分析先进工艺下软错误变化趋势…

嵌入式AI还是一片蓝海

发现其实还是挺多人关注嵌入式和人工智能交叉领域的,随便一个问题,浏览量就27万了,但是这方面的内容确实少得可怜……所以干脆我自己来补点干货。 推荐一本最近很热门的新书——《边缘人工智能:用嵌入式机器学习解决现实问题》。 …

Linux 怎么安装 Oracle Java 8

在 Linux 系统上安装 Oracle Java 8 的步骤如下: 1. 下载 Oracle Java 8 访问 Oracle 官方网站的 Java 下载页面: 下载链接:Oracle Java 8 下载页面选择适合 Linux x64 的安装包(通常是 .tar.gz 格式)。需要登录 Or…

nginx配置集群服务器中的tcp负载均衡器

文章目录 前言1. Ubuntu下nginx安装2. nginx的tcp负载配置 前言 假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。首先想到的是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题。但是单台机…

【音视频】RTMP流媒体服务器搭建、推流拉流

服务器:SRS(Simple RTMP Server,⽀持RTMP、HTTP-FLV,HLS) 推流端:ffmpeg OBS 拉流端:ffplay VLC srs播放器 1 安装和测试srs流媒体服务器 1.1 安装srs流媒体服务器 srs官⽹:https://github.com/ossrs/…

数据治理与数据管理:定义之辩和责任外包的边界

数据治理与数据管理:定义之辩和责任外包的边界 最近,在数据领域的技术交流中,一位朋友探讨了两个很有意思的问题。这两个问题非常典型,也反映了大家在实际工作和学习中常会遇到的困惑:一是关于“数据管理”和“数据治…

Linux 命令如何同时支持文件参数与管道输入?

文章目录 Linux 命令如何同时支持文件参数与管道输入?命令输入方式与管道机制概述常见输入控制方式常见使用示例程序实现思路:统一处理输入的方式判定输入来源的基本模式为何命令应支持参数与标准输入? GNU Coreutils wc 源码解析&#xff1a…