0
点赞
收藏
分享

微信扫一扫

1262_FreeRTOS中的链表实现分析

全部学习汇总:​​GreyZhang/g_FreeRTOS: learning notes about FreeRTOS. (github.com)​​

链表一般是各种嵌入式OS中的调度所用的基础结构,之前看其他的调度器的时候是看过的。印象比较深的其实还是linux而不是专用于嵌入式OS的链表。Linux也是我第一次尝试尽量从代码的级别去解读一个OS的内核代码。今天看一下FreeRTOS中的链表的实现。

1262_FreeRTOS中的链表实现分析_数据结构

这是链表中定义的一个链表元素的结构,前后两个宏在很多地方都有类似的处理,主要是用于数据的完整性检查。中间基础的信息有前驱以及后继的指针,这样构成链表元素的链接的基本功能。除了这些基础的信息外,这里面还增加了一个xItemValue,这个是用于给链表中的元素进行排序的依据。后面看到链表的尾结点的时候,这个数值是一个特殊数值,也是为了排序考虑。pvOwner在基础的链表操作中基本上没有,后面单独做分析。pvContainer其实用于指明元素归属的链表,这个很重要。由于这个元素的存在,链表元素增加的时候其实不需要指明链表。

1262_FreeRTOS中的链表实现分析_FreeRTOS_02

这个更加接近于纯粹的链表的结构结点信息,相比普通的链表来说少了一些成员信息。主要的作用不是作为通用元素使用,而是用来构成链表的尾结点。

1262_FreeRTOS中的链表实现分析_链表_03

这个是一个链表信息的基本结构,主要包含里面的元素数目、尾结点以及用于遍历链表用的一个信息。一般,这个是指向最后的一个通用元素。

1262_FreeRTOS中的链表实现分析_结点_04

链表的初始化,可以集中看前面的几个操作。最后两个操作的主要目的是数据一致性的检查,在整个系统设计的时候一个比较通用的做法。在链表数据对象生成的时候,其实尾结点在存储中的信息也就生成了。尾结点给了一个特殊值,前面提到的,其实是一个极大值,这样就可以保证链表元素排序时候的尾结点有固定的相对位置。

目前的链表元素是空,因此里面的元素数目设置为0。此时pxIndex,这个用于做数组遍历的指针暂时指向链表的尾结点。仅有的元素是一个非通用的元素,也就是尾结点,前驱和后继都是自己。这样,一个链表的初始化就结束了。

1262_FreeRTOS中的链表实现分析_结点_05

初始化一个链表元素,操作比较简单:不让他属于任何链表。如果开启了数据一致性检查,那么最后两条代码生效执行数据一致性的检查。而这样的检查其实也是二进制0101不断交错的检查。

1262_FreeRTOS中的链表实现分析_FreeRTOS_06

上面这段代码实现的是向链表的结尾插入一个元素。100、101两行实现的还是数据一致性的检查,这里暂时不去看。

pxIndex指向的是链表中的最后一个节点,这里的最后一个节点不是数据结构中的最后。而是链表访问方法最后能够访问到的一个。具体的说明结合这个函数的声明部分的注释可以看得出,而相关的应用可能还得结合其他的代码来分析理解。而这里插入的位置点,其实是pxIndex的前驱。

1262_FreeRTOS中的链表实现分析_链表_07

这是上面的结果的声明描述。

1262_FreeRTOS中的链表实现分析_链表_08

而这里面用到的一个接口信息是这个,主要的功能其实是把pxIndex指向下一个有效的元素。

1262_FreeRTOS中的链表实现分析_结点_09

1262_FreeRTOS中的链表实现分析_嵌入式_10

这是一个普通的元素插入操作。需要注意的是,元素插入链表之前需要先对其归属的链表进行相应的赋值操作,否则是不能成功的。

代码中也进行了数据完整性的检查,只是我现在的工程中这个功能没有启用。

接着,获取了新元素信息中的排序所用数值。如果数值给出来的是一个极大值,那么插入点就很容易确认了,就是尾结点之前。否则,从链表的第一个元素开始遍历查询,找到一个插入点。最后,处理前驱以及后继等信息后,链表的元素数目标注增加一个数值。

1262_FreeRTOS中的链表实现分析_链表_11

连标记元素的移除特别简单,因为前驱后继信息都已经存在。直接做一个新的链接关系,整个链表信息就结束了。但是,由于链表元素数据结构以及链表中的成员结构的特殊性,最后要处理链表元素的归属关系的解耦以及减少一个元素数目信息。

以上就是FreeRTOS的链表处理信息,看上去不是很复杂。


举报

相关推荐

FreeRTOS链表相关详解

0 条评论