数据结构论坛

注册

 

发新话题 回复该主题

FreeRTOS源码解析一链表 [复制链接]

1#
北京哪家医院看皮肤病白癜风最好 https://wapjbk.39.net/yiyuanzaixian/bjzkbdfyy/bdf/

##热爱记录、钟爱分享、酷爱生活

一、前言

本期文章讲解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。

获得对应任务控制块。

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

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

判断链表是否被初始化。

单选

FreeRTOS源码讲解是否有用

有无打开百度APP进行投票

「嵌入式文件系统(一)」文件系统概念和实操环境搭建

「嵌入式文件系统(二)」ext2

「嵌入式文件系统(三)」ext3和ext4

「嵌入式文件系统(四)」jffs2和cramfs

#王力宏前妻李靓蕾发文#

分享 转发
TOP
发新话题 回复该主题