FreeRTOS列表与列表项相关知识总结以及列表项的插入与删除实战

1.列表与列表项概念及结构体介绍

1.1列表项简介

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

1.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;
列表结构体示意图
在这里插入图片描述
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;
2)迷你结构体
迷你列表项也是列表项,但迷你列表项仅用于标记列表的末尾和挂载其他插入列表中的列表项
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;

2.列表相关API函数介绍

1)void vListInitialise(List_t * const pxList)
形参:pxList 待初始化列表项
描述:初始化列表,pxIndex 指向 xListEnd,xListEnd为oxFFFFFF
2)void vListInitialiseItem( ListItem_t * const pxItem )
形参: pxItem 带初始化列表项
描述: 初始化列表项,列表项所在列表为空,pxItem->pxContainer = NULL
3void vListInsertEnd ( List_t * const pxList , ListItem_t * const pxNewList)
形参:pxList 列表
pxNewListItem 待插入列表项 ,,无序的插入方法
描述:列表末尾插入列表项
4)void vListInsert ( List_t * const pxList , ListItem_t * const pxNewListItem )
形参:pxList 列表
pxNewListItem 待插入列表项
描述: 列表插入列表项,有序地插入到列表中
5)UBaseType_t uxListRemove ( ListItem_t * const pxItemToRemove )
形参:pxItemToRemove 待移除列表项
返回值:整数: 待移除列表项移除后,所在列表剩余列表项的数量
描述:列表移除列表项

3,列表项的插入和删除实验free_

3.1freertos_demo.h

#ifndef __FREERTOS_DEMO_H
#define __FREERTOS_DEMO_H//定义freeRTOS实验函数
void freertos_demo(void);#endif

3.1freertos_demo.c


#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"///******************************************************************************************************/
//1.定义start_task配置与task任务配置以及声明列表项1.2.3
//1.1 start_task任务配置、包括栈大小、任务优先级、任务句柄以及start_task()函数定义
#define START_TASK_PRIO            1
#define START_STK_SIZE           128
TaskHandle_t  g_start_task_handler;
void start_task(void* pvParameters);//1.2 task1任务配置
#define TASK1_PRIO                 2
#define TASK1_SIZE               128
TaskHandle_t  g_task1_handler;
void task1(void* pvParameters);//1.3 列表与列表项1、2、3声明
List_t           test_list;
ListItem_t     list_item1;
ListItem_t     list_item2;
ListItem_t     list_item3;//2.创建freertos_demo()函数,在此函数中创建start_task任务,并开始任务调度
void freertos_demo(void)
{//2.1创建任务satrt_taskxTaskCreate( (TaskFunction_t)    start_task,                //函数地址(char *)           "start_task",              //函数名称(uint16_t)         START_STK_SIZE,            //栈大小(void *)           NULL,                      //传递给任务函数参数(UBaseType_t)      START_TASK_PRIO,           //任务优先级(TaskHandle_t *)   &g_start_task_handler );   //任务句柄//2.2 开启任务调度器vTaskStartScheduler();
}//3.创建start_task()函数中创建任务task1,并删除start_task任务
void start_task(void* pvParameters)
{//3.2 设置临界代码保护taskENTER_CRITICAL();//3.1创建任务task1xTaskCreate( (TaskFunction_t)    task1,               //函数地址(char *)            "task1",              //函数名称(uint16_t)         TASK1_SIZE,            //栈大小(void *)           NULL,                  //传递给任务函数参数(UBaseType_t)      TASK1_PRIO,            //任务优先级(TaskHandle_t *)   &g_task1_handler );    //任务句柄//3.3 删除任务start_taskvTaskDelete(g_start_task_handler);taskEXIT_CRITICAL();}//4.在task1()函数中进行列表项与列表项的初始化、地址打印、插入与删除
void task1(void* pvParameters)
{//4.1 初始化列表和列表项的地址vListInitialise(&test_list);vListInitialiseItem(&list_item1);vListInitialiseItem(&list_item2);vListInitialiseItem(&list_item3);//4.2打印列表和各列表项的地址printf("/**************第二步:打印列表和列表项的地址**************/\r\n");printf("项目\t\t\t地址\r\n");printf("test_list\t\t0x%p\t\r\n", &test_list);printf("test_list->pxIndex\t0x%p\t\r\n", test_list.pxIndex);printf("test_list->xListEnd\t0x%p\t\r\n", (&test_list.xListEnd));printf("list_item1\t\t0x%p\t\r\n", &list_item1);printf("list_item2\t\t0x%p\t\r\n", &list_item2);printf("list_item3\t\t0x%p\t\r\n", &list_item3);printf("/**************************结束***************************/\r\n");//4.3设置key0,插入列表项1,2,3,打印列表及列表项地址printf("按下KEY0键继续!\r\n\r\n\r\n");while(key_scan(0) != KEY0_PRES){vTaskDelay(10);}printf("/**************第三步:插入列表项1,2,3打印列表和列表项的地址**************/\r\n");vListInsert(&test_list,&list_item1);vListInsert(&test_list,&list_item2);vListInsert(&test_list,&list_item3);printf("项目\t\t\t\t地址\r\n");printf("test_list->xListEnd->pxNext\t0x%p\r\n", (test_list.xListEnd.pxNext));printf("test_list->xListEnd->pxPrevious\t0x%p\r\n", (test_list.xListEnd.pxPrevious));printf("list_item1->pxNext\t\t0x%p\r\n",     (list_item1.pxNext));printf("list_item1->pxPrevious\t\t0x%p\r\n", (list_item1.pxPrevious));printf("list_item2->pxNext\t\t0x%p\r\n",     (list_item2.pxNext));printf("list_item2->pxPrevious\t\t0x%p\r\n", (list_item2.pxPrevious));printf("list_item3->pxNext\t\t0x%p\r\n",     (list_item3.pxNext));printf("list_item3->pxPrevious\t\t0x%p\r\n", (list_item3.pxPrevious));printf("/**************************结束***************************/\r\n");//4.4设置key0,删除列表项2,打印列表及列表项地址printf("按下KEY0键继续!\r\n\r\n\r\n");while(key_scan(0) != KEY0_PRES){vTaskDelay(10);}printf("/*******************第六步:移除列表项2********************/\r\n");uxListRemove(&list_item2);printf("项目\t\t\t\t地址\r\n");printf("test_list->xListEnd->pxNext\t0x%p\r\n", (test_list.xListEnd.pxNext));printf("test_list->xListEnd->pxPrevious\t0x%p\r\n", (test_list.xListEnd.pxPrevious));printf("list_item1->pxNext\t\t0x%p\r\n", (list_item1.pxNext));printf("list_item1->pxNext\t\t0x%p\r\n", (list_item1.pxNext));printf("list_item3->pxPrevious\t\t0x%p\r\n", (list_item3.pxPrevious));printf("list_item3->pxPrevious\t\t0x%p\r\n", (list_item3.pxPrevious));printf("/**************************结束***************************/\r\n");//4.5设置key0,尾插法插入列表项3,打印列表及列表项地址printf("按下KEY0键继续!\r\n\r\n\r\n");while(key_scan(0) != KEY0_PRES){vTaskDelay(10);}printf("/*******************第六步:尾差法插入列表项2********************/\r\n");vListInsertEnd(&test_list,&list_item2);printf("项目\t\t\t\t地址\r\n");printf("test_list->xListEnd->pxNext\t0x%p\r\n", (test_list.xListEnd.pxNext));printf("test_list->xListEnd->pxPrevious\t0x%p\r\n", (test_list.xListEnd.pxPrevious));printf("list_item1->pxNext\t\t0x%p\r\n", (list_item1.pxNext));printf("list_item1->pxNext\t\t0x%p\r\n", (list_item1.pxNext));printf("list_item3->pxPrevious\t\t0x%p\r\n", (list_item3.pxPrevious));printf("list_item3->pxPrevious\t\t0x%p\r\n", (list_item3.pxPrevious));printf("list_item2->pxPrevious\t\t0x%p\r\n", (list_item2.pxPrevious));printf("list_item2->pxPrevious\t\t0x%p\r\n", (list_item2.pxPrevious));printf("/**************************结束***************************/\r\n");
}

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

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

相关文章

List常见方法和遍历操作

List集合的特点 有序: 存和取的元素顺序一致有索引:可以通过索引操作元素可重复:存储的元素可以重复 List集合的特有方法 Collection的方法List都继承了List集合因为有索引,所以有了很多操作索引的方法 ublic static void main…

挑战 ChatGPT 和 Google Bard 的防御

到目前为止,科学家已经创建了基于人工智能的聊天机器人,可以帮助内容生成。我们还看到人工智能被用来创建像 WormGPT 这样的恶意软件,尽管地下社区对此并不满意。但现在正在创建聊天机器人,可以使用生成人工智能通过即时注入活动来…

OpenHarmony之分布式软总线

背景概述 从之前的文档(OpenHarmony之内核层)可知 分布式软总线是多设备终端的统一基座,为设备间的无缝互联提供了统一的分布式通信能力,能够快速发现并连接设备,高效地传输任务和数据。 分布式软总线实现近场设备间统一的分布式通信管理能…

代码随想录刷题第三十四天| 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果

代码随想录刷题第三十四天 K次取反后最大化的数组和 (LC 1005) 题目思路: 代码实现: class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:nums.sort(keylambda x: abs(x), reverseTrue)for i in range(len(nums…

8868体育助力意甲罗马俱乐部 迪巴拉有望付出

8868体育助力意甲罗马俱乐部 迪巴拉有望付出 意甲罗马俱乐部是8868体育合作球队之一,本赛季,在意甲第14轮的比赛中,罗马客场2-1战胜萨索洛,积分上升到意甲第4位。 有报道称,迪巴拉在对阵佛罗伦萨的比赛中受伤&#xff…

网络Ping不通故障定位思路

故障分析 Ping不通是指Ping报文在网络中传输,由于各种原因(如链路故障、ARP学习失败等)而接收不到所有Ping应答报文的现象。 如图1-1所示,以一个Ping不通的尝试示例,介绍Ping不通故障的定位思路。 图1-1 Ping不通故…

在机器学习训练测试集中,如何切分出一份验证集

文章目录 1.读取数据:2.绘图查看target数量情况:3.特征拓展:4.构建X,y:5.拆分训练集和测试集,特征做缩放处理:6.从训练集里再切一次出验证集,特征做缩放处理:7.测试集训练…

Shell基本命令 Mkdir创建 cp 复制 ls-R递归打印 文件权限

mkdir 是在命令行界面下创建目录(文件夹)的命令。它是 “make directory” 的缩写。 以下是 mkdir 命令的基本语法: mkdir 目录路径其中,目录路径 是要创建的目录的路径和名称。 例如,要在当前目录下创建一个名为 m…

Java介绍

Java 是一门纯粹的面向对象编程语言,它吸收了C的各种优点,还努力摒弃了C里难以理解的多继承、指针等概念,真正地实现了面向对象理论,因而具有功能强大和简单易用两个特征。 除了基础语法之外,Java还有许多必须弄懂的特…

OpenCV-Python(22):直方图的计算绘制与分析

目标 了解直方图的原理及应用使用OpenCV 或Numpy 函数计算直方图使用Opencv 或者Matplotlib 函数绘制直方图学习函数cv2.calcHist()、np.histogram()等 原理及应用 直方图是一种统计图形,是对图像的另一种解释,用于表示图像中各个像素值的频次分布。直…

sklearn 中matplotlib编制图表

代码 # 导入pandas库,并为其设置别名pd import pandas as pd import matplotlib.pyplot as plt# 使用pandas的read_csv函数读取名为iris.csv的文件,将数据存储在iris_data变量中 iris_data pd.read_csv(data/iris.txt,sep\t)# 使用groupby方法按照&quo…

人机交互中信息数量与质量

在人机交互中,信息的数量和质量都是非常重要的因素。 信息的数量指的是交互过程中传递的信息的多少。信息的数量直接影响到交互的效率和效果,如果交互中传递的信息量太少,可能导致交互过程中的信息不足,用户无法得到想要的结果或者…

三菱人机交互GT Designer的使用(二,开关,指示灯,数值显示,数值输入)

今天也开始每日一学,内容为开关,指示灯,数值显示,数值输入,以为这篇文章比较长,所有小编决分为3篇内容写完,谢谢大家阅读,不足之处,欢迎指正。 目录 开关 位&#xff0c…

【UE5蓝图】读取本地json文件修改窗口大小

效果 插件 蓝图 1.判断文件存在 2.1文件不存在,生成文件 {"ResolutionX":540, "ResolutionY":960} 2.2文件存在,直接读取 3.设置窗口大小 遇到的坑 1.分辨率太大,导致效果不理想,建议先往小填写。 2.选对…

JSON 详解

文章目录 JSON 的由来JSON 的基本语法JSON 的序列化简单使用stringify 方法之 replacerstringify 方法之 replacer 参数传入回调函数stringify 方法之 spacestringify 方法之 toJSONparse 方法之 reviver 利用 stringify 和 parse 实现深拷贝 json 相信大家一定耳熟能详&#x…

React Hooks 面试题 | 08.精选React Hooks面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

原生微信小程序如何动态配置主题颜色及如何调用子组件的方法

一、最终效果 二、步骤 1、在初始化进入项目时,获取当前主题色 2、把主题色定义成全局变量(即在app.js中设置) 3、tabBar也需要定义全局变量,在首页时需要重新赋值 三、具体实现 1、app.js onLaunch () {//获取主题数据this.set…

MySQL数据库导入100万数据不同方式的性能差异

本文将介绍MySQL数据库导入100万数据的三种方式性能比较。 三种方式分别为: (1)逐条INSERT (2)批量INSERT提交 (3)通过mysql自带的load data命令 应用场景:假设需要向100万个号码…

gitLab页面打tag操作步骤

作者:moical 链接:gitLab页面打tag简单使用 - 掘金 (juejin.cn) 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ---------------------------------------------------------------------…

RK3568测试tdd

RK3568测试tdd 一、门禁取包二、烧录三、跑tdd用例四、查看结果参考资料 一、门禁取包 右键复制链接,粘贴下载;解压到文件夹; 二、烧录 双击\windows\RKDevTool.exe打开烧写工具,工具界面击烧写步骤如图所示: 推荐…