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

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

一、表项数据结构

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;
 listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
 listSECOND_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_VALUE
    volatile 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_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;
#else
    typedef struct xLIST_ITEM      MiniListItem_t;
#endif      

相关推荐

  1. freertos 分析 list数据结构

    2024-02-02 08:16:06       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-02 08:16:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-02 08:16:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-02 08:16:06       82 阅读
  4. Python语言-面向对象

    2024-02-02 08:16:06       91 阅读

热门阅读

  1. Reducer 和 Context实现简单的Redux

    2024-02-02 08:16:06       62 阅读
  2. DAY37:贪心算法738

    2024-02-02 08:16:06       57 阅读
  3. golang网络编程day4

    2024-02-02 08:16:06       37 阅读
  4. 静态HTML引入vue封装组件

    2024-02-02 08:16:06       52 阅读
  5. 2024.2.1 寒假训练记录(15)

    2024-02-02 08:16:06       56 阅读
  6. 用C#实现实时动态图表

    2024-02-02 08:16:06       48 阅读
  7. WebSocket

    WebSocket

    2024-02-02 08:16:06      50 阅读
  8. 前端如何预防CSRF

    2024-02-02 08:16:06       53 阅读
  9. python笔记11

    2024-02-02 08:16:06       52 阅读
  10. 前端下载导出文件流,excel/word/pdf/zip等

    2024-02-02 08:16:06       64 阅读
  11. yolov5导出onnx模型问题

    2024-02-02 08:16:06       47 阅读