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

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

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

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

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

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

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

List_t pxReadyTaskLists[configMAX_PRIORITIES]

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

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

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

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

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
Lester_11015 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元5 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133975 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315205 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2