FreeRTOS连载04:链表数据结构 - 双向循环链表的精妙设计

引言

链表是FreeRTOS中最基础也是最重要的数据结构,它支撑着整个调度器的运行。FreeRTOS使用双向循环链表来管理任务、队列、定时器等各种对象。本文将深入分析FreeRTOS V11.1.0中链表的设计理念和实现细节,揭示其高效运行的秘密。

1. 链表结构设计概览

FreeRTOS的链表设计包含两个核心结构:链表项(ListItem_t)和链表(List_t)。

1.1 链表项结构

struct xLIST_ITEM
{
    listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE           /* 完整性检查值1 */
    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          /* 完整性检查值2 */
};
typedef struct xLIST_ITEM ListItem_t;

1.2 链表结构

typedef struct xLIST
{
    listFIRST_LIST_INTEGRITY_CHECK_VALUE      /* 完整性检查值1 */
    configLIST_VOLATILE UBaseType_t uxNumberOfItems;  /* 链表中的项目数量 */
    ListItem_t * configLIST_VOLATILE pxIndex; /* 用于遍历链表的索引指针 */
    MiniListItem_t xListEnd;                  /* 链表结束标记,包含最大可能值 */
    listSECOND_LIST_INTEGRITY_CHECK_VALUE     /* 完整性检查值2 */
} List_t;

1.3 迷你链表项

为了节省内存,FreeRTOS还提供了迷你链表项:

#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

2. 双向循环链表的设计精髓

2.1 循环结构的巧妙设计

FreeRTOS的链表是双向循环链表,其中xListEnd作为哨兵节点:

void vListInitialise( List_t * const pxList )
{
    /* 链表索引指向结束标记 */
    pxList->pxIndex = ( ListItem_t * ) &( 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 ) );
    }
    #endif
​
    pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
​
    /* 设置完整性检查值 */
    listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );
    listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );
}

设计亮点

  1. 哨兵节点: xListEnd简化了边界条件处理

  2. 循环结构: 消除了NULL指针检查的需要

  3. 最大值标记: 确保哨兵节点始终在链表末尾

2.2 链表项初始化

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 );
}

3. 链表操作算法深度解析

3.1 按值插入算法

FreeRTOS的链表支持按值自动排序插入:

void vListInsert( List_t * const pxList, ListItem_t * const
【无人机】湍流天气下发动机故障时自动着陆的多级适配研究(Matlab代码实现)内容概要:本文围绕“湍流天气下发动机故障时无人机自动着陆的多级适配研究”展开,提出了一种在极端气象条件下应对无人机动力系统突发故障的自动着陆控制策略。通过构建多级适配控制架构,结合鲁棒控制与自适应算法,提升无人机在湍流干扰下的稳定性和安全性,确保其在发动机部分或完全失效情况下仍能实现平稳着陆。研究采用Matlab进行系统建模与仿真验证,涵盖了飞行动力学模型、故障检测机制、姿态控制律设计及着陆轨迹规划等关键环节,重点解决了强扰动环境下的系统不确定性与控制性能退化问题。; 适合人群:具备一定飞行器控制、自动控制理论基础,熟悉Matlab仿真工具的研究生、科研人员及从事无人机系统开发的工程师;尤其适合研究无人机容错控制、飞行安全与应急着陆技术的相关从业者。; 使用场景及目标:①研究无人机在突发故障与复杂气象耦合条件下的安全着陆机制;②开发具备高鲁棒性的容错飞控系统;③为无人机适航安全标准提供理论支持与仿真验证手段;④应用于军事侦察、电力巡检、应急救援等高风险作业场景中的自主安全决策系统设计。; 阅读建议:建议读者结合Matlab代码深入理解控制算法的实现细节,重点关注多级控制器的设计逻辑与故障切换策略,同时可通过修改湍流强度、故障模式等参数进行仿真对比,以掌握系统在不同工况下的响应特性与适应能力。
本资源文件提供了一个基于555芯片的八路循环彩灯控制器的Multisim仿真设计。该设计利用555芯片作为振荡器,结合74LS192和74LS194芯片,构建了一个LED流水灯显示系统。通过该仿真设计,用户可以实现彩灯的循环控制,展示多种灯光效果。 功能特点 555芯片振荡器:555芯片以其多模式工作、高精度定时和低功耗特性,为系统提供稳定的时钟源。 74LS192计数器:74LS192作为一个四位计数器,支持预置和同步计数模式,用于控制彩灯的亮灭顺序。 74LS194数据转换:74LS194提供了串行-并行和并行-串行转换功能,用于灵活的数据处理,实现彩灯的多样化显示效果。 八路彩灯控制:通过逻辑门电路驱动LED码盘,实现彩灯的流水灯效果,支持从左到右和从右到左的循环亮灭。 设计文件 本资源文件包含了详细的Multisim仿真设计文件,用户可以通过这些文件进行仿真和验证。设计文件中包含了电路图、元件清单以及仿真结果,方便用户理解和修改。 使用说明 下载并安装Multisim软件。 打开本资源文件中的Multisim设计文件。 根据需要调整电路参数,如电阻、电容等。 运行仿真,观察彩灯的亮灭效果。 注意事项 确保使用与设计文件兼容的Multisim版本。 在调整电路参数时,注意保持电路的稳定性。 仿真过程中,如遇到问题,可参考设计文件中的说明进行排查。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VehSwHwDeveloper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值