freertos 源码分析二 list链表源码

list.c
在这里插入图片描述

一、链表初始化

void vListInitialise( List_t * const pxList )
{                                                                                                                                                  pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) );pxList->xListEnd.xItemValue = portMAX_DELAY;pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );#if ( configUSE_MINI_LIST_ITEM == 0 ) {   pxList->xListEnd.pvOwner = NULL;pxList->xListEnd.pxContainer = NULL;listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) );}   #endifpxList->uxNumberOfItems = ( UBaseType_t ) 0U; listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
}

分解

pxList->pxIndex 指向结构中的xListEnd结构体

pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );

校验

#if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 )#define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )#define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )#define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList )#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList )
#else#define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )     ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE#define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )    ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE#define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList )              ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList )              ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE
#endif

验验数值 5a

#if ( configUSE_16_BIT_TICKS == 1 ) #define pdINTEGRITY_CHECK_VALUE    0x5a5a
#else#define pdINTEGRITY_CHECK_VALUE    0x5a5a5a5aUL
#endif  

portMAX_DELAY数值

#if( configUSE_16_BIT_TICKS == 1 )typedef uint16_t TickType_t;#define portMAX_DELAY ( TickType_t ) 0xffff
#else   typedef uint32_t TickType_t;#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#endif 

往下

   pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );

链表结构中xListEnd结构体的前后表项指针匀指向xListEnd

pxList->uxNumberOfItems = ( UBaseType_t ) 0U; 

表项个数设为零

二、表项初始化

void vListInitialiseItem( ListItem_t * const pxItem )
{pxItem->pxContainer = NULL;listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );
}

三、表尾插入表项

void vListInsertEnd( List_t * const pxList,ListItem_t * const pxNewListItem )
{ListItem_t * const pxIndex = pxList->pxIndex;listTEST_LIST_INTEGRITY( pxList );listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );pxNewListItem->pxNext = pxIndex;pxNewListItem->pxPrevious = pxIndex->pxPrevious;mtCOVERAGE_TEST_DELAY();pxIndex->pxPrevious->pxNext = pxNewListItem;pxIndex->pxPrevious = pxNewListItem;pxNewListItem->pxContainer = pxList;( pxList->uxNumberOfItems )++;
}  

由于初始化时,索引指向了链表内xListEnd结构体,初次插入表项时,连同链表内表项一同插入链表。

 ListItem_t * const pxIndex = pxList->pxIndex;

检测校验

#if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList )#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList )#define listTEST_LIST_ITEM_INTEGRITY( pxItem )#define listTEST_LIST_INTEGRITY( pxList )
#else#define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList )  \( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE#define listTEST_LIST_ITEM_INTEGRITY( pxItem )          \configASSERT( ( ( pxItem )->xListItemIntegrityValue1 ==                    pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) #define listTEST_LIST_INTEGRITY( pxList )               \configASSERT( ( ( pxList )->xListIntegrityValue1 ==                        pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) 
#endif

mtCOVERAGE_TEST_DELAY,代码覆盖路径测试 展开为空 检测用

#ifndef mtCOVERAGE_TEST_DELAY#define mtCOVERAGE_TEST_DELAY()
#endif       

指针操作,表项插入在当前链表表项索引之前。

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

设链表为当前表项Container,并增加表项数目。

pxNewListItem->pxContainer = pxList;
( pxList->uxNumberOfItems )++;   

四、插入表项

依据表项的xItemValue数值,插入表项,若数值相等插入相等值之后。

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 ){}}pxNewListItem->pxNext = pxIterator->pxNext;pxNewListItem->pxNext->pxPrevious = pxNewListItem;pxNewListItem->pxPrevious = pxIterator;pxIterator->pxNext = pxNewListItem;pxNewListItem->pxContainer = pxList;( pxList->uxNumberOfItems )++;
}

五、删除表项

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
{List_t * const pxList = pxItemToRemove->pxContainer;pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;mtCOVERAGE_TEST_DELAY();if( pxList->pxIndex == pxItemToRemove ){pxList->pxIndex = pxItemToRemove->pxPrevious;}else{mtCOVERAGE_TEST_MARKER();}pxItemToRemove->pxContainer = NULL;( pxList->uxNumberOfItems )--;return pxList->uxNumberOfItems;
}

分解
表项pxContainer指针为当前拥有者链表。

List_t * const pxList = pxItemToRemove->pxContainer;

若移除表项为当前索引,当前索引前移。

if( pxList->pxIndex == pxItemToRemove )
{pxList->pxIndex = pxItemToRemove->pxPrevious;
}

代码覆盖路径测试 检测用

 mtCOVERAGE_TEST_MARKER();

表项数目减一,返回表项数目。

( pxList->uxNumberOfItems )--;
return pxList->uxNumberOfItems;

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

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

相关文章

开源软件:推动技术革新与商业模式转型的引擎

开源软件的影响力分析 引言开源软件如何推动技术创新开源软件与全球协作知识分享与快速迭代促进多样化技术发展开源软件示例与创新案例分析 开源软件的商业模式开放内核模式服务与支持捐赠模式云服务平台 开源软件的安全风险代码维护和质量问题开发者和贡献者的不确定性第三方库…

arcgis 如何将线路转为路面

在出外业的时候&#xff0c;用手机软件测出来的路&#xff08;线要素&#xff09;&#xff0c;需要转换成路面。具体操作如下&#xff1a; 1.打开线图层 2.菜单-地理处理-缓冲区 在缓冲区中&#xff0c;输入要转换的线要素&#xff0c;在线性单位下方填写要转换的面的宽度&am…

Modbus协议学习第七篇之libmodbus库API介绍(modbus_write_bits等)

写在前面 在第六篇中我们介绍了基于libmodbus库的演示代码&#xff0c;那本篇博客就详细介绍一下第六篇的代码中使用的基于该库的API函数。另各位读者&#xff0c;Modbus相关知识受众较少&#xff0c;如果觉得我的专栏文章有帮助&#xff0c;请一定点个赞&#xff0c;在此跪谢&…

PEI是聚醚酰亚胺(Polyetherimide)在粘接使用时使用UV胶水的优势有哪些?要注意哪些事项?

在使用UV胶水进行聚醚酰亚胺&#xff08;Polyetherimide&#xff0c;PEI&#xff09;粘接时&#xff0c;有一些优势和注意事项&#xff1a; 优势&#xff1a; 1.快速固化&#xff1a; UV胶水具有快速固化的特性&#xff0c;通过紫外线光源的照射&#xff0c;可以在几秒到几分钟…

CSC联合培养博士申请亲历|联系外导的详细过程

在CSC申报的各环节中&#xff0c;联系外导获得邀请函是关键步骤。这位联培博士同学的这篇文章&#xff0c;非常详细且真实地记录了申请过程、心理感受&#xff0c;并提出有益的建议&#xff0c;小编特推荐给大家参考。 2024年国家留学基金委公派留学项目即将开始&#xff0c;其…

前端小案例——滚动文本区域(HTML+CSS, 附源码)

一、前言 实现功能: 这个案例实现了一个具有滚动功能的文本区域&#xff0c;用于显示长文本内容&#xff0c;并且可以通过滚动条来查看完整的文本内容。 实现逻辑&#xff1a; 内容布局&#xff1a;在<body>中&#xff0c;使用<div>容器创建了一个类名为listen_t…

【HarmonyOS应用开发】Web组件的使用(十三)

文章末尾含&#xff1a;Web组件抽奖案例&#xff08;ArkTS&#xff09;-示例源码下载 Web组件的使用 一、概述 相信大家都遇到过这样的场景&#xff0c;有时候我们点击应用的页面&#xff0c;会跳转到一个类似浏览器加载的页面&#xff0c;加载完成后&#xff0c;才显示这个页…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、模仿学习

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起…

Prometheus 采集Oracle监控数据

前言 oracledb_exporter是一个开源的Prometheus Exporter,用于从Oracle数据库中收集关键指标并将其暴露给Prometheus进行监控和告警。它可以将Oracle数据库的性能指标转换为Prometheus所需的格式,并提供一些默认的查询和指标。 download Oracle Oracle Windows Install …

docker 容器指定主机网段

docker 容器指定主机网段。 直接连接到物理网络&#xff1a;使用macvlan技术可以让Docker容器直接连接到物理网络&#xff0c;而不需要通过NAT或端口映射的方式来访问它们。可以提高网络性能和稳定性&#xff0c;同时也可以使容器更加透明和易于管理。 1、查询网卡的名称&…

【DevOps】产品需求文档(PRD)与常见原型软件

文章目录 1、PRD介绍1.1、概述1.2、前提条件1.3、主要目的1.4、关键内容1.5、表述方式1.6、需求评审人员1.7、一般内容结构 2、需求流程3、常见原型软件3.1、Word3.2、Axure3.2.1、详细介绍3.2.2、应用分类3.2.3、优缺点 3.3、摹客RP3.4、蓝湖3.5、GUI Design Studio 1、PRD介绍…

IDEA中的Run Dashboard

Run Dashboard是IntelliJ IDEA中的工具【也就是View中的Services】&#xff0c;提供一个可视化界面&#xff0c;用于管理控制应用程序的运行和调试过程。 在Run DashBoard中&#xff0c;可以看到所有的运行配置&#xff0c;以及每个配置的运行状态&#xff08;正在运行&#xf…