「FreeRTOS源码解析(一)」链表

一、前言

本期文章讲解FreeRTOS实时操作系统源码,主要是源码分析,实操很少。FreeRTOS在嵌入式领域中应用越来越多,在硬件资源有限的情况下,使用FreeRTOS可以做到实时响应时间,实时处理事件。相比传统的轮询系统和前台系统有着不一样的性能。

FreeRTOS中存在大量的基础数据结构链表和链表的操作,了解掌握链表有助于实操时可以入手改写代码。

链表的节点本来不是用来存储大量的数据,但是可以使用指针挂载很对数据。被挂载的数据结构可以是单个数据、数组、指针数据和自定义的结构体数据类型。链表最大的作用是通过节点将离散的数据链接在一起,组成一个表。主要对链表完成插入和删除操作。

FreeRTOS源码与链表相关的文件是list.c和list.h两个文件。本期文章FreeRTOS源码采用V9.0.0版本,源码可以在sourceforge上找到。

相关路径:

FreeRTOSv9.0.0\FreeRTOS\Sourc\ list.c

FreeRTOSv9.0.0\FreeRTOS\Sourc\include\list.h

二、C语言链表

1、单向链表(首尾相连)

该链表中共有 n个节点,前一个节点都有一个箭头指向后一个节点,首尾相连,组成一个圈。节点都是一个自定义类型的数据结构,在这个数据结构里面可以有单个的数据、数组、指针数据和自定义的结构体数据类型等等信息,通常的做法是节点里面只包含一个用于指向下一个节点的指针。要通过链表存储的数据内嵌一个节点即可,这些要存储的数据通过这个内嵌的节点即可挂接到链表中。

2、双向链表

双向链表与单向链表的区别就是节点中有两个节点指针,分别指向前后两个节点,其它完全一样。

3、链表和数组

链表是通过节点把离散的数据链接成一个表,通过对节点的插入和删除操作从而实现对数据的存取。而数组是通过开辟一段连续的内存来存储数据。

三、FreeRTOS的链表

1、定义链表节点结构xLIST_ITEM。

xItemValue; 辅助值,用于帮助节点做顺序排列

pxNext; 指向链表下一个节点

pxPrevious; 指向链表前一个节点

pvOwner; 指向拥有该节点的内核对象,通常是 TCB(任务控制模块)

pvContainer; 指向该节点所在的链表

链表节点初始化vListInitialiseItem函数。

2、实现链表根节点

链表根节点数据结构xLIST。

  • uxNumberOfItems; 链表节点计数器

  • pxIndex; 链表节点索引指针

  • xListEnd; 链表最后一个节点

链表精简节点结构体xMINI_LIST_ITEM。

  • xItemValue; 辅助值,用于帮助节点做升序排列

  • pxNext; 指向链表下一个节点

  • pxPrevious; 指向链表前一个节点

链表根节点初始化vListInitialise函数。完成如下功能:

  • 将链表索引指针指向最后一个节点;

  • 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点;

  • 将最后一个节点的 pxNext 和 pxPrevious 指针均指向节点自身,表示链表为空;

  • 初始化链表节点计数器的值为 0,表示链表为空。

3、主要操作函数

将节点插入链表的尾部vListInsertEnd函数。完成的流程图如下:

将节点按照升序排列插入链表vListInsert函数,完成的流程图如下:

将节点从链表删除uxListRemove函数。流程图如下:

4、节点带参数宏函数。

实时

初始化节点的拥有者。

获取节点拥有者。

初始化节点排序辅助值。

获取节点排序辅助值。

获取链表根节点的节点计数器的值。

获取链表的入口节点。

获取节点的下一个节点。

获取链表的最后一个节点。

判断链表是否为空。

获取链表的节点数。

获取链表第一个节点的 OWNER,即 TCB。

获得对应任务控制块。

判断该节点是否在该链表中。

返回指向该节点所在的链表地址。

判断链表是否被初始化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值