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

FreeRTOS 列表(List)与列表项(ListItem)详解

FreeRTOS 列表(List)与列表项(ListItem)详解

1. 列表项(ListItem_t)

  • 结构体定义
    列表项是链表的节点,定义如下:

    • TickType_t xItemValue:排序辅助值,决定节点在链表中的顺序(如任务优先级、定时唤醒时间等)。
    • struct xLIST_ITEM *pxNext:指向下一个节点。
    • struct xLIST_ITEM *pxPrevious:指向前一个节点。
    • void *pvOwner:指向拥有该节点的内核对象(如 TCB)。
    • void *pvContainer:指向该节点所在的链表。
  • 作用
    每个内核对象(如任务、定时器)都可以包含一个或多个 ListItem_t,用于插入到不同的链表中,实现调度、延时、同步等功能。

2. 最小列表项(MiniListItem_t)

  • 结构体定义
    作为链表的哨兵节点(链表头/尾),简化链表操作。
    • TickType_t xItemValue
    • struct xLIST_ITEM *pxNext
    • struct xLIST_ITEM *pxPrevious

3. 列表(List_t)

  • 结构体定义

    • UBaseType_t uxNumberOfItems:链表节点计数器,记录链表中节点数量。
    • ListItem_t *pxIndex:链表索引指针,遍历链表时使用。
    • MiniListItem_t xListEnd:链表的哨兵节点,始终作为链表的尾部。
  • 作用
    List_t 是双向循环链表,支持高效的插入、删除和遍历操作。FreeRTOS 用它来管理就绪任务、延时任务、定时器等。

4. 主要操作函数

  • vListInitialiseItem(ListItem_t *pxItem)
    初始化单个列表项,设置其 pvContainer 为 NULL。

  • vListInitialise(List_t *pxList)
    初始化链表,将 xListEnd 的前后指针指向自身,节点数为 0。

  • vListInsertEnd(List_t *pxList, ListItem_t *pxNewListItem)
    将节点插入链表尾部。

  • vListInsert(List_t *pxList, ListItem_t *pxNewListItem)
    按 xItemValue 升序插入节点。

  • uxListRemove(ListItem_t *pxItemToRemove)
    从链表中移除节点,并返回剩余节点数。

5. 典型用法

  • 任务调度:就绪任务链表、延时任务链表等,均用 List_t 管理。
  • 定时器管理:定时器节点按超时时间插入链表,实现定时唤醒。
  • 同步机制:如信号量、事件组等,常用链表管理等待队列。

6. 总结

FreeRTOS 的列表和列表项设计简洁高效,支持多种内核对象的灵活管理,是实现实时调度和资源管理的核心基础。


7. 结构关系图

下面是 FreeRTOS 列表与节点的结构关系图(简化版,突出双向循环链表结构):

flowchart LRsubgraph List_tA[uxNumberOfItems]B[pxIndex]C[xListEnd]endsubgraph ListItem_tD[xItemValue]E[pxNext]F[pxPrevious]G[pvOwner]H[pvContainer]endC -- pxNext --> I((...))C -- pxPrevious --> J((...))B --指向--> EE --指向下一个节点--> EF --指向上一个节点--> FC -.哨兵节点.-> EC -.哨兵节点.-> F

8. 关键代码解析

list.h 结构体定义

typedef struct xLIST_ITEM {TickType_t xItemValue;struct xLIST_ITEM *pxNext;struct xLIST_ITEM *pxPrevious;void *pvOwner;void *pvContainer;
} ListItem_t;typedef struct xMINI_LIST_ITEM {TickType_t xItemValue;struct xLIST_ITEM *pxNext;struct xLIST_ITEM *pxPrevious;
} MiniListItem_t;typedef struct xLIST {UBaseType_t uxNumberOfItems;ListItem_t *pxIndex;MiniListItem_t xListEnd;
} List_t;

list.c 主要函数解析

  • vListInitialiseItem:初始化节点,pvContainer 置空。
  • vListInitialise:初始化链表,xListEnd 前后指针指向自身,节点数为0。
  • vListInsertEnd:插入到链表尾部。
  • vListInsert:按 xItemValue 升序插入。
  • uxListRemove:移除节点。

插入节点伪代码流程:

  1. 遍历链表,找到合适插入位置(xItemValue 升序)。
  2. 修改新节点和前后节点的 pxNext/pxPrevious 指针。
  3. 新节点 pvContainer 指向链表。
  4. 链表节点数加一。

删除节点伪代码流程:

  1. 修改前后节点的 pxNext/pxPrevious 指针,跳过要删除的节点。
  2. 若 pxIndex 指向被删节点,则回退。
  3. 节点 pvContainer 置空。
  4. 链表节点数减一。

9. main.c 实验讲解

实验代码

#include "list.h"struct xLIST List_Test;
struct xLIST_ITEM List_item1;
struct xLIST_ITEM List_item2;
struct xLIST_ITEM List_item3;int main()
{vListInitialise(&List_Test);vListInitialiseItem(&List_item1);List_item1.xItemValue = 1;vListInitialiseItem(&List_item2);List_item2.xItemValue = 2;vListInitialiseItem(&List_item3);List_item3.xItemValue = 3;vListInsert(&List_Test, &List_item1);vListInsert(&List_Test, &List_item2);vListInsert(&List_Test, &List_item3);for (;;){/* loop */}
}

实验说明

  1. 初始化链表 List_Test。
  2. 初始化3个节点,分别赋值 xItemValue=1,2,3。
  3. 依次插入链表,链表自动按升序排列。
  4. 可通过调试查看链表结构,验证插入顺序和节点指针关系。

实验截图

如下图所示(变量窗口/内存窗口可见链表结构):

实验截图

http://www.jsqmd.com/news/524016/

相关文章:

  • TwitchDownloader社区贡献指南:如何参与翻译、主题开发与功能扩展
  • Ostrakon-VL-8B实战落地:某区域商超用其替代人工巡检,单店月省23工时
  • UniApp跨平台文件下载避坑指南:鸿蒙OS/Android/iOS三端兼容方案
  • PyTorch分布式训练实战:1F1B交错式调度模式如何提升GPU利用率(附代码)
  • Python实战:利用pandas与openpyxl高效实现Excel与字典双向转换
  • Toaster快速上手:10分钟学会Android高级Toast定制技巧
  • 开源大模型部署案例:OFA-COCO distilled版与LangChain集成构建视觉智能体(Vision Agent)
  • Whisper Streaming核心组件深度解析:从ASR到VAD的实时语音转录系统
  • PSBits权限提升技巧:10个方法获取Windows系统完全控制权
  • YAYI 2模型可视化工具:注意力权重分析
  • VibeVoice Pro流式语音生成教程:支持HTTP/2 Server Push流式传输
  • 2026窗帘热升华机器厂家推荐:技术与服务双优之选 - 品牌排行榜
  • SolidWorks 2019 + SW_URDF_Export插件:手把手教你将六轴机械臂模型导出为ROS可用的URDF文件
  • EtherCAT寻址模式深度解析:如何选择最适合你的工业自动化场景
  • 如何自定义Generative Inpainting:高级配置与参数调优指南
  • 用Python玩转DEAP情绪数据集:从数据下载到EEG信号可视化(附完整代码)
  • Simulink子系统实战:3步搞定可切换内部组件(附常见报错解决)
  • minimatch核心功能解析:花括号扩展、Globstar匹配与转义处理
  • OpenClaw 与反爬虫机制:合规应对与最佳实践指南
  • C++ WebServer内存管理最佳实践:Buffer类设计与资源释放
  • YAYI 2学术引用指南:论文撰写规范与最佳实践
  • 马尔可夫预测实战:用Python模拟药店市场份额变化(附完整代码)
  • Python实战:用Scikit-Learn和Matplotlib轻松绘制TSNE降维图(附完整代码)
  • nix-starter-configs与home-manager集成:统一管理你的开发环境
  • 双机H100+ROCE网络部署DeepseekSeek-R1-671B实战指南
  • Windows下OpenClaw安装指南:Qwen3-32B模型联调实战
  • 生产环境部署:rate-limiter-flexible的最佳配置与监控方案
  • tao-8k Embedding模型实战教程:本地化部署+WebUI交互+API集成
  • HALCON/C++实战:从图像处理到区域分析的完整流程
  • 保姆级教程:用CST低频求解器搞定导线磁场仿真(从建模到结果分析)