FreeRTOS 中 vListInsertEnd 函数详解

        在 FreeRTOS 中,vListInsertEnd 函数用于将新项插入到指定列表的尾部(但实际行为是插入到一个特定的索引位置之前)。FreeRTOS 使用双向链表(doubly linked list)来管理任务和其他系统对象,这样可以高效地插入、删除和遍历列表。

1. vListInsertEnd 函数源码解析

vListInsertEnd 函数将新项插入到列表中 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 )++;
}

2. 代码详解

  • 获取列表 pxIndex 指向的列表项:

    ListItem_t * const pxIndex = pxList->pxIndex;
    

    pxIndex 是一个指向列表中某一项的指针。该项将作为新项插入位置的参考点。

  • 更新待插入列表项的指针成员变量:

    pxNewListItem->pxNext = pxIndex;
    pxNewListItem->pxPrevious = pxIndex->pxPrevious;
    

       ​​​  新列表项 pxNewListItempxNext 指向 pxIndex,即插入项的下一个项。

   pxNewListItempxPrevious 指向 pxIndex 的前一个项。

  • 更新列表中原本列表项的指针成员变量:

    pxIndex->pxPrevious->pxNext = pxNewListItem;
    pxIndex->pxPrevious = pxNewListItem;

         pxIndex 前一个项的 pxNext 更新为指向 pxNewListItem,这样链表中的前一项就指向了新插入的项。

   pxIndexpxPrevious 更新为 pxNewListItem,因此 pxIndex 的前一项变为新插入的项。

  • 更新待插入列表项的所在列表成员变量:

    pxNewListItem->pxContainer = pxList;

         pxNewListItempxContainer 设置为 pxList,表示该项属于这个列表

  • 更新列表中列表项的数量:

    ( pxList->uxNumberOfItems )++;
    

        列表的项数增加一。

3. 实例分析

以下是 vListInsertEnd 函数的几个示例,以帮助理解其工作原理。

例子 1: 空列表

初始状态:

  • 列表 pxList 为空,pxIndex 指向列表头。
List_t list;
ListItem_t listItem1;// 初始化列表
list.pxIndex = &listItem1;
list.uxNumberOfItems = 0;// 插入新项
vListInsertEnd(&list, &listItem1);

插入后:

  • pxList 现在包含一项 listItem1
  • listItem1pxNextpxPrevious 都指向 listItem1 自己。

例子 2: 已有多个项的列表

初始状态:

  • 列表 pxList 包含 listItem1listItem2pxIndex 指向 listItem2
List_t list;
ListItem_t listItem1, listItem2, listItem3;// 初始化列表
list.pxIndex = &listItem2;
list.uxNumberOfItems = 2;listItem1.pxNext = &listItem2;
listItem1.pxPrevious = &listItem2;listItem2.pxNext = &listItem1;
listItem2.pxPrevious = &listItem1;// 插入新项
vListInsertEnd(&list, &listItem3);

插入后:

  • listItem3 被插入到 listItem2 前。
  • 列表顺序为:listItem1 -> listItem3 -> listItem2

例子 3: 插入到非尾部

初始状态:

  • 列表 pxList 包含 listItem1, listItem2, listItem3pxIndex 指向 listItem2
List_t list;
ListItem_t listItem1, listItem2, listItem3, listItem4;// 初始化列表
list.pxIndex = &listItem2;
list.uxNumberOfItems = 3;listItem1.pxNext = &listItem2;
listItem1.pxPrevious = &listItem3;listItem2.pxNext = &listItem3;
listItem2.pxPrevious = &listItem1;listItem3.pxNext = &listItem1;
listItem3.pxPrevious = &listItem2;// 插入新项
vListInsertEnd(&list, &listItem4);

插入后:

  • listItem4 被插入到 listItem2 前。
  • 列表顺序为:listItem1 -> listItem4 -> listItem2 -> listItem3

4. 适用场景

  • 任务调度:在 FreeRTOS 中,任务可以被插入到就绪任务列表中以表示它们可以运行。
  • 时间管理:延迟任务可以插入到延迟列表中,以便当时间到达时,任务会被恢复。
  • 资源管理:可以用于管理队列、信号量等对象的列表。

  vListInsertEnd 是 FreeRTOS 中用于在列表中插入新项的函数。虽然名称暗示插入到末尾,但实际功能是插入到 pxIndex 指向项的前面。函数通过更新指针来维持双向链表的完整性,同时增加列表项的数量。这种结构使得 FreeRTOS 可以高效管理任务和系统资源,从而确保实时操作系统的高效运行。

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

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

相关文章

前端三件套开发模版——产品介绍页面

今天有空,使用前端三件套html、css、js制作了一个非常简单的产品制作页面,与大家分享,希望可以满足大家应急的需求。本页面可以对产品进行“抢购”、对产品进行介绍,同时可以安排一张产品的高清大图,我也加入了页面的背…

JAVA实现二分查找,斐波那契数列,深度优先搜索详情教程【包含代码】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

react+ts+antd项目搭建

前言: 基于ts语言创建react项目,node版本是v16.14.2 一、 脚手架创建项目 全局安装 npm install -g creacte-react-app创建项目file-management,ts需要添加–template typescript npx create-react-app file-management --template typesc…

Ubuntu查看opencv版本c++

✗命令行中直接输入: pkg-config --modversion opencv✔命令行中直接输入: pkg-config --modversion opencv4注解:附上在markdown中打勾,对号和打叉。使用时将&和#之间的空格去掉,这里只是为了不让CSDN自动转换才…

Ubuntu20.04 c++程序 涉及opencv问题记录

头文件更改 默认的头文件引用是 #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp>但是在ubuntu20中/usr/include中默认的是opencv4&#xff0c;他文件夹里面才是opencv2&#xff0c;需要…

vue3单个页面进行防抖节流

防抖 <template><button id"submitButton" ref"submitButton">GET</button> </template><script lang"ts" setup> import { ref, onMounted } from vue;// 防抖函数 function debounce(func: () > void, dela…

【mybatis】mybatis-plus中Wrapper(查询条件构造器)简介_常用方法

1、简介 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatis-Plus 提供了强大的条件构造器&#xff08;Wrapper&#xff09;&#xff0c;用于构建复杂的 SQL 查询条件&#xff0c;使得我们…

沟通方法和技巧

0 Preface/Foreword 1 沟通对象 沟通维度&#xff1a; upward&#xff0c;向上沟通&#xff0c;直接上级downward&#xff0c;向下沟通&#xff0c;直接下级horizontal&#xff0c;横向沟通&#xff0c;同部门/跨部门同事 2 沟通方式&#xff08;5W2H&#xff09; 对于开会和…

小白尝试某程机票信息爬取

实训课需要机票数据集&#xff0c;网上没有&#xff0c;所以我选择爬取数据 此过程可谓经历的九九八十一难&#xff0c;也参考了不少大佬的文章&#xff0c;在此特别记录一下 弯路不多说&#xff0c;我直接讲成功的方法 找到请求url 通过控制台&#xff0c;最后确认下面的 …

在WordPress中获取10天之内的文章更新数

要在WordPress中获取10天之内的文章更新数&#xff0c;您可以使用以下代码片段。这段代码将显示在过去10天内更新的文章数量。 <?php // 获取当前时间戳 $now time();// 计算10天前的时间戳 $ten_days_ago $now - (10 * 24 * 60 * 60);// 设置查询参数 $args array(pos…

【Spring Boot AOP中切入表达式格式介绍】

文章目录 一、切入表达式简介二、切入表达式的语法1. 方法匹配符示例&#xff1a; 2. 类型匹配符示例&#xff1a; 一、切入表达式简介 切入表达式&#xff08;Pointcut Expression&#xff09;是AOP中定义切入点&#xff08;Pointcut&#xff09;的一种方式。它定义了在哪些连…

基于Java中的SSM框架实现物流管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现物流管理系统演示 摘要 企业的发展离不开物流的运输&#xff0c;在一个大型的企业中&#xff0c;商品的生产和建设&#xff0c;推广只是前期的一些工作&#xff0c;在后期的商品销售和物流方面的建立&#xff0c;才能让一个企业得到大力的发展。 企业…

基于Linux/ARM/单片机利用状态机对多个按键进行扫描实现短按或者长按

1&#xff09;Linux/ARM/单片机入门级按键扫描程序设计&#xff0c;分享给将要学习或者正在学习Linux/ARM/单片机开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 学习Linux/ARM/单片机的同学…

docker部署简单的Kafka

文章目录 1. 拉取镜像2. 运行创建网络运行 ZooKeeper 容器运行 Kafka 容器 3. 简单的校验1. 检查容器状态2. 检查 ZooKeeper 日志3. 检查 Kafka 日志4. 使用 Kafka 命令行工具检查5. 创建和删除测试主题 1. 拉取镜像 选择一组兼容性好的版本。 docker pull bitnami/kafka:3.6…

Facebook:数字社交的引领者与创新者

自2004年诞生以来&#xff0c;Facebook从一个校园网络项目迅速成长为全球最大的社交媒体平台&#xff0c;彻底改变了我们与世界互动的方式。作为数字社交的引领者和创新者&#xff0c;Facebook不仅在技术层面上不断突破&#xff0c;也在社会和文化领域留下了深刻的印记。本文将…

vue2 + element三级菜单实现模板

需求&#xff1a; 需要一个含有三级菜单的结构模板&#xff0c;用于业务快速开发。 解决&#xff1a; sidebar.vue <template><el-menu :default-active"defaultActive" class"el-menu-vertical-demo" active-text-color"#ffd04b"&…

『大模型笔记』2024大模型AI工程师必备技能!

2024大模型AI工程师必备技能! 文章目录 一. 2024大模型AI工程师必备技能!1. 引言:理解如何在各种应用中使用大语言模型(LLM)2. 第1层:Question answering(Q&A)3. 第2层:Chatbot=Q&A+短期记忆(上下文知识)4. 第3层:RAG=Q&A+短期记忆(上下文知识)+长期记忆(外…

【论文解读】CVPR2024:DUSt3R: Geometric 3D Vision Made Easy

论文“”https://openaccess.thecvf.com/content/CVPR2024/papers/Wang_DUSt3R_Geometric_3D_Vision_Made_Easy_CVPR_2024_paper.pdf 代码&#xff1a;GitHub - naver/dust3r: DUSt3R: Geometric 3D Vision Made Easy DUSt3R是一种旨在简化几何3D视觉任务的新框架。作者着重于…

Docker的架构原理

例子可以想象成一个买手机的场景 clien可以想象 你个人 docker deamon &#xff1a;店员 images&#xff1a; 样机 regisitry&#xff1a; 手机仓库 container: 使用的手机 首先我要在店员买一个手机&#xff0c;店员发现是样机&#xff0c;但是仓库有&#xff0c;&…

【SpringBoot3】使用Jasypt加密数据库用户名、密码等敏感信息

一、使用步骤介绍 使用Jasypt&#xff08;Java Simplified Encryption&#xff09;进行数据加密和解密主要涉及几个步骤&#xff0c;包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中&#xff0c;以及应用程序启动时自动解密。以下是详细的使用说明&…