FreeRTOS列表与列表项

news2024/9/29 15:58:31

1.什么是列表与列表项

列表与列表项实际上是FreeRTOS中一个大量使用的一种数据结构

1.列表

列表的概念有点像链表,在 FreeRTOS 中,列表主要用于以下几个方面:

  1. 任务的管理:FreeRTOS 使用列表来管理不同的任务,包括就绪任务列表、阻塞任务列表等。任务列表按任务优先级或其他条件进行排序,以便调度器能够快速选择下一个要执行的任务
  2. 定时器:FreeRTOS 使用列表来管理软件定时器。定时器列表按定时器到期时间排序,这样在系统时钟中断时,可以快速检查是否有定时器到期
  3. 事件管理:FreeRTOS 使用列表来管理事件和资源,如信号量、互斥量等。这些列表有助于跟踪哪些任务在等待某个事件或资源

在list.h种,有如下结构体定义

typedef struct xLIST
{
    listFIRST_LIST_INTEGRITY_CHECK_VALUE      /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
    volatile UBaseType_t uxNumberOfItems;
    ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list.  Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */
    MiniListItem_t xListEnd;                  /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */
    listSECOND_LIST_INTEGRITY_CHECK_VALUE     /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
} List_t;
  • listFIRST_LIST_INTEGRITY_CHECK_VALUE:

这个实际上是一个用于列表完整性检查的一个宏,它的主要作用是帮助检测内存损坏或者意外的列表结构修改。它通常被定义为某个常量值,当 FreeRTOS 创建或修改列表时,会使用这个常量值来设置列表结构中的特定字段。然后,在后续的操作中,FreeRTOS 会检查这些字段的值,以确保列表没有被意外修改或损坏

我们后续编程不需要关心这个宏。

  • uxNumberOfItems

列表中列表项的数量

  • pxIndex:

记录当前列表项的索引号,用于遍历列表

  • xListEnd:

列表中最后一个列表项

2.列表项

列表项(List Item)是一个数据结构,用于在列表(List)中存储和管理信息。每个列表项代表一个节点或单元,可以包含指向其他相关数据的指针

FreeRTOS共有两种列表项,分别是列表项和迷你列表项

1.列表项的结构体定义如下:

struct xLIST_ITEM
{
    listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE           /*不用关心< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
    configLIST_VOLATILE TickType_t xItemValue;          /*实际的数据< The value being listed.  In most cases this is used to sort the list in ascending order. */
    struct xLIST_ITEM * configLIST_VOLATILE pxNext;     /*指向下一个列表项< Pointer to the next ListItem_t in the list. */
    struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*指向前一个列表项< Pointer to the previous ListItem_t in the list. */
    void * pvOwner;                                     /*指向列表项的创建者< Pointer to the object (normally a TCB) that contains the list item.  There is therefore a two way link between the object containing the list item and the list item itself. */
    struct xLIST * configLIST_VOLATILE pxContainer;     /*此列表项所属的列表< Pointer to the list in which this list item is placed (if any). */
    listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE          /*不用关心< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
};
typedef struct xLIST_ITEM ListItem_t;                   /* For some reason lint wants this as two separate definitions. */
  • listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE:

检查列表项完整性

  • xItemValue

列表项值

  • pxNext

指向下一个列表项

  • pxPrevious

指向前一个列表项

  • pvOwner

指向拥有该列表项的对象,列表项用于管理任务时,通常指向该任务的任务控制块(TCB)

  • pxContainer

指向此列表项所属的列表。

注意这个和pvOwner并不冲突,我们在前面讲TCB程序控制块时,TCB有两个列表项,比如说这个状态列表项,当创建一个任务后,这个状态列表项中的pvOwner就指向这个任务的TCB,如果这个任务进入就绪状态后,那么这个状态列表项的pxContainer就指向就绪列表,表明此列表项在就绪列表中。如果程序进入挂起状态后,那么pxContainer就指向挂起列表,表明此列表项在挂起列表中

2.迷你列表项

在某些情况下,我们不需要列表项的所有功能,为了节省资源,我们可以采用迷你列表项,比如我们列表中最后一个列表项的类型就是xMINI_LIST_ITEM类型的迷你列表项,其定义如下:

struct xMINI_LIST_ITEM
    {
        listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
        configLIST_VOLATILE TickType_t xItemValue;
        struct xLIST_ITEM * configLIST_VOLATILE pxNext;
        struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;
    };
  • listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE

检查列表项完整性

  • xItemValue

列表项值

  • pxNext

指向下一列表项

  • pxPrevious

指向上一列表项

2.列表与列表项相关操作

1.列表与列表项初始化

新建列表需要初始化,通过调用函数vListInitialise()完成,列表项也是如此,通过函数vListInitialiseItem()完成。虽然函数的内部构造很复杂,但我们使用起来是叫较为简单的,所以不需要花费太多时间。

2.列表项插入

1)插入

列表项的插入通过函数vListInsert()完成,其函数原型如下

void vListInsert( 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;
        }
        else
        {
    //判断插入的位置

            for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */
            {}
        }

    pxNewListItem->pxNext = pxIterator->pxNext;//列表项的下一节点
    pxNewListItem->pxNext->pxPrevious = pxNewListItem;//列表项的尾节点指向头结点,类似循环列表
    pxNewListItem->pxPrevious = pxIterator;//列表项的上一节点
    pxIterator->pxNext = pxNewListItem;

    pxNewListItem->pvContainer = ( void * ) pxList;//修改列表项的所属者,属于就绪列表、阻塞列表

        ( pxList->uxNumberOfItems )++;//长度加1
}

2)末尾插入

列表项末尾插入通过函数vListInsertEnd()完成,其原型如下,其入参和vListInsert()一样:


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

需要注意的是,这个末尾并不是同学们想象的那样,因为我们列表本身是个环形列表,列表中pxIndex是用来遍历列表的,所以它指向的列表项实际上就是表头,所以新的列表项会插入到pxIndex所指向列表项的前面(即最后遍历),而非插到xListEnd的后面。

3)列表项删除

列表项的删除也比较简单,通过uxListRemove()完成,其函数原型如下,传参只有一个,就是要删除的列表项:

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )

4)遍历

列表中的成员变量pxInedx,FreeRTO提供了函数接口listGET_OWNER_OF_NEXT_ENTRY(),其实现如下:

listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )   

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

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

相关文章

使用Rasterio处理栅格数据——RaterIO介绍

1. 依赖关系 RasterIO 有一个C库依赖项: GDAL >=1.11 。 GDAL 本身依赖于大多数主要操作系统提供的许多其他库,也依赖于非标准 Geos 和 Proj4 库。 Python 包依赖项(另请参见requirements.txt): affine , cligj , click , enum34 , numpy 。 开发还需要(参见 requi…

keil5程序编译没错误魔术棒可以识别芯片但是就是下载报错Error: Flash Download failed - “Cortex-M3“

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、硬件查看是否连接错误二、软件查看芯片包&#xff0c;更新到最新版本三、Debug下载模式选择四、芯片大小选择后记…

07_矩形圆形绘制

import cv2 import numpy as np newImageInfo (600,600,3) dst np.zeros(newImageInfo,np.uint8) # 1 2 左上角 3 右下角 4 5 fill -1 >0 line w cv2.rectangle(dst,(150,380),(350,550),(150,200,100),3) # 2 center 3 r cv2.circle(dst,(250,250),(100),(0,0,255),6) …

Sunbit币昇加密交易所分析加密货币总市值回升突破2.4万亿美元

每经AI快讯&#xff0c;9月27日&#xff0c;据CoinGecko数据&#xff0c;加密货币总市值回升至2.402万亿美元&#xff0c;24小时涨幅达1.1%。 全球历史最悠久的加密货币交易所之一,总部位于旧金山,Sunbit(币昇)Sunbit已荣获美国及加拿大MSB双牌照 ▌贝莱德增持1684枚BTC&#…

考拉悠然亮相天府人工智能大会,共绘AI赋能产业升级新蓝图

9月28日&#xff0c;备受瞩目的天府人工智能大会在成都拉开帷幕。本次大会是电子科技大学联合重要学术团体、政府相关部门、知名高校、科研机构和企事业单位等共同打造的人工智能领域顶尖峰会。 考拉悠然作为电子科技大学在产学研创新应用领域的杰出企业代表&#xff0c;荣幸受…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十二章 Linux 权限管理

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

“领航计划”取得重要阶段性成果,以科创教育推进科学教育高质量发展

党的二十大报告提出“坚持教育优先发展、科技自立自强、人才引领驱动……教育、科技、人才是全面建设社会主义现代化国家的基础性、战略性支撑”&#xff0c;从根本上体现了教育、科技、人才三者之间的关联。创新作为科技发展的根本动力&#xff0c;创新人才的培育之基在学校教…

使用C代码接入并操作PostgreSQL数据库

使用C代码接入并操作PostgreSQL数据库 引言准备工作在Debian/Ubuntu上安装在RedHat/CentOS上安装在Windows上安装编写C程序引入头文件建立连接执行SQL语句处理查询结果关闭连接完整示例编译和运行程序注意事项结论引言 PostgreSQL是一种功能强大的开源对象关系数据库系统,广泛…

TypeError: unsupported operand type(s) for +=: ‘Dense‘ and ‘str‘

tensorflow2.0报这个错误 因为你在定义模型的时候 model Sequential(SimpleRNN(3),Dense(5, activationsoftmax) )是不是感觉少了点什么&#xff0c;没加[] model Sequential([SimpleRNN(3),Dense(5, activationsoftmax)] )

TypeScript 设计模式之【访问者模式】

文章目录 访问者模式&#xff1a;灵活的文件系统扫描器访问者模式的奥秘访问者模式有什么利与弊?如何使用访问者模式来优化你的系统代码实现案例访问者模式的主要优点访问者模式的主要缺点访问者模式的适用场景总结 访问者模式&#xff1a;灵活的文件系统扫描器 假如你正在开…

智能物流行业惨淡,工程师们的“灰色地带”收入揭秘

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 在智能物流行业面临挑战的当下&#xff0c;工程师们除了正职收入外&#xff0c;也在探索各种途径来增加自己的“额外收益”。 这些收入&…

微信小程序环境下的相亲交友系统源码优化

随着移动互联网的迅猛发展&#xff0c;微信小程序因其便捷性和易用性成为众多开发者的选择。在这样一个背景下&#xff0c;相亲交友系统作为连接人与人的桥梁&#xff0c;也逐渐融入到了小程序的生态之中。本文旨在探讨如何在微信小程序环境中优化相亲交友系统的源码&#xff0…

云计算Openstack Cinder

OpenStack Cinder是OpenStack平台中的一个重要组件&#xff0c;它主要提供块存储服务。 一、基本概念 定义&#xff1a;Cinder是OpenStack项目中的一个模块&#xff0c;专注于为云计算环境中的虚拟机提供持久化的块存储服务。功能&#xff1a;Cinder允许用户创建和管理持久化…

前端辅助工具分享(像素大厨)

引言&#xff1a; 我们在从事前端开发工作时&#xff0c;常会需要测量许多盒子的尺寸&#xff0c;颜色提取种种&#xff0c;切图&#xff0c;还有文字大小等信息&#xff0c;光从肉眼很难看出来&#xff0c;当然我们传统的会使用Photoshop来帮助我们完成这些工作&#xff0c;但…

LeetCode 第417场周赛个人题解

目录 Q1. 找出第 K 个字符 I 原题链接 思路分析 AC代码 Q2. 元音辅音字符串计数 I 原题链接 思路分析 AC代码 Q3. 元音辅音字符串计数 II 原题链接 思路分析 AC代码 Q4. 找出第 K 个字符 II 原题链接 思路分析 AC代码 Q1. 找出第 K 个字符 I 原题链接 Q1. 找出…

ethtool网络命令

1、ethtool命令描述 ethtool 是用于查询及设置网卡参数的命令。 2、查看网卡eth0信息 [rootes01 ~]# ethtool eth0 3、查看网络eth0速率 [rootmgr2 tmp]# ethtool -S eth0 4、设置网口 设置网口速率10/100/1000M、设置网口半/全双工、设置网口是否自协商 ethtool –s eth…

现在企业生存都困难,还谈什么数字化转型?

在当下经济大环境不好的情景下&#xff0c;经常听到如下论调&#xff1a;企业生存都困难&#xff0c;还谈什么数字化?这一论调反映了在当前经济环境下&#xff0c;一些企业对于数字化转型的疑虑和担忧&#xff0c;同时对数字化转型也缺乏正确的认知。下面笔者就上述论调进行简…

JAVA TCP协议初体验

文章目录 一、需求概述二、设计选择三、代码结构四、代码放送五、本地调试1. 服务端日志2. 客户端日志3. 断线重连日志 六、服务器部署运行1. 源码下载2. 打包镜像3. 运行容器 一、需求概述 最近开发某数据采集系统&#xff0c;系统整体的数据流程图如下&#xff1a; #mermaid…

聚观早报 | 淘宝已接入微信支付;Meta Orion AR眼镜发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 9月29日消息 淘宝已接入微信支付 Meta Orion AR眼镜发布 iQOO 13将登陆印度市场 小鹏汽车加码布局上海 哔哩哔哩…

电脑自带dll修复在哪里,dll丢失的6种解决方法总结

在现代科技日新月异的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些常见的问题&#xff0c;其中之一就是dll文件丢失或损坏。当这些dll文件丢失或损坏时&#xff0c;可能会导致某些应用程序无法…