当前位置: 首页 > news >正文

freertos 源码分析一 list链表数据结构

链表和任务管理是freertos 的核心,先分析链表源码,freertos的链表是双向环形链表,定义与数据结构在list.h中,表项的初始化,插入与删除在list.c中。
数据结构

一、表项数据结构

struct xLIST_ITEM
{listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUEconfigLIST_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;
 listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUElistSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE

这两个是校验数据

    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 )#define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE#define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE     #else#define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE     TickType_t xListItemIntegrityValue1;#define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE    TickType_t xListItemIntegrityValue2;#endif

不需要的情况下宏展开为空,需下的的情况下是据TickType_t长度变化16-32位的5a5a

 #if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS )typedef uint16_t     TickType_t;#define portMAX_DELAY              ( TickType_t ) 0xffff
#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS )typedef uint32_t     TickType_t;#define portMAX_DELAY              ( TickType_t ) 0xffffffffUL                                                                                 
#else#error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width.
#endif

configLIST_VOLATILE TickType_t xItemValue;

#define configLIST_VOLATILE volatile
#ifndef configLIST_VOLATILE#define configLIST_VOLATILE
#endif

在调度任务时,插入表项的依据值,可以为运行时间什么的

   struct xLIST_ITEM * configLIST_VOLATILE pxNext;

指向下一表项

struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;        

指向前一表项

void * pvOwner;

指向该表项的指针

struct xLIST * configLIST_VOLATILE pxContainer;

指向拥有该表项的链表。

二、链表数据结构

typedef struct xLIST
{listFIRST_LIST_INTEGRITY_CHECK_VALUEvolatile UBaseType_t uxNumberOfItems;ListItem_t * configLIST_VOLATILE pxIndex;MiniListItem_t xListEnd;listSECOND_LIST_INTEGRITY_CHECK_VALUE
} List_t;   

分解

volatile UBaseType_t   uxNumberOfItems;
typedef unsigned long    UBaseType_t;

表项数目

ListItem_t * configLIST_VOLATILE pxIndex;

表项索引

MiniListItem_t xListEnd;

表尾,若定义configUSE_MINI_LIST_ITEM ,使用缩减表项数据结构,否则还是表项的数据结构,参考以下

#if ( configUSE_MINI_LIST_ITEM == 1 ) struct xMINI_LIST_ITEM{   listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUEconfigLIST_VOLATILE TickType_t xItemValue;struct xLIST_ITEM * configLIST_VOLATILE pxNext;struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;};  typedef struct xMINI_LIST_ITEM MiniListItem_t;
#elsetypedef struct xLIST_ITEM      MiniListItem_t;
#endif      
http://www.lryc.cn/news/293073.html

相关文章:

  • 小程序uni-swiper-action-item滑动不了
  • 【新课】安装部署系列Ⅲ—Oracle 19c Data Guard部署之两节点RAC部署实战
  • 【从零开始的rust web开发之路 四】rust语言tokio异步使用redis教程
  • uniapp本地存储的几种方式localStorage
  • 扩展学习|统计学习理论(SLT)与极限学习机(ELM)应用于大社会数据分析
  • 配置实例—交换机VLAN聚合配置实例
  • 网络开发的隐形壁垒:如何巧妙解决跨域难题?
  • 【极简】conda同一个服务器上迁移环境 export / create
  • HBase 数据导入导出
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • 服务器托管的作用是什么?
  • 美团启动架构调整:聚力核心本地商业,提升科技与境外业务优先级
  • 监测Tomcat项目宕机重启脚本(Linux)
  • 道可云元宇宙每日资讯|北京:推进元宇宙在智慧城市应用
  • Logback学习
  • 【Chrono Engine学习总结】2-可视化
  • pytorch创建tensor
  • Cmake语法学习3:语法
  • JavaScript 基础 - 第1天
  • 人口增长问题 T1063
  • 2024年Java算法面试题
  • C#——三角形面积公式
  • tcpdump在手机上的使用
  • unity 导出H5
  • 认识 SYN Flood 攻击
  • Node需要了解的知识
  • 网络服务综合实验项目
  • 工厂模式与抽象工厂模式
  • Springboot整合Websocket实现ws和wss连接
  • CSC联合培养博士申请亲历|联系外导的详细过程