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

一、前言

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

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

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

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

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

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

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

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

相关路径:

相关路径:

FreeRTOSv9.0.0FreeRTOSSourc list.c

FreeRTOSv9.0.0FreeRTOSSourc list.c

FreeRTOSv9.0.0FreeRTOSSourcincludelist.h

FreeRTOSv9.0.0FreeRTOSSourcincludelist.h

二、C语言链表

二、C语言链表

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

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

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

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

2、双向链表

2、双向链表

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

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

3、链表和数组

3、链表和数组

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

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

三、FreeRTOS的链表

三、FreeRTOS的链表

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

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

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

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

pxNext; 指向链表下一个节点

pxNext; 指向链表下一个节点

pxPrevious; 指向链表前一个节点

pxPrevious; 指向链表前一个节点

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

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

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

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

链表节点初始化vListInitialiseItem函数。

链表节点初始化vListInitialiseItem函数。

2、实现链表根节点

2、实现链表根节点

链表根节点数据结构xLIST。

链表根节点数据结构xLIST。
    uxNumberOfItems; 链表节点计数器 pxIndex; 链表节点索引指针 xListEnd; 链表最后一个节点
uxNumberOfItems; 链表节点计数器 pxIndex; 链表节点索引指针 xListEnd; 链表最后一个节点

链表精简节点结构体xMINI_LIST_ITEM。

链表精简节点结构体xMINI_LIST_ITEM。
    xItemValue; 辅助值,用于帮助节点做升序排列 pxNext; 指向链表下一个节点 pxPrevious; 指向链表前一个节点
xItemValue; 辅助值,用于帮助节点做升序排列 pxNext; 指向链表下一个节点 pxPrevious; 指向链表前一个节点

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

链表根节点初始化vListInitialise函数。完成如下功能:
    将链表索引指针指向最后一个节点; 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点; 将最后一个节点的 pxNext 和 pxPrevious 指针均指向节点自身,表示链表为空; 初始化链表节点计数器的值为 0,表示链表为空。
将链表索引指针指向最后一个节点; 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点; 将最后一个节点的 pxNext 和 pxPrevious 指针均指向节点自身,表示链表为空; 初始化链表节点计数器的值为 0,表示链表为空。

3、主要操作函数

3、主要操作函数

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

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

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

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

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

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

4、节点带参数宏函数。

4、节点带参数宏函数。

实时

实时

初始化节点的拥有者。

初始化节点的拥有者。

获取节点拥有者。

获取节点拥有者。

初始化节点排序辅助值。

初始化节点排序辅助值。

获取节点排序辅助值。

获取节点排序辅助值。

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

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

获取链表的入口节点。

获取链表的入口节点。

获取节点的下一个节点。

获取节点的下一个节点。

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

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

判断链表是否为空。

判断链表是否为空。

获取链表的节点数。

获取链表的节点数。

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

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

获得对应任务控制块。

获得对应任务控制块。

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

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

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

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

判断链表是否被初始化。

判断链表是否被初始化。
经验分享 程序员 微信小程序 职场和发展