×

FreeRTOS学习之旅(四) -----链表和节点

zxjy辉 zxjy辉 发表于2022-08-24 10:28:02 浏览311 评论0

抢沙发发表评论

风景.jpg

创建链表和节点 参考文档:FreeRTOS内核开发与应用实战指南(野火)

  1. 链表的概念:C语言中的一种数据结构

    1. 优点:可以动态的分配内存,将离散的数据链接到一起,提高了内存的利用率,还可以方便的插入和删除节点

    2. 缺点:查找起来,比较耗时,都是从“起始节点”开始遍历,直到找到对应的数据

  2. 链表的分类

    1. 单向链表:每个节点中必须有一个指向下一个节点的指针(地址),形成一个闭环,当然每个节点除此之外,也可以带有自己的私有信息,因为每一个节点,就是一个结构体,这个结构体中,可以包含着许多信息。

      image.png

    2. 双向链表:与单项链表相比,多了一个指向前一个节点的指针

      image.png

  3. FreeRTOS中的链表

    1. FreeRTOS中大量采用了链表,并且将任务“挂载”到链表上,方便任务的增删

      1. 如何将任务添加链表:将一个节点内嵌到到任务(可以理解为一个结构体,一个数据的集合)中,然后通过这个节点就链接到一个链表中,因为是很多个的节点构成了一个链表,链表就像是一个节点的集合;通俗的说就是:“任务”通过节点将自己挂在了链表上。

      2. 在源码中的链表节点的结构体定义如下

        image.png

        这个结构体中的(4)就是表示这个节点是属于哪一个任务控制块(任务)的,(5)则是表示包含在那个链表中的;在任务控制块这个结构体中,就包含了这个一个链表节点。

        image.png

        在FreeRTOS中ListItem_t就是代表了链表节点的结构体;List_t这个代表了链表根节点的结构体


      3. 链表是一个圈,首尾相连,所以需要定一个根节点,可以理解为第一个节点,也可以理解为最后一个节点

        在源码中的定义如下

        image.png

        image.png

  4. 创建创建一个链表步骤

    1. 创建根节点和节点


      image.png

    2. 初始化根节点:vListInitialise


      image.png

    3. 初始化节点:vListInitialiseItem

      image.png

    4. 将节点加入到根节点中或则理解为根节点之后,以为根节点就是链表的开端

      加入的方法有两种,一种是一个接一个的,一个是按照升序排列

          1. 一个接一个:

            image.png

          2. 升序排列:

            image.png


#好好学习!

群贤毕至

访客