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_task
     xTaskCreate( (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创建任务task1
       xTaskCreate( (TaskFunction_t)    task1,               //函数地址
                   (char *)            "task1",              //函数名称
                   (uint16_t)         TASK1_SIZE,            //栈大小
                   (void *)           NULL,                  //传递给任务函数参数
                   (UBaseType_t)      TASK1_PRIO,            //任务优先级
                   (TaskHandle_t *)   &g_task1_handler );    //任务句柄
    
    
    //3.3 删除任务start_task
     vTaskDelete(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");
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第三代半导体材料-碳化硅(SiC)详述

SiC产业概述 碳化硅(SiC)是第三代半导体材料的典型代表。 什么是半导体? 官话来说,半导体指常温下导电性能介于导体与绝缘体之间的材料。 但导电性能的强弱,并非是体现半导体材料价值的最直观属性,半导…

ARM CCA机密计算软件架构之软件堆栈概述

Arm CCA平台通过硬件添加和固件组件的混合方式实现,例如在处理元素(PEs)中的RME以及特定的固件组件,特别是监视器和领域管理监视器。本节介绍Arm CCA平台的软件堆栈。 软件堆栈概述 领域VM的执行旨在与Normal world(正常世界)隔离,领域VM由Normal world Host(正常世界…

TypeError: control character ‘delimiter‘ cannot be a newline (`\r` or `\n`)

报错 找到错误代码 这个错误是因为在使用 numpy.loadtxt() 函数时尝试将换行符(\n)作为分隔符(delimiter)。然而,换行符是用于标识文本文件中每一行的结束,而不是用于分隔数据字段。 解决 如果你的数据文…

项目记录:利用Redis实现缓存以提升查询效率

一、概述 当我们查询所有数据时,如果缓存中没有,则去数据库查询,如果有,直接查缓存的数据就行。注意定期更新缓存数据。 二、主体代码 private static final String ROOM_SCHEDULES_HASH "RoomSchedules";Overridepu…

【进阶】【JS逆向爬虫】【1.JavaScript 基础语法】初始JavaScript

JS逆向爬虫 初始JavaScript1.JavaScript 概述2.JavaScript 的作用3.浏览器执行 JS 简介4.JS 的组成ECMAScriptDOM ——文档对象模型BOM ——浏览器对象模型 5.JavaScript 运行过程 初始JavaScript 1.JavaScript 概述 Java是世界上最流行的语言之一,是一种运行在客…

如何高效查询文件:Linux 下的多种方法详解

如何高效查询文件:Linux 下的多种方法详解 在日常工作中,我们经常需要查找文件,无论是寻找特定的代码文件、配置文件还是其他文档。Linux 提供了多种强大的命令和工具,通过巧妙地使用管道符,我们可以将这些命令组合起来…

线程的6个状态(应该能应付一下考试)

如果你是一个拉面店的老板,员工是cpu资源,顾客是线程 一天中午,你的拉面店人很多,总共6个后厨全都在工作,此时: 来了一名顾客,这位顾客坐在位置玩手机 1.由于这位顾客没有下单,可能…

[设计模式 Go实现] 创建型~简单工厂模式

go 语言没有构造函数一说,所以一般会定义NewXXX函数来初始化相关类。 NewXXX 函数返回接口时就是简单工厂模式,也就是说Golang的一般推荐做法就是简单工厂。 代码实现 package simplefactoryimport "fmt"//API is interface type API interf…

Python+OpenGL绘制3D模型(九)完善插件功能: 矩阵,材质,法线

系列文章 一、逆向工程 Sketchup 逆向工程(一)破解.skp文件数据结构 Sketchup 逆向工程(二)分析三维模型数据结构 Sketchup 逆向工程(三)软件逆向工程从何处入手 Sketchup 逆向工程(四&#xf…

gulimall-002 分布式基础概念

1、微服务概念 微服务是一种非常流行的架构风格。 拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。 每个服务运行在自己的单个进程使用轻量级机制通信可以使用不同的编程语言编写以及不同的数据存储技术 2、集群&分布式&…

力扣:63. 不同路径 II(动态规划)

题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那…

14个强大的JS库

文章目录 一、前言二、Handsontable:高效的数据网格处理库2.1、数据绑定和验证2.2、过滤和排序2.3、文件导出2.4、多框架兼容性2.5、丰富的附加功能2.6、GitHub受欢迎程度 三、Calendar:全功能可定制日历库3.1、多种视图类型3.2、任务和里程碑管理3.3、鼠…

【报错处理】opencv-3.4.1安装报错 error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]

description 最近在复现ORB-SLAM2的时候配置 opencv-3.4.1的环境, 官网下载的opencv-3.4.1 source文件, 原封不动地解压后按照该指导方法安装和编译, 在make的过程中, 出现了编译错误 (截图忘记了),具体报错如下: error: invalid conversion from ‘const char*’ …

【Linux操作系统】探秘Linux奥秘:用户、组、密码及权限管理的解密与实战

🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS &…

2023年03月09日_谷歌视觉语言模型PaLM-E的介绍

自从最近微软凭借OpenAI 和ChatGPT火了一把之后呢 老对手Google就总想着扳回一局 之前发布了硬刚ChatGPT的Bard 但是没想到翻车了 弄巧成拙 所以呢Google这一周又发了个大招 发布了史上最大的视觉语言模型PaLM-E 这个模型有多夸张呢 参数量高达5,620亿 是ChatGTP-3的三…

[spark] SaveMode

https://spark.apache.org/docs/latest/api/java/index.html?org/apache/spark/sql/SaveMode.html Overwrite 覆盖模式是指将DataFrame保存到数据源时,如果数据/表已经存在,则现有数据将被DataFrame的内容覆盖。 注意: Overwrite 模式会覆盖已存在的表…

9种卷积注意力机制创新方法汇总,含2024最新

今天咱们来聊聊卷积注意力机制。 相信各位在写论文的时候都苦恼过怎么更好地改模型,怎么更高效地提高模型的性能和泛化能力吧?我的建议是,不妨考虑考虑卷积注意力。 卷积注意力机制是一种通过关注输入数据中的不同部分来改进模型性能的方法…

《Linux系统与网络管理》复习题库---shell编程题

1、shell 编程题:在根目录下有四个文件 m1.c,m2.c,m3.c,m4.c,用 Shell 编程,实现自动创建 m1,m2,m3,m4 四个目录,并将 m1.c,m2.c,m3.c,m4.c 四个文件分别剪贴到各自相应的目录下。 #!/bin/bash…

Termius for Mac/Win:一站式终端模拟器、SSH 和 SFTP 客户端软件的卓越选择

随着远程工作和云技术的普及,对于高效安全的远程访问和管理服务器变得至关重要。Termius,一款强大且易用的终端模拟器、SSH 和 SFTP 客户端软件,正是满足这一需求的理想选择。 Termius 提供了一站式的解决方案,允许用户通过单一平…

英语长难句分享第十五天解析

群公告 长难句分享第十五天解析 【词汇】: • mispredict [ˌmɪsprɪˈdɪkt] v. 错误预测 • mechanical [məˈknɪkl] adj. 机械的 • everyday [ˈevrideɪ] adj. 日常的 • helicopter [ˈhelɪkɑːptər] n. 直升机 • eventually [ɪˈventʃuəli] adv. …