FreeRTOS学习记录(三)(扩展)嵌套结构体展开

分析代码的辅助文章,不重要。

目录

链表节点数据结构

链表根节点数据结构

内部嵌套

链表精简节点

链表节点初始化

链表根节点初始化

将节点插入到链表尾部

将节点按照升序排列插入到链表

将节点从列表删除

任务控制块


链表节点数据结构

struct xLIST_ITEM
{
    TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ (1)
    struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ (2)
    struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ (3)
    void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB */(4)
    void * pvContainer; /* 指向该节点所在的链表 */ (5)
};

typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ (6)

链表根节点数据结构

typedef struct xLIST
{
    UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1)
    ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
    MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
} List_t

内部嵌套

typedef struct xLIST
{
    UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1) //UBaseTyoe_t:unsigned long
    ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
    MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
            struct xMINI_LIST_ITEM
            {
                TickType_t xItemValue; /* 辅助值,用于帮助节点做升序排列 */
                struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */
                struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */
            };
            typedef struct xMINI_LIST_ITEM MiniListItem_t; /* 精简节点数据类型重定义 */
} List_t

链表精简节点

//代码清单 链表精简节点结构体定义
struct xMINI_LIST_ITEM
{
    TickType_t xItemValue; /* 辅助值,用于帮助节点做升序排列 */
    struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */
    struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */
};

typedef struct xMINI_LIST_ITEM MiniListItem_t; /* 精简节点数据类型重定义 */

链表节点初始化

//操作ListItem_t结构体   typedef struct xLIST_ITEM ListItem_t; 

void vListInitialiseItem( ListItem_t * const pxItem )
{
    /* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */
    pxItem->pvContainer = NULL; 
    //是初始化的时候只需将pvContainer 初始化为空即可,表示该节点还没有插入到任何链表。

}

链表根节点初始化

//操作List_t结构体
//指向自己
//链表根节点初始化
void vListInitialise( List_t * const pxList )
{
    /* 将链表索引指针指向最后一个节点 */(1)
    pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );
    
    /* 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点 */(2)
    pxList->xListEnd.xItemValue = portMAX_DELAY;
    
    /* 将最后一个节点的 pxNext 和 pxPrevious 指针均指向节点自身,表示链表为空 */(3)
    pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );
    pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );
 
    /* 初始化链表节点计数器的值为 0,表示链表为空 */(4)
    pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
}

//结构体
typedef struct xLIST
{
    UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1)
    ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
    MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
} List_t

将节点插入到链表尾部

//操作Lise_t和ListItem_t结构体

//将节点插入到链表的尾部   //List_t根节点
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
{
    ListItem_t * const pxIndex = pxList->pxIndex;

    pxNewListItem->pxNext = pxIndex; //(1)
    pxNewListItem->pxPrevious = pxIndex->pxPrevious; //(2)
    pxIndex->pxPrevious->pxNext = pxNewListItem; //(3)
    pxIndex->pxPrevious = pxNewListItem; //(4)

    /* 记住该节点所在的链表 */
    pxNewListItem->pvContainer = ( void * ) pxList; //(5)
 
    /* 链表节点计数器++ */
    ( pxList->uxNumberOfItems )++; //(6)
}


//结构体
typedef struct xLIST
{
    UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1)
    ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
    MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
} List_t
//===============================================================
struct xLIST_ITEM
{
    TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ (1)
    struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ (2)
    struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ (3)
    void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB */(4)
    void * pvContainer; /* 指向该节点所在的链表 */ (5)
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ (6)

将节点按照升序排列插入到链表

//将节点按照升序排列插入到链表
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
{
    ListItem_t *pxIterator;

    /* 获取节点的排序辅助值 */
    const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; (1)

    /* 寻找节点要插入的位置 */ (2)
    if ( xValueOfInsertion == portMAX_DELAY )
    {
        pxIterator = pxList->xListEnd.pxPrevious;
    }
    else
    {
        for ( pxIterator = ( ListItem_t * ) &( pxList->xListEnd );
                pxIterator->pxNext->xItemValue <= xValueOfInsertion;
                pxIterator = pxIterator->pxNext )
        {
        /* 没有事情可做,不断迭代只为了找到节点要插入的位置 */
        }
    }
    /* 根据升序排列,将节点插入 */ (3)
    pxNewListItem->pxNext = pxIterator->pxNext; ①
    pxNewListItem->pxNext->pxPrevious = pxNewListItem; ②
    pxNewListItem->pxPrevious = pxIterator; ③
    pxIterator->pxNext = pxNewListItem; ④

    /* 记住该节点所在的链表 */
    pxNewListItem->pvContainer = ( void * ) pxList; ⑤

    /* 链表节点计数器++ */
    ( pxList->uxNumberOfItems )++; ⑥
}

//结构体
typedef struct xLIST
{
    UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1)
    ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
    MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
} List_t
//===============================================================
struct xLIST_ITEM
{
    TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ (1)
    struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ (2)
    struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ (3)
    void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB */(4)
    void * pvContainer; /* 指向该节点所在的链表 */ (5)
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ (6)

将节点从列表删除

//将节点从链表删除
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
{
    /* 获取节点所在的链表 */ 
    List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
    /* 将指定的节点从链表删除*/ 
    pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; ①
    pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; ②

    /*调整链表的节点索引指针 */ 
    if ( pxList->pxIndex == pxItemToRemove )
    {
        pxList->pxIndex = pxItemToRemove->pxPrevious;
    }

    /* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */
    pxItemToRemove->pvContainer = NULL; ③

    /* 链表节点计数器-- */
    ( pxList->uxNumberOfItems )--; ④

    /* 返回链表中剩余节点的个数 */
    return pxList->uxNumberOfItems;
}
//结构体
struct xLIST_ITEM
{
    TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ (1)
    struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ (2)
    struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ (3)
    void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB */(4)
    void * pvContainer; /* 指向该节点所在的链表 */ (5)
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ (6)

任务控制块

//tasks.c
//复制自FreeRTOS库,删减了一些定义
 
/*
*任务控制块。为每个任务分配一个任务控制块(TCB),
*并存储任务状态信息,包括指向任务上下文的指针
*(任务的运行时环境,包括寄存器值)
*/ 
typedef struct tskTaskControlBlock       /*旧的命名约定用于防止破坏支持内核的调试器*/ 
{
    volatile StackType_t * pxTopOfStack;  //(1)      /*<当前堆栈的栈顶,必须位于结构体的第一项 */
 
    ListItem_t xStateListItem;            //(2)       /*< 任务的状态列表项所引用的列表表示该任务的状态(就绪、已阻止、已暂停) */
    //-----------------------------------------------------------

            struct xLIST_ITEM
            {
                TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */// (1)
                struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ //(2)
                struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ //(3)
                void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB *///(4)
                void * pvContainer; /* 指向该节点所在的链表 */ //(5)
            };

            typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ //(6)


    //-----------------------------------------------------------

    ListItem_t xEventListItem;                  /*< 事件列表项,用于将任务以引用的方式挂接到事件列表 */
    UBaseType_t uxPriority;                     /*< 任务的优先级。0是最低优先级*/
    StackType_t * pxStack;                //(3)       /*< 指向堆栈的起始 */
    char pcTaskName[ configMAX_TASK_NAME_LEN ]; //(4) /*< 创建任务时为任务指定的描述性名称。仅用于调试。 */ /*lint !e971 仅允许字符串和单个字符使用非限定字符类型*/
 
} tskTCB;
 
typedef tskTCB TCB_t;

后续再更新!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值