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

2023-05-16

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

目录

链表节点数据结构

链表根节点数据结构

内部嵌套

链表精简节点

链表节点初始化

链表根节点初始化

将节点插入到链表尾部

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

将节点从列表删除

任务控制块


链表节点数据结构

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;

后续再更新!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习记录(三)(扩展)嵌套结构体展开 的相关文章

  • Struts-拦截器+通配符+客户端跳转

    1 通配符匹配 Product 表示所有以Product结尾的路径 xff0c 都会匹配在这个Action上 method 61 1 表示第一个通配符 如果访问的是addProduct就会调用add方法 如果访问的是listProduct就
  • Hibernate-基本操作

    1 数据插入 Hibernate可以使用for循环插入多个数据到数据库 示例 xff1a public class TestHibernate public static void main String args SessionFacto
  • 将视觉信息转换为mavros

    https github com thien94 vision to mavros blob master src vision to mavros cpp rosmsg show mavros msgs LandingTarget MAV
  • 分蛋糕+中间数

    问题描述 小明今天生日 xff0c 他有n块蛋糕要分给朋友们吃 xff0c 这n块蛋糕 xff08 编号为1到n xff09 的重量分别为a1 a2 an 小明想分给每个朋友至少重量为k的蛋糕 小明的朋友们已经排好队准备领蛋糕 xff0c
  • 基于键盘与扬声器的电子琴设计

    1 功能需求 开发一个基于键盘和主机扬声器 xff08 小喇叭 xff09 的简易电子琴工具 xff0c 同时它也可以自动的演奏指定的简谱文件 通过调用计算机系统的API接口 xff0c 导入kernel32 dll xff0c 调用相关的
  • 最大波动+数位之和

    问题描述 小明正在利用股票的波动程度来研究股票 小明拿到了一只股票每天收盘时的价格 xff0c 他想知道 xff0c 这只股票连续几天的最大波动值是多少 xff0c 即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少 输入格式
  • 折点计数

    问题描述 给定n个整数表示一个商店连续n天的销售量 如果某天之前销售量在增长 xff0c 而后一天销售量减少 xff0c 则称这一天为折点 xff0c 反过来如果之前销售量减少而后一天销售量增长 xff0c 也称这一天为折点 其他的天都不是
  • 动态规划+贪心算法实现背包问题

    动规背包问题实现 xff1a import java util Scanner public class PackDynamic public static void main String args TODO Auto generated
  • 图像旋转

    问题描述 旋转是图像处理的基本操作 xff0c 在这个问题中 xff0c 你需要将一个图像逆时针旋转90度 计算机中的图像表示可以用一个矩阵来表示 xff0c 为了旋转一个图像 xff0c 只需要将对应的矩阵旋转即可 输入格式 输入的第一行
  • 注册界面表单

    代码 xff1a lt DOCTYPE HTML gt lt html gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta name 61 34 Generator 34 cont
  • 关于表单验证错误提示的几种方式

    一 用alert 弹出提示框 xff08 不提倡 xff09 通过alert弹出提示框 xff0c 但输入框多的话会不断弹出提示框 xff0c 每次都要点确定 xff0c 很麻烦 二 利用H5新增的required属性 required 属
  • html+css+js手写练习-仿CCF注册和登录页面

    直接贴代码 xff1a lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt 中国计算机学会 注册 lt title g
  • Android学习之点击按钮跳转至另一个Activity并传值和设置返回逻辑父屏幕

    首先新建一个Activity 1 在activity main的layout布局文件中添加一个按钮 xff0c 一个EditText并简单设置样式 我是这样写的 lt xml version 61 34 1 0 34 encoding 61
  • mission planner日志分析

    通过USB连接pixhawk xff0c 打missionplanner 选择需要的日志下载 xff0c 下载很慢 xff0c 慢慢等 https ardupilot org dev docs common diagnosing probl
  • Android学习之SD卡操作

    1 权限声明 对于SD卡的读写 xff0c 需要申请对应的权限 xff0c 即在主配置文件中添加对应的权限请求 lt uses permission android name 61 34 android permission WRITE E
  • Maven利用JBoss创建hibernate核心配置文件

    1 在Help的Eclipse Marketplace中搜索JBoss xff0c 选择下载安装 安装完毕后重启eclipse xff0c 如果重启后maven项目报错 xff0c 很大可能是在下载过程中有jar包受损 xff0c 出现Fa
  • 汇编练习

    1 将下面C语言程序的代码片段转换为功能等价的汇编语言代码片段 xff1b 编写一完整的汇编语言程序验证转换的正确性 xff0c 其中sign与sinteger均为双字变量 if sinteger 61 61 0 sign 61 0 els
  • 教务管理系统

    基于Metronic框架完成的一个课设作业 上方为部分功能截图 下载链接 xff1a https download csdn net download qq 41573860 11249884
  • 关于XTDrone中PX4 1.13安装

    在进行git submodule update init recursive这一步时 xff0c 很难git clone成功 xff0c 会出现 xff0c fatal 无法访问 39 https ghproxy com https git
  • 海康摄像头http抓图

    老版本的摄像头使用海康的协议http user password 64 192 168 1 64 ISAPI Streaming channels 33 picture 就可以取得图片 然后新型号的摄像头http需要Digest autho

随机推荐