全部学习汇总: ​​GitHub - GreyZhang/g_FreeRTOS: learning notes about FreeRTOS.​

1272_FreeRTOS中的几个任务相关的链表_数据结构

上面的一部分链表相关的定义应该是FreeRTOS任务调度相关的几个链表。先看一下种类或者类别,大概有:任务就绪链表、delayed任务链表1、delayed恩物链表2、挂起就绪链表。这里,delayed任务链表暂且直接照搬了英文名字,暂时还是不是很明确该用一个什么样的描述来说明更加贴切。

接下来,直接逐个在工程中大概看看各个链表可能涉及到的操作概念。

首先看一下pxReadyTasksLists,这个其实梳理的时候比较容易梳理清楚,因为只有在task.c中存在,因此应该是一个纯粹的任务的概念。先理解这些简单的概念碎片,后面应该可以逐步构建出来一个完整的表述。

1272_FreeRTOS中的几个任务相关的链表_嵌入式_02

1272_FreeRTOS中的几个任务相关的链表_FreeRTOS_03

结合两部分代码,以上第一部分代码实现的功能:找出现在ready任务中最高优先级的任务,TCB指针信息传递给pxCurrentTCB,执行额记下来的处理。而当前运行任务的最高优先级也随之更新。

1272_FreeRTOS中的几个任务相关的链表_FreeRTOS_04

这是第二部分调用代码,选择最高优先级的任务,跟上面实现的核心功能大同小异。但是,这次处理的主要参考依据是任务优先级。

1272_FreeRTOS中的几个任务相关的链表_数据结构_05

在查找就绪的任务中,什么是最高优先级的时候,这里使用了计算前导零的技巧。可能,这是为什么很多IDE的配置中提示,如果要想高效的调度器限制32个任务的原因。

1272_FreeRTOS中的几个任务相关的链表_优先级_06

1272_FreeRTOS中的几个任务相关的链表_数据结构_07

这是第三部分的引用代码,其实这里处理的就是一个变量uxTopReadyPriority,而这个变量的意义则是标记哪一个优先级的任务有就绪的。这个变量也在第二部分的代码中被用到了。

1272_FreeRTOS中的几个任务相关的链表_链表_08

1272_FreeRTOS中的几个任务相关的链表_数据结构_09

这是第四部分的引用代码,其中第二部分代码是第252行代码的实现。先看这部分代码的功能:这个是根据当前处理的就绪任务的优先级来更新OS追踪的整个系统中就绪任务的最高优先级。这个优先级在一个变量之中存储,也是前面第一部分代码中的循环开始参考的优先级。

关于剩下的代码其实就容易了,根据优先级把任务加入到相应优先级任务就绪链表之中。

1272_FreeRTOS中的几个任务相关的链表_嵌入式_10

这是第五部分代码,涉及到的内容是任务优先级的设定。这部分相对复杂一些,后面单独针对这个接口进行分析。

1272_FreeRTOS中的几个任务相关的链表_FreeRTOS_11

第六部分用到的代码是获取期望的空闲时间,看上去也是有一点复杂度的接口。后面专门做分析。

1272_FreeRTOS中的几个任务相关的链表_优先级_12

这是第七部分的代码,主要是获取任务的句柄。

1272_FreeRTOS中的几个任务相关的链表_数据结构_13

第八部分的调度点,在任务获取系统状态的时候用到。

1272_FreeRTOS中的几个任务相关的链表_嵌入式_14

这是第九部分的调度代码,这个是之前看过的,在TickHandler当中。这里实现的功能是,如果在抢占模式下当相同优先级的任务有多个存在的时候,执行时间切片。

1272_FreeRTOS中的几个任务相关的链表_嵌入式_15

这个是第10部分调度代码,涉及到的功能从注释看应该是idle task的部分。

1272_FreeRTOS中的几个任务相关的链表_嵌入式_16

这是第11部分,之前这部分代码其实是分析过的。但是在这个版本中相关的注释没保存住。其实这里就是常用的链表对象的初始化处理。

还有几个在互斥信号使用的时候才使能,暂且不去分析了。

1272_FreeRTOS中的几个任务相关的链表_FreeRTOS_17

在看一下delayed task链表,其实两个链表的本质都是缓冲区。真正与delayed task相关的部分还是关于有效对象的处理。

1272_FreeRTOS中的几个任务相关的链表_链表_18

类似的看一下挂起任务的引用部分,主要涉及到的功能就是任务的挂起、恢复。而这个又有好几个分类,比如处理的任务是一个还是全部,另外就是是在ISR中还是不在等。

整体看下来,这里的几个链表在整个系统中的引用点也不是很多。把相关的没分析的设计的软件接口全都仔细分析一下应该很容易理顺清楚。