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

前面简单分析了FreeRTOS中的链表结构以及处理,OS的一个基础的操作信息基本就有了。这一次看看比较常用的任务创建接口的实现,同时找一下跟之前看过的信息是否有什么关联性。

1263_FreeRTOS的动态任务创建分析_嵌入式

这是FreeRTOS中动态创建一个task的接口调用。顺便说一下:不得不说,Source Insight在代码语义分析上的功能的确是非常强的。虽然,作为编辑器本身的编辑效率不是最高的,但是如果自己的银子够或者公司给掏钱,用这个工具看代码绝对是事半功倍。

1263_FreeRTOS的动态任务创建分析_FreeRTOS_02

1263_FreeRTOS的动态任务创建分析_堆栈_03

1263_FreeRTOS的动态任务创建分析_嵌入式_04

在看这个接口之前,需要先了解一下这个任务控制块的数据结构。这里面涉及到的信息,有可选和必选之分。结合之前接触过的内容看,主要是包括链表信息(这个链表应该是任务链表)、任务优先级信息、堆栈信息、动态还是静态创建信息等。这里面包含的信息不少,在任务创建的时候会是一部分RAM的资源开销。接下来,针对当前我使用的工程的情况做一个测试看看RAM的占用情况。

1263_FreeRTOS的动态任务创建分析_堆栈_05

直接通过sizeof看了一下TCB_t的大小,现在是占用了84个字节,这也是比较多的一个RAM消耗了。伴随着OS功能的增加,可能相关的消耗还会有更多的增加。

1263_FreeRTOS的动态任务创建分析_任务控制块_06

这部分其实可以直接过,只需要关注几个参数以及前面的两个局部变量信息。针对现在使用的MCU以及堆栈管理,这里这部分代码其实是无效的。整个任务创建有2个大的分支,当前的工程中应该走另一个分支。

1263_FreeRTOS的动态任务创建分析_FreeRTOS_07

这一部分主要是为任务堆栈以及任务控制块从FreeRTOS的heap中申请存储。

1263_FreeRTOS的动态任务创建分析_FreeRTOS_08

如果堆栈以及任务控制块的存储申请都成功,说明任务创建是成功的。这时候,标注一下任务是动态创建的允许后续删除,同时对任务进行初始化并把任务加入到就绪链表。如果前面的堆栈以及任务控制块的存储申请失败了,那么任务创建失败,这里需要返回一个创建失败的返回值提示存储分配失败。

1263_FreeRTOS的动态任务创建分析_链表_09

这样,任务创建的函数就分析完成了。通过上面的信息看,其实这个任务创建的主要工作是在做存储的分配管理。因此,任务创建的时候传递进去的6个参数中只有usStackDepth参数了前面分析的代码的过程,这个参数决定了堆栈的分配大小。而其他的参数,都在任务的初始化以及就绪链表的处理中使用了。

按照之前linux的内核分析经验,整个的设计的核心点在于任务调度以及涉及到的链表、上下文的处理。看起来,目前分析的这部分内容还没有到这样的层次。关于FreeRTOS内核代码的分析还要进一步去探索。