嵌入式开发学习日志47——任务创建与就绪列表

任务的栈、函数实体以及控制块需要联系在一起才能由系统进行统一的调度,而任务创建函数xTaskCreateStatic函数就是来实现这一功能的。

在该函数中,会涉及pxTaskCode(任务的函数名称)、pcName(任务名称)、ulStackDepth(任务栈大小)、pvParameters(任务形参)、uxPriority(任务优先级)等的定义,具体在创建时()内的参量要写什么还需要根据创建的形式来定。

任务创建总体来说有两种形式,一种是动态创建,一种是静态创建,

静态创建时,任务控制块和栈的内存需要自己进行定义,在任务删除时,这一部分内存是不会释放的。此时任务的函数、任务名称、堆栈大小、函数参数等上面提到的参数都需要定义。但是任务创建本身也是一个任务,为了防止被打断,可以进入临界区进行创建,这个后面会提到。

动态创建时,控制块和栈的内存都被系统事先分配好了,删除任务时这部分内存也会被释放。动态创建时的操作就比较简单了,只需要声明大小和指向控制块的指针即可,无需再定义控制块。

在创建完任务之后,我们需要将任务添加到就绪列表中,这样系统就知道任务已经就绪,可以进行调度了。其实就绪列表就是被定义为List_t类型的数组,而数组的大小由最大任务优先级的宏configMAX_PRIORITIES决定,具体代码如下:

List_t pxReadyTaskLists[configMAX_PRIORITIES]

当然,如果两个任务的优先级相同了怎么办?那么可以把这些任务插入到列表的同一条链表中。

那么如何将任务插入到列表中呢?

在任务的控制块中有一个xStateListItem的成员,将任务插入到就绪列表中,实际上就是将这个成员节点插入其中,就像两个齿轮,一个代表列表,一个代表任务的控制块,而xStateListItem就是齿轮上的卡槽,令两者顺利嵌合并且正常运作。

当然,想要让任务按照各自的顺序进行还需要系统调度器的参与,它的主要功能就是在就绪列表中选择一个最高优先级的任务并令其执行,实现任务间切换,不过这里就不多赘述。

相关推荐
酿情师7 小时前
yihan:一款面向连续网页学习的智能侧边栏插件
学习·学习方法·工具·学习工具
瞎某某Blinder8 小时前
DFT学习记录[6]基于 HES06的能带计算+有效质量计算
python·学习·程序人生·数据挖掘·云计算·学习方法
love在水一方9 小时前
VLN 入门学习计划 —— 基于 InternNav
学习
Wave84511 小时前
基于 STM32 + ESP8266 + W25Q64 的双核 OTA 底层架构总结
stm32·嵌入式硬件·架构
red_redemption12 小时前
自由学习记录(175)
学习
xiangw@GZ12 小时前
WiFi 全世代(WiFi1~WiFi7)技术规范与核心参数总结
嵌入式硬件
振南的单片机世界12 小时前
CPU时钟:频率越高跑越快,但物理极限在“拖后腿”
stm32·单片机·嵌入式硬件
nashane13 小时前
HarmonyOS 6学习:画中画(PiP)状态同步与场景化实战指南
学习·pip·harmonyos·harmonyos 5
_李小白13 小时前
【android opencv学习笔记】Day 8: remap(像素位置重映射)
android·opencv·学习
勤劳的进取家13 小时前
数据链路层基础
网络·学习·算法